Javascript 基礎之類型

內置類型

js 中內置類型一共 7 種(包括 es6),7 種內置類型可分爲兩大類型:基本類型引用類型(對象Object)javascript

1.基本類型包括:nullundefinedstringnumberbooleansymboljava

重點說下數字類型numberes6

  • js 中數字類型是浮點類型的,沒有 整型。浮點類型基於 IEEE 754 標準實現,在使用中會有 bug;
  • NaN 也屬於 number 類型,而且 NaN 不等於自身;

2.對象(Object)是引用類型,在使用過程當中會遇到 淺拷貝深拷貝 的問題。函數

const x = { name: 'x'};
const y = x;
y.name = 'y';
console.log(x.name); // y
複製代碼

typeof 應用

1.對於基本類型,除了 null 均可以顯示正確類型post

typeof x;        // 'undefined'
typeof '1';      // 'string'
typeof 1;        // 'number'
typeof true;     // 'boolean'
typeof Symbol(); // 'symbol'
複製代碼

typeof 1 也能夠寫成 typeof(1),其餘也是同樣。性能

2.對於對象,除了函數都顯示objectui

typeof [];          // 'object'
typeof {};          // 'object'
typeof console;     // 'object'
typeof console.log; // 'function'
複製代碼

3.說說 null,一個遺留 bug,明明是基本類型,但是就顯示 objectspa

typeof null ;   // 'object'
複製代碼

那爲何會出現這種狀況呢? js 最第一版本中,使用的是 32 位系統,爲了性能考慮使用低位存儲變量的類型信息,000 開頭表示對象,而 null 表示全零,因此將它錯判爲 object 了。雖然如今內部類型的判斷代碼變了,可是這個 bug 卻一直流傳下來。prototype

4.正確獲取變量類型可以使用 Object.prototype.toString.call(xx),得到相似 [object Type] 的字符串code

Object.prototype.toString.call(111)
複製代碼

類型轉換

1.轉Bollean

除了 undefinednullfalseNaN''0-0,其餘都爲 true,包括對象。

2.對象轉基本類型

對象轉基本類型時,會調用 valueOftoString 兩個方法,也能夠重寫 Symbol.toPrimitive (優先級最高)

let p = {
  valueOf(){
    return 0;
  },
  toString(){
    return '1';
  },
  [Symbol.toPrimitive] (){
    return 2;
  }
}
console.log(1 + p);  // 3
console.log('1' + p);  // 12
複製代碼

3.四則運算符

  • 只有加法運算符時,一方是字符串類型,就會把另外一方也轉爲字符串類型;
  • 其餘運算只要其中一方是數字,那麼另外一方就轉爲數字;
  • 加法運算符會觸發3鍾類型轉換:將值轉換爲原始值,轉換爲數字,轉換爲字符串。
console.log(1 + '1'); // 11
console.log(1 * '1'); // 1
console.log([1, 2] + [1, 2]); // '1, 21, 2'
// [1, 2].toString() => '1, 2' 
// [1, 2].toString() => '1, 2' 
// '1, 2' + '1, 2' => '1, 21, 2'
複製代碼

加號有個須要主要的表達式 'a' + + 'b'

console.log('a' + + 'b');   // aNaN
// + 'b' => NaN
複製代碼

4.== 操做符

比較運算 x == y,其中 xy 是值,產生 truefalse

(1).Type(x)Type(y) 相同,則

  • Type(x)undefined,返回 true;
  • Type(x)null,返回 true;
  • Type(x)number,則
    • xNaN,返回 falseNaN == NaN);
    • yNaN,返回 falseNaN == NaN);
    • xy 相等數值,返回 true;
    • x+0y-0,返回 true;
    • x-0y+0,返回 true;
  • Type(x)string,則當 xy 爲徹底相同的字符序列(長度相等且相同字符在相同位置)時返回 true,不然 false('11' == '21')。
  • Type(x)booleanxy 同爲 true 或同爲 false,返回true;

(2).xnullyundefined,返回 true,互換也是;

(3).若 Type(x)numberType(y)string,返回 comparison x = toNumber(y) 的結果,互換也是;

(4).Type(x)boolean,返回 toNumber(x) = y( 5 > 3 == 1),互換也是;

(5).Type(x)stringnumber,且 Type(y)object,返回 x = toPrimitive(y) 的結果,互換也是;

toPrimitive 對象轉基本類型

有個燒腦的例子:

console.log( [] == ![] ); // true
// 從右往左解析, [] => true => 取反 => false => [] = false
// 根據第(4)條,toNumber(false) => 0
// 根據第(5)條,toPrimitive([]) == 0 => [].toString() => ''
// 根據第(3)條,toNumber('') == 0 => 0 == 0
複製代碼

總結:對象-布爾(字符串)-數字

5.運算符

  • 若是是對象,經過 toPrimitive 轉爲對象;
  • 若是是字符串,經過 unicode 字符索引來比較;

下一篇: Javascript 基礎之原型和原型鏈

相關文章
相關標籤/搜索