记录一些常见的坑
js中的6个假值
false, null, undefined, 0, NaN, ''
https://www.jb51.net/article/122992.htm
隐式类型转换规则
ToPrimitive对原始类型不发生转换处理,只针对引用类型(object)的,其目的是将引用类型(object)转换为非对象类型,也就是原始类型。
ToPrimitive 运算符接受一个值,和一个可选的 期望类型作参数。ToPrimitive 运算符将值转换为非对象类型,如果对象有能力被转换为不止一种原语类型,可以使用可选的 期望类型 来暗示那个类型
/**
* @obj 需要转换的对象
* @type 期望转换为的原始数据类型,可选
*/
ToPrimitive(obj,type)
type不同值的说明
type为string:
先调用obj的toString方法,如果为原始值,则return,否则第2步调用obj的valueOf方法,如果为原始值,则return,否则第3步抛出TypeError 异常
type为number:
调用obj的valueOf方法,如果为原始值,则返回,否则下第2步调用obj的toString方法,如果为原始值,则return,否则第3步抛出TypeError 异常
type参数为空)
该对象为Date,则type被设置为String 否则,type被设置为Number
为空时,date类型的先调用toString(),其他引用类型先调用valueOf()
总结
比较运算符中,两边都会转为number类型
+
运算时,若包含引用类型,则转为字符串类型+
,-
开头的一元运算法,会转为number类型,undefined会转为NaN
验证
// ### 含有引用类型
1+{} // "1[object Object]"
{}+1 // 1,前面的{}被当作空代码块,若为表达式,则转为[object Object]
1+[] // "1"
// ### 比较
[] == false // '' == false -> 0 == 0
[] == ![] // '' == false -> 0 == 0
false == undefined // 0 == NaN
// 特例
null == undefined //true
### +, -
+{} // NaN
-'123' // -123
+true // 1
对象的valueOf和toString
var obj = {
toString: function() {
return "a"
},
valueOf: function() {
return "b"
}
}
//先调用valueOf,若返回原始类型,则返回
//若只重写toString方法,则直接调用toString
console.log(1 + obj) //"1b"
Date对象的特别说明
var d = new Date()
console.log(d == d.toString()) // toString() == Sat Nov 16 2019 23:24:45 GMT+0800
console.log(d == d.valueOf) // valueOf() == 1573917885718
console.log(d - 1) // 1573917989664
测试
[] == ![] //true
NaN !== NaN //true
null == undefined //true
1 == true //true
2 == true //false
"2" == true //false
null > 0 //false
null < 0 //false
null == 0 //true
null >= 0 //true
true + 1 //2
undefined + 1 //NaN
let obj = {};
// 代码块
{} + 1 // 1
{ 1 + 1 } + 1 //1
// 表达式
obj + 1 //[object Object]1
{} + {} //chrome [object Object][object Object], fireFox NaN
[] + {} //[object Object]
[] + obj //[object Object]
+ [] //0
{} + [] //0
obj + [] [object Object]
[2,3] + [1,2] //"2312"
[2] + 1 //"21"
[2] + (-1) //"2-1"
[2] - 1 //1
[2,3] - 1 //NaN
{} - 1 //-1
1-{} //NaN