記錄一些常見的坑
js中的6個(gè)假值
false, null, undefined, 0, NaN, ''
https://www.jb51.net/article/122992.htm
隱式類型轉(zhuǎn)換規(guī)則
ToPrimitive對(duì)原始類型不發(fā)生轉(zhuǎn)換處理箱季,只針對(duì)引用類型(object)的,其目的是將引用類型(object)轉(zhuǎn)換為非對(duì)象類型拷况,也就是原始類型掘殴。
ToPrimitive 運(yùn)算符接受一個(gè)值,和一個(gè)可選的 期望類型作參數(shù)起意。ToPrimitive 運(yùn)算符將值轉(zhuǎn)換為非對(duì)象類型揽咕,如果對(duì)象有能力被轉(zhuǎn)換為不止一種原語類型套菜,可以使用可選的 期望類型 來暗示那個(gè)類型
/**
* @obj 需要轉(zhuǎn)換的對(duì)象
* @type 期望轉(zhuǎn)換為的原始數(shù)據(jù)類型,可選
*/
ToPrimitive(obj,type)
type不同值的說明
type為string:
先調(diào)用obj的toString方法逗爹,如果為原始值,則return挟冠,否則第2步調(diào)用obj的valueOf方法,如果為原始值知染,則return斑胜,否則第3步拋出TypeError 異常
type為number:
調(diào)用obj的valueOf方法止潘,如果為原始值,則返回凭戴,否則下第2步調(diào)用obj的toString方法,如果為原始值者冤,則return档痪,否則第3步拋出TypeError 異常
type參數(shù)為空)
該對(duì)象為Date,則type被設(shè)置為String 否則腐螟,type被設(shè)置為Number
為空時(shí),date類型的先調(diào)用toString(),其他引用類型先調(diào)用valueOf()
總結(jié)
比較運(yùn)算符中尼桶,兩邊都會(huì)轉(zhuǎn)為number類型
+
運(yùn)算時(shí)泵督,若包含引用類型庶喜,則轉(zhuǎn)為字符串類型+
,-
開頭的一元運(yùn)算法久窟,會(huì)轉(zhuǎn)為number類型,undefined會(huì)轉(zhuǎn)為NaN
驗(yàn)證
// ### 含有引用類型
1+{} // "1[object Object]"
{}+1 // 1入问,前面的{}被當(dāng)作空代碼塊芬失,若為表達(dá)式,則轉(zhuǎn)為[object Object]
1+[] // "1"
// ### 比較
[] == false // '' == false -> 0 == 0
[] == ![] // '' == false -> 0 == 0
false == undefined // 0 == NaN
// 特例
null == undefined //true
### +, -
+{} // NaN
-'123' // -123
+true // 1
對(duì)象的valueOf和toString
var obj = {
toString: function() {
return "a"
},
valueOf: function() {
return "b"
}
}
//先調(diào)用valueOf,若返回原始類型租漂,則返回
//若只重寫toString方法颊糜,則直接調(diào)用toString
console.log(1 + obj) //"1b"
Date對(duì)象的特別說明
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
// 表達(dá)式
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