JavaScript 系列之類型(一)

這是我參與8月更文挑戰的第1天,活動詳情查看:8月更文挑戰markdown

1、內置類型

1.1 基本類型

  • Boolean
  • String
  • Number
  • Null
  • Undefined
  • Symbol(ES6 新定義)

1.2 引用類型

  • Object
    • Function
    • Date
    • Array
    • 等等
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

2、類型轉換

2.1 轉 Boolean

在條件判斷時,除了 undefinednullfalseNaN''0-0 會轉爲 false,其餘全部值都轉爲 true,包括全部對象。post

2.2 對象轉基本類型

對象在轉換基本類型時,首先會檢查有無設置 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'
複製代碼

2.3 四則運算

  • -、*、/、% :一概轉換成數值後計算
  • +
    • 數字 + 字符串 = 字符串, 運算順序是從左到右
    • 數字 + 對象, 優先調用對象的 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
複製代碼

2.4 相等(==)

相等和不相等 —— 先轉換再比較lua

規則:url

  1. 一個是布爾,比較以前先轉換成數值 —— false0true1
  2. 一個是字符串,一個是數值 ,比較以前先將字符串轉成數值
  3. 一個是對象,另外一個不是,則調用對象的 valueof 方法,用獲得的基本類型值按照前面的規則進行比較。

比較時遵循:spa

  1. nullundefined 相等。
  2. 一個是 NaN,另外一個不管是什麼,相等操做符都返回 false;繁殖不相等操做符則返回 true
  3. 兩個都是對象,則比較是不是同一個對象。若是兩個操做數指向同一個對象,即指向同一個引用,則相等操做符返回 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
複製代碼

2.5 全等(===)

全等和不全等——僅比較而不轉換(除了在比較以前不轉換操做數外,全等和不全等與相等和不相等沒有什麼區別)設計

"55"===55 //false
null===undefined //false
NaN===NaN //false
undefined===undefined //true
null===null //true
複製代碼
相關文章
相關標籤/搜索