深入理解JavaScript中的Undefined/Boolean/Number


4中常见的Undefined场景

  1. 变量已申明但未初始化
var a;
console.log(a);//undefined
  1. 获取对象的一个不存在的属性(自身属性和原型链继承属性)
var obj={
    name:"是希望"
};
console.log(obj.age);//undefined
  1. 函数没有明确的返回值时,却在其他地方使用了返回值
function foo(){}
console.log(foo());//undefined
  1. 函数定义时使用了多个形式参数(后文简称为形参),而在调用时传递的参数的数量少于形参数量
function foo(a,b,c){
    console.log(c);    
}
foo(1,2);//undefined undefined

常见Null出现场景

  1. 一般情况下,如果声明的变量是为了以后保存某个值,则应该在声明时就将其赋值为“null”
  2. JavaScript在获取DOM元素时,如果没有获取到指定的元素对象,就会返回“null”
  3. 在使用正则表达式进行捕获时,如果没有捕获结果,就会返回“null”

Undefined 与Null之间的异同

共同点

  1. UndefinedNull两种数据类型都只有一个字面值,分别是undefined和null
  2. Undefined类型和Null类型在转换为Boolean类型的值时,都会转换为false
  3. Undefined类型派生自Null类型,所以在非严格相等的情况下,两者是相等的

不同点

  1. null是JavaScript中的关键字,而undefined是JavaScript中的一个全局变量,即挂载在window对象上的一个变量,并不是关键字
  2. 在使用typeof运算符检测时,Undefined类型的值会返回“undefined”,而Null类型的值会返回object
  3. 在通过call调用toString()函数时,Undefined类型的值会返回“[objectUndefined]”,而Null类型的值会返回“[object Null]”
  4. 在需要进行字符串类型的转换时,null会转换为字符串"null",而undefined会转换为字符串"undefined"
  5. 在需要进行数值类型的转换时,undefined会转换为NaN,无法参与计算;null会转换为0,可以参与计算

Boolean类型

不同类型与Boolean类型的值的转换

(1)String类型转换为Boolean类型

  • 空字符串""或者''都会转换为false
  • 任何非空字符串都会转换为true包括只有空格的字符串" "

(2)Number类型转换为Boolean类型

  • 0和NaN会转换为false
  • 除了0NaN以外,都会转换为true,包括表示无穷大和无穷小的Infinity和-Infinity。

(3)Object类型转换为Boolean类型

  • objectnull时,会转换为false
    -如果object不为null,则都会转换为true,包括空对象{}。

(4)Function类型转换为Boolean类型

  • 任何Function类型的值都会转换为true

(5)Null类型转换为Boolean类型

  • Null类型只有一个null值,会转换为false。

(6)Undefined类型转换为Boolean类型

  • Undefined类型只有一个undefined值,会转换为false。

Number类型

八进制

如果想要用八进制表示一个数值,那么首位必须是0,其他位必须是0~7的八进制序列。如果后面位数的字面值大于7,则破坏了八进制数据表示规则,前面的0会被忽略,当作十进制数据处理

十六进制

如果想要用十六进制表示一个数值,那么前两位必须是0x,其他位必须是十六进制序列(0~9,a~f或者A~F)。如果超过了十六进制序列,则会抛出异常。

与Number类型数据转换规则

  1. Boolean ==> Number //true为1,false为0
  2. Null ==> Number// 0
  3. String ==> Number//123 1.23 0x23 " " NaN
  4. Undefined ==> Number//NaN
  5. Object ==> Number // valueOf() toString() NaN

Number类型转换函数

Number函数

  1. 如果是数字,会按照对应的进制数据格式,统一转换为十进制并返回
  2. 如果是Boolean类型的值,true将返回为1,false将返回为0
  3. 如果值为null,则返回“0”
  4. 如果值为undefined,则返回“NaN”

注意:如果值为字符串类型,则有以下处理情况

  如果该字符串只包含数字,则会直接转换成十进制数;如果数字前面有0,则会直接忽略这个0
   如果字符串是有效的浮点数形式,则会直接转换成对应的浮点数,前置的多个重复的0会被清空,只保留一个
   如果字符串是有效的十六进制形式,则会转换为对应的十进制数值
  如果字符串是有效的八进制形式,直接按照十进制转换并输出,因为前置的0会被直接忽略
   如果字符串为空,即字符串不包含任何字符,或为连续多个空格,则会转换为0
  如果字符串包含了任何不是以上5种情况的其他格式内容,则会返回NaN
   如果值为对象类型,则会先调用对象的valueOf()函数 获取返回值,并将返回值按照上述步骤重新判断能否转换为Number类型。如果都不满足,则会调用对象的toString()函数获取返回值,并将返回值重新按照步骤判断能否转换成Number类型。如果也不满足,则返回NaN
   如果toString()函数和valueOf()函数返回的都是对象类型而无法转换成基本数据类型,则会抛出类型转换的异常


parseInt()函数

parseInt()函数用于解析一个字符串,并返回指定的基数对应的整数值
语法格式:


parselint(string,radix)


1.如果遇到传入的参数是非字符串类型的情况,则需要将其优先转换成字符串类型,即使传入的是整型数据


parseInt('0x12',16) //直接将字符串"0x12"转换为十六进制数,得到的结果为1×16+2=18
parseInt(0x12,16) //会先转换成十进制数18,然后转换成字符串"18",再将字符串"18"转换成十六进制数,得到的结果为1×16+8=24


2.parseInt()函数在做转换时,对于传入的字符串会采用数据前置匹配的原则


从字符串的第一个字符开始进行匹配,如果处于radix指定范围之内,继续匹配,若不在radix指定范围内,则将满足范围内的字符转换为整数

parseInt('fg456',16) //由于g不在16进制内,所以只匹配到f,则结果为15

注意:

  • 若字符串以0x开头,16进制和10进制存在差异。16进制会匹配后面的字符串,而10进制直接返回0
  • 若传入的是字符串,则不执行算术运算,将算术运算符看做字符
  • 若传入的是算术表达式,则进行相应的算术运算,在进行进制转化。

3.处理的数据中包含字符e时,不同进制数的处理结果有很大不同


  当传入的参数本身就是Number类型时,会将e按照科学计数法计算后转换成字符串,然后按照对应的基数转换得到最终的结果。
  如果传入的字符串中直接包含e,那么并不会按照科学计数法处理,而是会判断字符e是否处在可处理的进制范围内,如果不在则直接忽略,如果在则转换成对应的进制数。


4.如果传入的值是浮点型数,则会忽略小数点及后面的数,直接取整。


parseInt('6.01',10) //6

parseInt('6.99',10) // 6


5.map()函数与parseInt()函数的坑


在map()函数中使用parseInt()函数时需要注意,不能直接将parseInt()函数作为map()函数的参数,而是需要在map()函数的回调函数中使用,并尽量指定基数

var arr = ['1','2','3','4'] ;
var result = arr.map(function(val){
return parseInt(val,10);
});
console.log(result);//[1,2,3,4]

如果不在map()函数的回调函数中使用会发什么什么神奇的事情?
直接调用的结果就是:[1, NaN, NaN, NaN]
Why?
因为parseInt()函数接收的第二个参数实际为数组的索引值
以下为调用情况:
parseInt('1',0) //任何整数以0为基数取整时,都会返回本身
parseInt('2',1) //parseInt()函数对应的基数只能为2~36 所以返回NaN
parseInt('3',2) //二进制时只有0和1,3超出了二进制的表示范围,无法转换
parseInt('4',3) //4无法用三进制的数据表示
……


parseFloat()函数

parseFloat()函数用于解析一个字符串,返回对应的浮点数。如果给定值不能转换为数值,则会返回NaN


  • 正负号必须出现在字符的第一位,而且不能连续出现
  • 字符串前面的空白符会直接忽略,如果第一个字符就无法解析,则会直接返回“NaN”
  • 对于字符串中出现的合法科学运算符e,进行运算处理后会转换成浮点型数
  • 对于小数点,只能正确匹配第一个,第二个小数点是无效的,它后面的字符也都将被忽略

举例:
parseFloat('123F') //123
parseFloat('0xA') //0
parseFloat('123') //123
parseFloat('123.2.1') //123.2
parseFloat('01.123') //1.123


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是希望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值