成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

談?wù)?Object.prototype.toString 。

zollero / 3040人閱讀

摘要:前幾日看到一個(gè)比較熟悉的面試題,判斷一個(gè)變量是不是數(shù)組以下幾種方法供參考這篇文章主要是談?wù)?。宿主?duì)象的內(nèi)部屬性的值可以是除了的任何字符串。注,本規(guī)范中除了通過(guò)見(jiàn)沒(méi)有提供任何手段使程序訪問(wèn)此值。

原文鏈接我的blog。

前幾日看到一個(gè)比較熟悉的面試題,判斷一個(gè)變量是不是數(shù)組?
以下幾種方法供參考:

var arr = [1, 2, 3]
Array.isArray(arr)
arr instanceof Array
arr.constructor === Array
Object.prototype.toString.call(arr) === "[object Array]"
...

這篇文章主要是談?wù)?Object.prototype.toString 。

ECMAScript 5

在ECMAScript 5中,Object.prototype.toString()被調(diào)用時(shí),會(huì)進(jìn)行如下步驟:

如果 thisundefined ,返回 [object Undefined] ;

如果 thisnull , 返回 [object Null] ;

O 為以 this 作為參數(shù)調(diào)用 ToObject 的結(jié)果;

classO 的內(nèi)部屬性 [[Class]] 的值;

返回三個(gè)字符串 "[object", class, 以及"]" 拼接而成的字符串。

[[Class]]

[[Class]]是一個(gè)內(nèi)部屬性,值為一個(gè)類型字符串,可以用來(lái)判斷值的類型。

有這么一段詳細(xì)的解釋:

本規(guī)范的每種內(nèi)置對(duì)象都定義了 [[Class]] 內(nèi)部屬性的值。宿主對(duì)象的 [[Class]] 內(nèi)部屬性的值可以是除了 "Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp", "String" 的任何字符串。[[Class]] 內(nèi)部屬性的值用于內(nèi)部區(qū)分對(duì)象的種類。注,本規(guī)范中除了通過(guò) Object.prototype.toString ( 見(jiàn) 15.2.4.2) 沒(méi)有提供任何手段使程序訪問(wèn)此值。

在JavaScript代碼里,唯一可以訪問(wèn)該屬性的方法就是通過(guò) Object.prototype.toString ,通常方法如下:

Object.prototype.toString.call(value)

舉例:

> Object.prototype.toString.call(null)
"[object Null]"

> Object.prototype.toString.call(undefined)
"[object Undefined]"

> Object.prototype.toString.call(Math)
"[object Math]"

> Object.prototype.toString.call({})
"[object Object]"

> Object.prototype.toString.call([])
"[object Array]"

因此,可以用下列函數(shù),來(lái)獲取任意變量的[[Class]]屬性:

function getClass (a) {
  const str = Object.prototype.toString.call(a)
  return /^[object (.*)]$/.exec(str)[1]
}

運(yùn)行即可得

> getClass(null)
"Null"

> getClass(undefined)
"Undefined"

> getClass(Math)
"Math"

> getClass({})
"Object"

> getClass([])
"Array"
ECMAScript 6

在ES6,調(diào)用 Object.prototype.toString 時(shí),會(huì)進(jìn)行如下步驟:

如果 thisundefined ,返回 "[object Undefined]" ;

如果 thisnull , 返回 "[object Null]" ;

O 為以 this 作為參數(shù)調(diào)用 ToObject 的結(jié)果;

isArrayIsArray(O) ;

ReturnIfAbrupt(isArray) (如果 isArray 不是一個(gè)正常值,比如拋出一個(gè)錯(cuò)誤,中斷執(zhí)行);

如果 isArraytrue , 令 builtinTag"Array" ;

else ,如果 O is an exotic String object , 令 builtinTag"String" ;

else ,如果 O 含有 [[ParameterMap]] internal slot, , 令 builtinTag"Arguments" ;

else ,如果 O 含有 [[Call]] internal method , 令 builtinTagFunction ;

else ,如果 O 含有 [[ErrorData]] internal slot , 令 builtinTagError

else ,如果 O 含有 [[BooleanData]] internal slot , 令 builtinTagBoolean ;

else ,如果 O 含有 [[NumberData]] internal slot , 令 builtinTagNumber ;

else ,如果 O 含有 [[DateValue]] internal slot , 令 builtinTagDate

else ,如果 O 含有 [[RegExpMatcher]] internal slot , 令 builtinTagRegExp ;

else , 令 builtinTagObject ;

tagGet(O, @@toStringTag) 的返回值( Get(O, @@toStringTag) 方法,既是在 O 是一個(gè)對(duì)象,并且具有 @@toStringTag 屬性時(shí),返回 O[Symbol.toStringTag] );

ReturnIfAbrupt(tag) ,如果 tag 是正常值,繼續(xù)執(zhí)行下一步;

如果 Type(tag) 不是一個(gè)字符串,let tag be builtinTag ;

返回由三個(gè)字符串 "[object", tag, and "]" 拼接而成的一個(gè)字符串。

在ES6里,之前的 [[Class]] 不再使用,取而代之的是一系列的 internal slot ,有一個(gè)比較完整的解釋:

Internal slots correspond to internal state that is associated with objects and used by various ECMAScript specification algorithms. Internal slots are not object properties and they are not inherited. Depending upon the specific internal slot specification, such state may consist of values of any ECMAScript language type or of specific ECMAScript specification type values

大概的意思是:Internal slots 對(duì)應(yīng)于與對(duì)象相關(guān)聯(lián)并由各種ECMAScript規(guī)范算法使用的內(nèi)部狀態(tài),它們沒(méi)有對(duì)象屬性,也不能被繼承,根據(jù)具體的 Internal slot 規(guī)范,這種狀態(tài)可以由任何ECMAScript語(yǔ)言類型或特定ECMAScript規(guī)范類型值的值組成。

此外,通過(guò)對(duì) Object.prototype.toString 在ES6的實(shí)現(xiàn)步驟分析,我們其實(shí)可以很容易改變 Object.prototype.toString.call 的結(jié)果,像下面一樣:

let obj = {}

Object.defineProperty(obj, Symbol.toStringTag, {
    get: function() {
        return "newClass"
    }
})

console.log(Object.prototype.toString.call(obj)) // "[object newClass]"
ECMAScript 7

ES7目前還是工作草案,到目前為止,就 Object.prototype.toString 的實(shí)現(xiàn)步驟來(lái)說(shuō), 只是移除了ES6其中的 ReturnIfAbrupt 。

參考

http://www.ecma-international...

http://www.adobe.com/devnet/a...

https://developer.mozilla.org...

http://www.ecma-international...

http://es6.ruanyifeng.com/#do...

https://tc39.github.io/ecma26...

完。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/82969.html

相關(guān)文章

  • 談?wù)?/em>javascript的Function中那些隱藏的屬性/方法:caller/callee/app

    摘要:在全局環(huán)境中調(diào)用函數(shù)是不會(huì)生成此屬性,因?yàn)椴环洗藢傩缘拇嬖谝饬x價(jià)值見(jiàn)上條。函數(shù)遞歸時(shí)用起來(lái)比用函數(shù)名調(diào)用函數(shù)更帶感方法這倆方法性質(zhì)一樣,只是用法稍有不同,因此放在一起來(lái)介紹。 javascript的Function中有不少不那么常用,又或者用了也是知其然而不知其所以然的屬性/方法,本文就來(lái)談?wù)勥@一系列屬性/方法:caller/callee/apply/call/bind。 call...

    shery 評(píng)論0 收藏0
  • 深入理解 Javascript 之 對(duì)象

    摘要:返回如下仔細(xì)分析下面的圖,將會(huì)加深你的理解和我們有一個(gè)類對(duì)象有一個(gè)屬性,其指向構(gòu)造器的原型是一個(gè)類構(gòu)造器是之后產(chǎn)生的。 擼js基礎(chǔ)之對(duì)象 圖例 showImg(https://segmentfault.com/img/remote/1460000015949904?w=768&h=448); 先談?wù)?ECMAScript 中的數(shù)據(jù)類型 ES6 之前 ECMAScript 中有 5 種...

    neroneroffy 評(píng)論0 收藏0
  • lodash源碼分析之獲取數(shù)據(jù)類型

    摘要:規(guī)范對(duì)類型的判斷進(jìn)行了細(xì)化,前步可以看成跟的作用一樣,獲取到數(shù)據(jù)的類型,但是第步調(diào)用了的方法,如果再看規(guī)范的描述,可以知道這個(gè)其實(shí)是對(duì)象中的屬性,如果這個(gè)屬性返回的是一個(gè)字符串,則采用這個(gè)返回值作為數(shù)據(jù)的類型,否則才采用。 所有的悲傷,總會(huì)留下一絲歡樂(lè)的線索,所有的遺憾,總會(huì)留下一處完美的角落,我在冰峰的深海,尋找希望的缺口,卻在驚醒時(shí),瞥見(jiàn)絕美的陽(yáng)光!——幾米 本文為讀 lodas...

    huangjinnan 評(píng)論0 收藏0
  • 讀 arale 源碼之 class 篇

    摘要:擁有了和方法的三個(gè)變種屬性這三個(gè)屬性會(huì)做特殊處理繼承的方法,只支持單繼承建立原型鏈來(lái)實(shí)現(xiàn)繼承強(qiáng)制改變構(gòu)造函數(shù)提供語(yǔ)法糖,來(lái)調(diào)用父類屬性混入屬性,可以混入多個(gè)類的屬性將參數(shù)變成數(shù)組無(wú)論參數(shù)是類,還是對(duì)象,都混入。 更新:讀 arale 源碼之 attribute 篇 arale 是阿里、開源社區(qū)明星人物--玉伯,開發(fā)的一套組件,代碼相當(dāng)優(yōu)美,大贊玉伯的開源精神,我是您的粉絲。 這里分享下...

    firim 評(píng)論0 收藏0
  • 掌握 Javascript 類型轉(zhuǎn)換:從規(guī)則開始

    摘要:首先,為了掌握好類型轉(zhuǎn)換,我們要理解一個(gè)重要的抽象操作為什么說(shuō)這是個(gè)抽象操作呢因?yàn)檫@是內(nèi)部才會(huì)使用的操作,我們不會(huì)顯示調(diào)用到?;疽?guī)則中的類型轉(zhuǎn)換總是返回基本類型值,如字符串?dāng)?shù)字和布爾值,不會(huì)返回對(duì)象和函數(shù)。 Javascript 里的類型轉(zhuǎn)換是一個(gè)你永遠(yuǎn)繞不開的話題,不管你是在面試中還是工作寫代碼,總會(huì)碰到這類問(wèn)題和各種的坑,所以不學(xué)好這個(gè)那是不行滴。關(guān)于類型轉(zhuǎn)換我也看過(guò)不少的書和各...

    mikyou 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<