Javascript 基礎(chǔ)之類型

Javascript 基礎(chǔ)之類型

內(nèi)置類型

js 中內(nèi)置類型一共 7 種(包括 es6),7 種內(nèi)置類型可分為兩大類型:基本類型引用類型(對(duì)象Object)

1.基本類型包括:null、undefinedstring、numberboolean、symbol

重點(diǎn)說(shuō)下數(shù)字類型number

  • js 中數(shù)字類型是浮點(diǎn)類型的,沒(méi)有 整型。浮點(diǎn)類型基于 IEEE 754 標(biāo)準(zhǔn)實(shí)現(xiàn),在使用中會(huì)有 bug;
  • NaN 也屬于 number 類型,并且 NaN 不等于自身;

2.對(duì)象(Object)是引用類型,在使用過(guò)程中會(huì)遇到 淺拷貝深拷貝 的問(wèn)題。

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

typeof 應(yīng)用

1.對(duì)于基本類型,除了 null 都可以顯示正確類型

typeof x;        // 'undefined'
typeof '1';      // 'string'
typeof 1;        // 'number'
typeof true;     // 'boolean'
typeof Symbol(); // 'symbol'

typeof 1 也可以寫(xiě)成 typeof(1),其他也是一樣。

2.對(duì)于對(duì)象,除了函數(shù)都顯示object

typeof [];          // 'object'
typeof {};          // 'object'
typeof console;     // 'object'
typeof console.log; // 'function'

3.說(shuō)說(shuō) null,一個(gè)遺留 bug,明明是基本類型,可是就顯示 object

typeof null ;   // 'object'

那為什么會(huì)出現(xiàn)這種情況呢?
js 最初版本中,使用的是 32 位系統(tǒng),為了性能考慮使用低位存儲(chǔ)變量的類型信息,000 開(kāi)頭表示對(duì)象,而 null 表示全零,所以將它錯(cuò)判為 object 了。雖然現(xiàn)在內(nèi)部類型的判斷代碼變了,但是這個(gè) bug 卻一直流傳下來(lái)。

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

Object.prototype.toString.call(111)

類型轉(zhuǎn)換

1.轉(zhuǎn)Bollean

除了 undefined、nullfalse、NaN''、0-0,其他都為 true,包括對(duì)象。

2.對(duì)象轉(zhuǎn)基本類型

對(duì)象轉(zhuǎn)基本類型時(shí),會(huì)調(diào)用 valueOf、toString 兩個(gè)方法,也可以重寫(xiě) Symbol.toPrimitive (優(yōu)先級(jí)最高)

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

3.四則運(yùn)算符

  • 只有加法運(yùn)算符時(shí),一方是字符串類型,就會(huì)把另一方也轉(zhuǎn)為字符串類型;
  • 其他運(yùn)算只要其中一方是數(shù)字,那么另一方就轉(zhuǎn)為數(shù)字;
  • 加法運(yùn)算符會(huì)觸發(fā)3鐘類型轉(zhuǎn)換:將值轉(zhuǎn)換為原始值,轉(zhuǎn)換為數(shù)字,轉(zhuǎn)換為字符串。
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'

加號(hào)有個(gè)需要主要的表達(dá)式 'a' + + 'b'

console.log('a' + + 'b');   // aNaN
//  + 'b' => NaN

4.== 操作符

比較運(yùn)算 x == y,其中 xy 是值,產(chǎn)生 truefalse

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

  • Type(x)undefined,返回 true;
  • Type(x)null,返回 true;
  • Type(x)number,則
    • xNaN,返回 falseNaN == NaN);
    • yNaN,返回 falseNaN == NaN);
    • xy 相等數(shù)值,返回 true;
    • x+0,y-0,返回 true;
    • x-0y+0,返回 true;
  • Type(x)string,則當(dāng) xy 為完全相同的字符序列(長(zhǎng)度相等且相同字符在相同位置)時(shí)返回 true,否則 false('11' == '21')。
  • Type(x)boolean,xy 同為 true 或同為 false,返回true;

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

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

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

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

toPrimitive 對(duì)象轉(zhuǎn)基本類型

有個(gè)燒腦的例子:

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

總結(jié):對(duì)象-布爾(字符串)-數(shù)字

5.運(yùn)算符

  • 如果是對(duì)象,通過(guò) toPrimitive 轉(zhuǎn)為對(duì)象;
  • 如果是字符串,通過(guò) unicode 字符索引來(lái)比較;

下一篇: Javascript 基礎(chǔ)之原型和原型鏈

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容