為什么toString方法可以用來區分數組和對象?

  首先大家都應該知道在javascript中只有是對象都存在toString方法,將調用該方法的值轉換為字符串返回,如下:

  

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

  但對象的toString方法和其他優點不同,其返回的是類似 '[object class]'的字符串

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

   

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

?

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

?

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

?

  15.2.4.2 Object.prototype.toString()

  在toString方法被調用時,會執行下面的操作步驟:

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

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

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

 

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

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

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

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

 

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

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

15.2.4.2?Object.prototype.toString ( )

toString方法被調用時,會執行下面的操作步驟:

  1. 如果this的值為undefined,則返回"[object Undefined]".
  2. 如果this的值為null,則返回"[object Null]".
  3. O成為調用ToObject(this)的結果.
  4. class成為O的內部屬性[[Class]]的值.
  5. 返回三個字符串"[object ",?class, 以及?"]"連接后的新字符串.

可以看出,比ES3多了1,2,3步.第1,2步屬于新規則,比較特殊,因為"Undefined"和"Null"并不屬于[[class]]屬性的值,需要注意的是,這里和嚴格模式無關(大部分函數在嚴格模式下,this的值才會保持undefined或null,非嚴格模式下會自動成為全局對象).第3步并不算是新規則,因為在ES3的引擎中,也都會在這一步將三種原始值類型轉換成對應的包裝對象,只是規范中沒寫出來.ES5中,[[Class]]屬性的解釋更加詳細:

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

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

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

?

轉載于:https://www.cnblogs.com/Walker-lyl/p/5597641.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395725.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395725.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395725.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

平安 開源 數據庫 實踐_刻意的實踐-成為開源

平安 開源 數據庫 實踐by Anthony Ng由Anthony Ng 刻意的實踐-成為開源 (Deliberate Practice — Becoming an Open Sourcerer) I recently finished reading Cal Newport’s book, So Good They Can’t Ignore You. It’s a quick read, and it introduced me to the concept…

更新Composer依賴報錯處理Fatal error: Declaration of Fxp\Composer\AssetPlugin\Repository\AbstractAssetsRe...

更新Composer依賴報錯處理 Fatal error: Declaration of Fxp\Composer\AssetPlugin\Repository\AbstractAssetsRepository::search() must be compatible with Composer\Repository\RepositoryInterface::search($query, $mode 0, $type NULL) in C:\Users\Arthur\AppData\Ro…

解析su,su -,sudo的區別

2019獨角獸企業重金招聘Python工程師標準>>> 本人以前一直習慣直接使用root,很少使用su,前幾天才發現su與su -命令是有著本質區別的! 大部分Linux發行版的默認賬戶是普通用戶,而更改系統文件或者執行某些命令&#xff…

java 前置通知_spring aop中的前置通知

fixassetServicemyInterceptormyInterceptor2在上面的配置文件中 我配置了兩個interceptor ,這兩個interceptor的invoke方法中的邏輯是一樣的。public Object invoke(MethodInvocation invo) throws Throwable {//自己的橫切邏輯log....invo.proceed()}我想請教的問…

Java并發編程藝術讀書筆記

1、多線程在CPU切換過程中,由于需要保存線程之前狀態和加載新線程狀態,成為上下文切換,上下文切換會造成消耗系統內存。所以,可合理控制線程數量。 如何控制: (1)使用ps -ef|grep appname&#…

您可能不需要翻譯您JavaScript

by Alex Ewerlf由AlexEwerlf 您可能不需要翻譯您JavaScript (You might not need to transpile your JavaScript) Popular guides like YouMightNotNeedJQuery.com and You Don’t Need Lodash/Underscore have challenged common industry practices.諸如YouMightNotNeedJQue…

java maven 操作 收集的一些命令

maven打包: mvn clean package -Dmaven.test.skiptrue 運行jar: java -jar target/spring-boot-scheduler-1.0.0.jar 這種方式關掉控制臺就不可以訪問,現在要后臺運行的方式啟動 nohup java -jar target/spring-boot-scheduler-1.0.0.jar & 清理并…

手機h5 java平臺_H5 手機 App 開發入門:技術篇

1、手機 App 的技術棧手機 App 的技術棧可以分成三類原生 App 技術棧原生技術棧指的是,只能用于特定手機平臺的開發技術。比如,安卓平臺的 Java 技術棧,iOS 平臺的 Object-C 技術棧或 Swift 技術棧。混合 App 技術棧混合技術棧指的是開發混合…

《Java程序設計》學期總結

《Java程序設計》 學期總結 課程設計小組 -迦瓦棧隊 團隊博客 讀書筆記匯總第一周第二周第三周第四周第五周第六周第七周第八周第九周第十周 實驗報告匯總實驗一實驗二實驗三實驗四實驗五 代碼托管鏈接GitOSC 課程收獲與不足 上了一學期的課,收獲當然后很多&#xf…

012-- mysql的分區和分表

分區 分區就是把一個數據表的文件和索引分散存儲在不同的物理文件中。 mysql支持的分區類型包括Range、List、Hash、Key,其中Range比較常用: RANGE分區:基于屬于一個給定連續區間的列值,把多行分配給分區。 LIST分區:類…

中科大計算機專業少實習_為什么很少有計算機科學專業的人?

中科大計算機專業少實習Hong Kong-based technology writer Dan Wang wrote a blog post exploring why so few people get degrees in computer science. And yes — it’s far fewer people than those who study other science and engineering fields.駐香港的技術作家王丹…

java犯的小錯誤_[Java教程]十個JavaScript中易犯的小錯誤,你中了幾槍?

[Java教程]十個JavaScript中易犯的小錯誤,你中了幾槍?0 2015-06-01 12:00:19序言在今天,JavaScript已經成為了網頁編輯的核心。尤其是過去的幾年,互聯網見證了在SPA開發、圖形處理、交互等方面大量JS庫的出現。如果初次打交道&…

Kali滲透測試——利用metasploit攻擊靶機WinXP SP1

搭建滲透測試環境 Kali攻擊機 WinXP SP1 靶機 啟動metasploit 跟windows RPC相關的漏洞 內部提供的漏洞攻擊 靶機winxp sp1網絡配置 查看虛擬機的NAT網段 配置WinXP SP1靶機的IP地址 執行漏洞利用 后漏洞利用:meterpreter> 靶機的信息 進程情況 查看到explorer.e…

創建響應式布局的優秀網格工具集錦《系列五》

在這篇文章中,我們為您呈現了一組優秀的網格工具清單。如果網頁設計和開人員采用了正確的工具集,并基于一個靈活的網格架構,以及能夠把響應圖像應用到到設計之中,那么創建一個具備響應式的網站并不一定是一項艱巨的任務。enjoy! 您…

【iOS - 周總結】開發中遇到的小知識點(2018.12.10-2018.12.15)

1.WKWebview加載html文本圖片過大,沒有自適應屏幕寬高。 在用Webview加載html文本有時候會遇到加載的圖片過大,不能自適應屏幕寬高的問題。那么如何解決這個問題?如何使圖片自適應屏幕?很簡單,只需要加一個js就可以。 …

如何使用Create React App DevOps自動化工作中所有無聊的部分

by James Y Rauhut詹姆士魯豪(James Y Rauhut) 如何使用Create React App DevOps自動化工作中所有無聊的部分 (How I automate all of the boring parts of my job with Create React App DevOps) When you have responsibilities as one of the only designers — and possib…

java 無侵入監控_MyPerf4J 一個高性能、無侵入的Java性能監控和統計工具

MyPerf4J一個針對高并發、低延遲應用設計的高性能且無侵入的實時Java性能監控和統計工具。 受 perf4j 和 TProfiler啟發而來。MyPerf4J具有以下幾個特性:無侵入: 采用JavaAgent方式,對應用程序完全無侵入,無需修改應用代碼高性能: 性能消耗非…

Apple Swift編程語言新手教程

文件夾 1 簡單介紹2 Swift入門3 簡單值4 控制流5 函數與閉包6 對象與類7 枚舉與結構1 簡單介紹 今天凌晨Apple剛剛公布了Swift編程語言,本文從其公布的書籍《The Swift Programming Language》中摘錄和提取而成。希望對各位的iOS&OSX開發有所幫…

javascript 減少回流

減少回流(REFLOWS) 當瀏覽器重新渲染文檔中的元素時需要 重新計算它們的位置和幾何形狀,我們稱之為回流。回流會阻塞用戶在瀏覽器中的操作,因此理解提升回流時間是非常有幫助的。 回流時間圖表 你應該批量地觸發回流或重繪&#x…

[國家集訓隊] 特技飛行

題目背景 1.wqs愛好模擬飛行。 2.clj開了一家神犇航空,由于clj還要玩游戲,所以公司的事務由你來打理。 注意:題目中只是用了這樣一個背景,并不與真實/模擬飛行相符 題目描述 神犇航空開展了一項載客特技飛行業務。每次飛行長N個單…