最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

typeof 和 instanceof

2021-05-30 02:37 作者:刂C刂C刂  | 我要投稿

typeof :

typeof 運(yùn)算符,用于檢測(cè)數(shù)據(jù)類型。返回值為對(duì)應(yīng)數(shù)據(jù)類型的字符串。

語(yǔ)法:typeof operand 或 typeof(operand)


typeof 123? // number

typeof true? // boolean

typeof '123'? // string

typeof undefined? // undefined


typeof null? // object?


typeof [ ]? // object

typeof new Date()? // objec

typeof { }? // object


typeof function() { }? // function

typeof Array? // function

?

typeof Symbol()?? // Symbol

  1. 為什么 typeof null 返回 object ?

    js 在底層存儲(chǔ)變量的時(shí)候,會(huì)在變量的機(jī)器碼的低位1-3位存儲(chǔ)其類型信息。而 typeof 關(guān)鍵字檢測(cè)數(shù)據(jù)類型的原理就是通過檢測(cè)這1-3位機(jī)器碼實(shí)現(xiàn)檢測(cè)不同數(shù)據(jù)類型。 比如 object類型的數(shù)據(jù),對(duì)應(yīng)的機(jī)器碼就是:000

    ? 000:對(duì)象???? ? ? 1:整數(shù)???? ?? ? 010:浮點(diǎn)數(shù)? ? ????? 100:字符串??? ?? ? 110:布爾值

    ? undefined: -2^30????????? null:全零

  2. null 類型的數(shù)據(jù)存儲(chǔ)時(shí),對(duì)應(yīng)的機(jī)器碼是一串的 000000......000000

    所以typeof在檢測(cè) null 類型的數(shù)據(jù),會(huì)返回 object。這個(gè)JavaScript這門語(yǔ)言的一個(gè) 特點(diǎn)。

  3. typeof 檢測(cè)引用類型數(shù)據(jù)結(jié)構(gòu),都返回應(yīng)該object,但是為什么還會(huì)返回 function ?

    因?yàn)椋簍ypeof 在檢測(cè)出其為引用數(shù)據(jù)類型后,還會(huì)再檢測(cè)這個(gè)引用數(shù)據(jù)類型是否有實(shí)現(xiàn)[[call]]方法不是 則返回object , 則返回function。

  4. 極易混淆的一個(gè)點(diǎn):

var str1 = 'myStr';

var str2 = new String( 'myStr' );

typeof str1;? // string

typeof str2;? // object

這里記住一點(diǎn)就行:當(dāng)我們 new 一個(gè)構(gòu)造函數(shù)時(shí), 結(jié)果肯定是實(shí)例化了一個(gè)對(duì)象。所以其肯定是引用數(shù)據(jù)類型。接著我們只需要判斷這個(gè)引用數(shù)據(jù)類型是否實(shí)現(xiàn)[[call]]方法,不是 則返回object , 則返回function。



instanceof:

語(yǔ)法: 實(shí)例對(duì)象 instanceof? 類??? 屬于返回 true ,不屬于返回 false。

原理是:檢測(cè)構(gòu)造函數(shù)的?prototype?屬性是否出現(xiàn)在某個(gè)實(shí)例對(duì)象的原型鏈上。返回值為布爾值。

利用這一點(diǎn),instanceof? 也可以用于檢測(cè)數(shù)據(jù)類型。

缺點(diǎn)1:檢測(cè)的實(shí)例必須是對(duì)象數(shù)據(jù)類型,基本數(shù)據(jù)類型(Number String Boolean null undefined Symbol)無法通過 instanceof 檢測(cè)的。

缺點(diǎn)2:只要構(gòu)造函數(shù)在這個(gè)被檢測(cè)的實(shí)例的原型鏈上存在,就都返回 true。 所以即使是檢測(cè)對(duì)象數(shù)據(jù)類型, instanceof 也是不準(zhǔn)確的。

let reg = /^$/;

let str1 = new String(123);

let str2 = 'abc';

let num = 100;

console.log(reg instanceof RegExp);?? // true?? 字面量創(chuàng)建的正則也還是對(duì)象
console.log(str1 instanceof String); ?? // true?
console.log(str2? instanceof String);?? // false?? 字面量創(chuàng)建出的基本數(shù)據(jù)類型無法檢測(cè)
console.log(num instanceof Number);?? // false


console.log([]?instanceof?Array);?? // true

console.log(?[]?instanceof?Object);? // true

?



檢測(cè)引用類型更好的方法是使用: Object.prototype.toString() 我們先討論 toString() 這個(gè)方法,對(duì)象的 toString() 方法,如果在自定義對(duì)象中未被覆蓋,toString() 返回?"[object?type]"。這里的 type 指 對(duì)應(yīng)的類型。

但是 Boolean、String、Number、Function、Array、Date、RegExp的原型對(duì)象上也 都定義了各自的 toString() 方法。它們會(huì)覆蓋Object原型上的 toString()。

console.log({}.toString());?//?'[object?Object]'

// 會(huì)被覆蓋的原因在于:原型鏈查找的就近原則。

// 1. 'abc' 是個(gè)原始值,是基本數(shù)據(jù)類型。

// 2. 我們要對(duì)他使用方法,就會(huì)發(fā)生 包裝類 。

// 3. 而包裝類時(shí),是通過 new String 這個(gè)構(gòu)造函數(shù)創(chuàng)建實(shí)例的。

// 4. 當(dāng)我們調(diào)用 toString() 這個(gè)方法時(shí),這個(gè)新生成的實(shí)例上并沒有這個(gè)方法,所以會(huì)去它的原型上尋找。

// 5. 而我們前面說過,String.prototype 是有自己預(yù)定義的 toSting() 方法的。

console.log(('abc').toString());?//?'abc'

console.log((100).toString());?//?'100'

console.log(true.toString());?//?'true'

console.log([1,2,3].toString());??//?'1,2,3'

console.log(function(){}.toString());?//?'function(){}'

console.log(new Date().toString());??// 當(dāng)前時(shí)間

console.log(/1231/g.toString());? // '/1231/g'


所以我們可以通過直接使用 Object.prototype.toString() 來判斷類型,這個(gè)方法執(zhí)行時(shí)會(huì)把內(nèi)部 this 的所屬類信息輸出。

Object.prototype.toString() 方法執(zhí)行的時(shí)候,方法中的 this 是誰,就會(huì)檢測(cè)誰的類型。所以需要使用 Function.prototype.call() 來改變Object.prototype.toString()this,使之變?yōu)槲覀円獧z測(cè)的數(shù)據(jù)。

console.log(Object.prototype.toString.call(/123/));?? //? [object RegExp]

console.log(Object.prototype.toString.call(123));? //? [object Number]

console.log(Object.prototype.toString.call('abc')); ? //? [object String]

console.log(Object.prototype.toString.call([1,2,3]));? //? [object Array]


其實(shí)也可以像下面簡(jiǎn)寫,反正只要指向的Object原型對(duì)象上的 toString() 就行。

console.log({}.toString.call( new Data() ) );?? //? [object Date]


擴(kuò)展:Symbol.toStringTag

在調(diào)用 Object.prototype.toString() 方法時(shí),會(huì)去讀取這個(gè)標(biāo)簽并把它包含在自己的返回值里。

內(nèi)置的 JavaScript 對(duì)象類型能識(shí)別并返回特定的類型標(biāo)簽,是因?yàn)橐鏋樗鼈冊(cè)O(shè)置好了對(duì)應(yīng)的 Symbol.toStringTag?標(biāo)簽。

MDN



typeof 和 instanceof的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
乐亭县| 建昌县| 肥乡县| 博客| 岱山县| 丁青县| 仙游县| 耿马| 闻喜县| 桐乡市| 滨州市| 云龙县| 林芝县| 江城| 邵武市| 尚义县| 铜山县| 靖州| 万源市| 利川市| 蒙城县| 喀喇沁旗| 江达县| 久治县| 华坪县| 于都县| 安新县| 许昌县| 米易县| 泸溪县| 珠海市| 芜湖县| 柯坪县| 隆尧县| 荣成市| 太仆寺旗| 东乡县| 德昌县| 望奎县| 镇沅| 梅河口市|