文章目录
4中常见的Undefined场景
- 变量已申明但未初始化
var a;
console.log(a);//undefined
- 获取对象的一个不存在的属性(自身属性和原型链继承属性)
var obj={
name:"是希望"
};
console.log(obj.age);//undefined
- 函数没有明确的返回值时,却在其他地方使用了返回值
function foo(){}
console.log(foo());//undefined
- 函数定义时使用了多个形式参数(后文简称为形参),而在调用时传递的参数的数量少于形参数量
function foo(a,b,c){
console.log(c);
}
foo(1,2);//undefined undefined
常见Null出现场景
- 一般情况下,如果声明的变量是为了以后保存某个值,则应该在声明时就将其赋值为“null”
- JavaScript在获取DOM元素时,如果没有获取到指定的元素对象,就会返回“null”
- 在使用正则表达式进行捕获时,如果没有捕获结果,就会返回“null”
Undefined 与Null之间的异同
共同点
Undefined
和Null
两种数据类型都只有一个字面值,分别是undefined和nullUndefined
类型和Null
类型在转换为Boolean类型的值时,都会转换为falseUndefined
类型派生自Null
类型,所以在非严格相等的情况下,两者是相等的
不同点
null
是JavaScript中的关键字,而undefined
是JavaScript中的一个全局变量,即挂载在window对象上的一个变量,并不是关键字- 在使用typeof运算符检测时,
Undefined
类型的值会返回“undefined”,而Null类型的值会返回object
- 在通过call调用toString()函数时,Undefined类型的值会返回“[
objectUndefined
]”,而Null类型的值会返回“[object Null
]” - 在需要进行字符串类型的转换时,
null
会转换为字符串"null",而undefined
会转换为字符串"undefined" - 在需要进行数值类型的转换时,undefined会转换为NaN,无法参与计算;null会转换为0,可以参与计算
Boolean类型
不同类型与Boolean类型的值的转换
(1)String类型转换为Boolean类型
- 空字符串
""
或者''
都会转换为false
。 - 任何
非空字符串
都会转换为true
,包括只有空格的字符串" "
(2)Number类型转换为Boolean类型
- 0和NaN会转换为
false
。 - 除了
0
和NaN
以外,都会转换为true
,包括表示无穷大和无穷小的Infinity和-Infinity。
(3)Object类型转换为Boolean类型
- 当
object
为null
时,会转换为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类型数据转换规则
Boolean
==> Number //true为1,false为0Null
==> Number// 0String
==> Number//123 1.23 0x23 " " NaNUndefined
==> Number//NaNObject
==> Number // valueOf() toString() NaN
Number类型转换函数
Number函数
- 如果是数字,会按照对应的进制数据格式,统一转换为十进制并返回
- 如果是
Boolean类型
的值,true将返回为1,false将返回为0
- 如果值为null,则返回
“0”
- 如果值为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