国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

zollero / 2976人閱讀

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

原文鏈接我的blog。

前幾日看到一個比較熟悉的面試題,判斷一個變量是不是數(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)用時,會進(jìn)行如下步驟:

如果 thisundefined ,返回 [object Undefined]

如果 thisnull , 返回 [object Null]

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

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

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

[[Class]]

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

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

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

在JavaScript代碼里,唯一可以訪問該屬性的方法就是通過 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ù),來獲取任意變量的[[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 時,會進(jìn)行如下步驟:

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

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

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

isArrayIsArray(O)

ReturnIfAbrupt(isArray) (如果 isArray 不是一個正常值,比如拋出一個錯誤,中斷執(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 是一個對象,并且具有 @@toStringTag 屬性時,返回 O[Symbol.toStringTag] );

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

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

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

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

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 對應(yīng)于與對象相關(guān)聯(lián)并由各種ECMAScript規(guī)范算法使用的內(nèi)部狀態(tài),它們沒有對象屬性,也不能被繼承,根據(jù)具體的 Internal slot 規(guī)范,這種狀態(tài)可以由任何ECMAScript語言類型或特定ECMAScript規(guī)范類型值的值組成。

此外,通過對 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)步驟來說, 只是移除了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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/82969.html

相關(guān)文章

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

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

    shery 評論0 收藏0
  • 深入理解 Javascript 之 對象

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

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

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

    huangjinnan 評論0 收藏0
  • 讀 arale 源碼之 class 篇

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

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

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

    mikyou 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<