這是我參與8月更文挑戰的第1天,活動詳情查看:8月更文挑戰markdown
let obj = {
a: 1,
b: [1, 2, 3],
};
let aa = obj.a;
let bb = obj.b;
aa = 2;
bb.push(4);
console.log(obj);
console.log(aa);
console.log(bb);
// {a: 1, b: [1, 2, 3, 4]}
// 2
// [1, 2, 3, 4]
複製代碼
雖然 obj 自己是個引用類型的變量(對象),可是內部的 a 和 b 一個是值類型一個是引用類型,aa 的賦值不會改變 obj.a,可是 bb 的操做卻會反映到 obj 對象上。app
JS 中這種設計的緣由是:按值傳遞的類型,複製一份存入棧內存,這類類型通常不佔用太多內存,並且按值傳遞保證了其訪問速度。按共享傳遞的類型,是複製其引用,而不是整個複製其值(C 語言中的指針),保證過大的對象等不會由於不停複製內容而形成內存的浪費。ide
在條件判斷時,除了 undefined
, null
, false
, NaN
, ''
, 0
, -0
會轉爲 false
,其餘全部值都轉爲 true
,包括全部對象。post
對象在轉換基本類型時,首先會檢查有無設置 Symbol.toPrimitive
(該方法優先級最高),而後調用 valueOf
,而後調用 toString
。三個方法均可以重寫。ui
let a = {
toString() {
return '1';
},
valueOf() {
return 0;
},
[Symbol.toPrimitive]() {
return 2;
}
}
console.log(1 + a) // => 3
console.log('1' + a) // => '12'
複製代碼
-、*、/、%
:一概轉換成數值後計算+
:
數字 + 字符串 = 字符串
, 運算順序是從左到右數字 + 對象
, 優先調用對象的 valueOf -> toString
數字 + boolean/null -> 數字
數字 + undefined -> NaN
1 + '1' // '11'
2 * '2' // 4
[1, 2] + [2, 1] // '1,22,1'
// [1, 2].toString() -> '1,2'
// [2, 1].toString() -> '2,1'
// '1,2' + '2,1' = '1,22,1'
'a' + + 'b' // -> "aNaN"
// 由於 + 'b' -> NaN
// 你也許在一些代碼中看到過 + '1' -> 1
+undefined // NaN
複製代碼
相等和不相等 —— 先轉換再比較lua
規則:url
false
轉 0
,true
轉 1
。valueof
方法,用獲得的基本類型值按照前面的規則進行比較。比較時遵循:spa
null
和 undefined
相等。NaN
,另外一個不管是什麼,相等操做符都返回 false
;繁殖不相等操做符則返回 true
。true
。不然返回 false
。null==undefined //true
"NaN"==NaN //false
5==NaN //false
NaN==NaN //false
NaN!=NaN //true
false==0 //true
true==1 //true
true==2 //false
undefined==0 //false
null==0 //false
"5"==5 //true
let a = { c: 1 }
let b = { c: 1 }
console.log(a == b) // false
let d = b
console.log(d == b) // true
複製代碼
全等和不全等——僅比較而不轉換(除了在比較以前不轉換操做數外,全等和不全等與相等和不相等沒有什麼區別)設計
"55"===55 //false
null===undefined //false
NaN===NaN //false
undefined===undefined //true
null===null //true
複製代碼