類型系統(tǒng)

2018-07-10 14:39 更新

javascript 類型系統(tǒng)可以分為標(biāo)準(zhǔn)類型和對(duì)象類型,進(jìn)一步標(biāo)準(zhǔn)類型又可以分為原始類型和引用類型,而對(duì)象類型又可以分為內(nèi)置對(duì)象類型、普通對(duì)象類型、自定義對(duì)象類型。

標(biāo)準(zhǔn)類型

標(biāo)準(zhǔn)類型共包括了6個(gè)分別是:

原始類型(值類型):

  • Undefined undefined
  • Null null
  • Boolean true
  • String 'hello'
  • Number 123

引用類型(對(duì)象類型):

  • Object
var obj = {};
<!-- 原始類型變量的包裝類型如下 -->
var bool = new Boolean(true);
var str = new String("hello");
var num = new Number(1);
var obj0 = new Object();

原始類型和引用類型的區(qū)別:

原始類型儲(chǔ)存在棧(Stack)中儲(chǔ)存變量的值,而引用類型在棧中保存的是所引用內(nèi)容儲(chǔ)存在堆(Heap)中的值。類似于指針的概念,引用類型并非儲(chǔ)存變量真實(shí)數(shù)值而是地址,所以對(duì)已引用類型的復(fù)制其實(shí)只是復(fù)制了相同的地址而非實(shí)際的變量值。

Undefined 值:undefined 出現(xiàn)場(chǎng)景:

  • 以聲明為賦值的變量 var obj;
  • 獲取對(duì)象不存在的屬性 var obj = {x: 0}; obj.y;
  • 無(wú)返回值函數(shù)的執(zhí)行結(jié)果 function f(){}; var obj = f();
  • 函數(shù)參數(shù)沒(méi)有傳入 function f(i){console.log(i)}; f();
  • void(expression)

Null 值:null 出現(xiàn)場(chǎng)景:

  • 獲取不存在的對(duì)象 document.getElementById('not-exist-element')

Boolean 值:true, false 出現(xiàn)場(chǎng)景:

  • 條件語(yǔ)句導(dǎo)致的系統(tǒng)執(zhí)行的隱式類型轉(zhuǎn)換 if(隱式轉(zhuǎn)換){}
  • 字面量或變量定義 var bool = true;

String 值:字符串 出現(xiàn)場(chǎng)景:

  • var str = 'Hello, world!';

Number 值:整型直接量,八進(jìn)制直接量(0-),十六進(jìn)制直接量(0x-),浮點(diǎn)型直接量 出現(xiàn)場(chǎng)景:

  • 1026
  • 3.14
  • 1.2e5
  • 0x10

Object 值:屬性集合 出現(xiàn)場(chǎng)景:

  • var obj = {name: 'Xinyang'};

變量轉(zhuǎn)換表

ValueBooleanNumberString
undefinedfalseNaN"undefined"
nullfalse0"null"
truetrue1"true"
falsefalse0"false"
''false0''
'123'true123'123'
'1a'trueNaN'1a'
0false0"0"
1true1"1"
InfinitytrueInfinity"Infinity"
NaNfalseNaN'NaN'
{}trueNaN"[object Object]"

類型識(shí)別

  • typeof
  • Object.prototype.toString
  • constructor
  • instanceof

typeof:

  • 可以是標(biāo)準(zhǔn)類型(Null 除外)
  • 不可識(shí)別具體的對(duì)象類型(Function 除外)

Object.prototype.toString:

  • 可是識(shí)別標(biāo)準(zhǔn)類型及內(nèi)置對(duì)象類型(例如,Object, Date, Array)
  • 不能識(shí)別自定義對(duì)象類型

constructor:

  • 可以識(shí)別標(biāo)準(zhǔn)類型(Undefined/Null 除外)
  • 可識(shí)別內(nèi)置對(duì)象類型
  • 可識(shí)別自定義對(duì)象類型
function getConstructiorName(obj) {
  return obj && obj.constructor && obj.constructor.toString().match(/function\s*([^(]*)/)[1];
}
getConstructiorName([]) === "Array"; // true

instanceof:

  • 不可判別原始類型
  • 可判別內(nèi)置對(duì)象類型
  • 可判別自定義對(duì)象類型



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)