日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

为什么toString方法可以用来区分数组和对象?

發(fā)布時間:2023/11/30 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么toString方法可以用来区分数组和对象? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  首先大家都應(yīng)該知道在javascript中只有是對象都存在toString方法,將調(diào)用該方法的值轉(zhuǎn)換為字符串返回,如下:

  

     var arr = [1, 2, 3];console.log(arr.toString()); //1,2,3

  但對象的toString方法和其他優(yōu)點(diǎn)不同,其返回的是類似 '[object class]'的字符串

一、在js中,要想判斷一個某個對象是屬于哪種內(nèi)置類型,最靠譜的方法就是通過Object.prototype.toString()方法

   

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

?

二、Object.prototype.toString()原理:

?

  ES3中關(guān)于Object.prototype.toString()方法的解釋

?

  15.2.4.2 Object.prototype.toString()

  在toString方法被調(diào)用時,會執(zhí)行下面的操作步驟:

    1. 獲取this對象的[[Class]]屬性的值.

    2. 計(jì)算出三個字符串"[object ", 第一步的操作結(jié)果Result(1), 以及 "]"連接后的新字符串.

    3. 返回第二步的操作結(jié)果Result(2).

 

  [[Class]]是一個內(nèi)部屬性,所有的對象(原生對象和宿主對象)都擁有該屬性.[[class]]為一個表明該對象類型的內(nèi)部屬性,其值類型為字符串。

所有內(nèi)置對象的[[Class]]屬性的值是由本規(guī)范定義的.所有宿主對象的[[Class]]屬性的值可以是任意值,甚至可以是內(nèi)置對象使用過的[[Class]]屬性的值.[[Class]]屬性的值可以用來判斷一個原生對象屬于哪種內(nèi)置類型.需要注意的是,除了通過Object.prototype.toString方法之外,本規(guī)范沒有提供任何其他方式來讓程序訪問該屬性的值(查看 15.2.4.2).

也就是說,把Object.prototype.toString方法返回的字符串,去掉前面固定的"[object "和后面固定的"]",就是內(nèi)部屬性[[class]]的值,也就達(dá)到了判斷對象類型的目的.jQuery中的工具方法$.type(),就是干這個的.

在ES3中,規(guī)范文檔并沒有總結(jié)出[[class]]內(nèi)部屬性一共有幾種,不過我們可以自己統(tǒng)計(jì)一下,原生對象的[[class]]內(nèi)部屬性的值一共有10種.分別是:"Array", "Boolean", "Date", "Error", "Function", "Math", "Number","Object", "RegExp", "String".

 

es5中關(guān)于Object.prototype.toString()方法的解釋

在ES5.1中,除了規(guī)范寫的更詳細(xì)一些以外,Object.prototype.toString方法和[[class]]內(nèi)部屬性的定義上也有一些變化,Object.prototype.toString方法的規(guī)范如下:

15.2.4.2?Object.prototype.toString ( )

toString方法被調(diào)用時,會執(zhí)行下面的操作步驟:

  • 如果this的值為undefined,則返回"[object Undefined]".
  • 如果this的值為null,則返回"[object Null]".
  • 讓O成為調(diào)用ToObject(this)的結(jié)果.
  • 讓class成為O的內(nèi)部屬性[[Class]]的值.
  • 返回三個字符串"[object ",?class, 以及?"]"連接后的新字符串.
  • 可以看出,比ES3多了1,2,3步.第1,2步屬于新規(guī)則,比較特殊,因?yàn)?#34;Undefined"和"Null"并不屬于[[class]]屬性的值,需要注意的是,這里和嚴(yán)格模式無關(guān)(大部分函數(shù)在嚴(yán)格模式下,this的值才會保持undefined或null,非嚴(yán)格模式下會自動成為全局對象).第3步并不算是新規(guī)則,因?yàn)樵贓S3的引擎中,也都會在這一步將三種原始值類型轉(zhuǎn)換成對應(yīng)的包裝對象,只是規(guī)范中沒寫出來.ES5中,[[Class]]屬性的解釋更加詳細(xì):

    所有內(nèi)置對象的[[Class]]屬性的值是由本規(guī)范定義的.所有宿主對象的[[Class]]屬性的值可以是除了"Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp", "String"之外的的任何字符串.[[Class]]內(nèi)部屬性是引擎內(nèi)部用來判斷一個對象屬于哪種類型的值的.需要注意的是,除了通過Object.prototype.toString方法之外,本規(guī)范沒有提供任何其他方式來讓程序訪問該屬性的值(查看 15.2.4.2).

    和ES3對比一下,第一個差別就是[[class]]內(nèi)部屬性的值多了兩種,成了12種,一種是arguments對象的[[class]]成了"Arguments",而不是以前的"Object",還有就是多個了全局對象JSON,它的[[class]]值為"JSON".第二個差別就是,宿主對象的[[class]]內(nèi)部屬性的值,不能和這12種值沖突,不過在支持ES3的瀏覽器中,貌似也沒有發(fā)現(xiàn)哪些宿主對象故意使用那10個值.

    ?參考文章:http://www.cnblogs.com/ziyunfei/archive/2012/11/05/2754156.html

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/Walker-lyl/p/5597641.html

    總結(jié)

    以上是生活随笔為你收集整理的为什么toString方法可以用来区分数组和对象?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。