摘要:從而將傳入的數(shù)組誤判為非數(shù)組。每個類在內(nèi)部都有一個屬性,這個屬性就指定了上述字符串中的構(gòu)造函數(shù)名。的方法不能檢測非原生的構(gòu)造函數(shù)的構(gòu)造函數(shù)名,因此,開發(fā)人員定義的任何構(gòu)造函數(shù)都將返回。
JS的經(jīng)典問題之一就是“檢測一個對象是不是數(shù)組”,本文總結(jié)了3種檢測方法。
instanceof檢測方法var arr = []; if (arr instanceof Array) { // do something }
存在問題
instanceof 操作符假設(shè)只有一個全局執(zhí)行環(huán)境。如果網(wǎng)頁中包含多個框架,那實際上存在兩個以上的不同全局執(zhí)行環(huán)境,從而存在兩個以上不同版本的Array構(gòu)造函數(shù)。如果從一個框架向另一個框架傳入數(shù)組,那么傳入的數(shù)組與第二框架中原生的數(shù)組分別具有各自不同的構(gòu)造函數(shù)。從而將傳入的數(shù)組誤判為非數(shù)組。
如果只有一個全局執(zhí)行環(huán)境,可以用 instanceof 檢測數(shù)組。
Array.isArray()方法var arr = []; if (Array.isArray(arr)) { // do something }
這個方法克服了instanceof的問題,可以確定某個變量是不是數(shù)組,而不管它是在哪個全局執(zhí)行環(huán)境中創(chuàng)建的。
但是支持Array.isArray()方法的瀏覽器有IE9+、Firefox4+、Safari5+、Opera10.5+和Chrome。對于不支持這個方法的瀏覽器怎么辦呢?第三種——萬能方法。
function isArray(arr) { return Object.prototype.toString.call(arr) == "[object Array]"; } var arr = []; isArray(arr);
原理
在任何值上調(diào)用Object原生的toString() 方法,都會返回一個[object NativeConstructorName] 格式的字符串。每個類在內(nèi)部都有一個[ [Class] ]屬性,這個屬性就指定了上述字符串中的構(gòu)造函數(shù)名NativeConstructorName。如:
var arr = []; console.log(Object.pototype.toString.call(arr)); // "[object Array]"
這種思路也可用于檢測某個值是不是原生函數(shù)或正則表達式。
// Array Object.prototype.toString.call(value); // "[object Array]" // Function Object.prototype.toString.call(value); // "[object Function]" // RegExp Object.prototype.toString.call(value); // "[object RegExp]" // Date Object.prototype.toString.call(value); // "[object Date]"
Object的toString()方法不能檢測非原生的構(gòu)造函數(shù)的構(gòu)造函數(shù)名,因此,開發(fā)人員定義的任何構(gòu)造函數(shù)都將返回[object Object]。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/85777.html
摘要:基本的學習思路是跟著框架設(shè)計這本書,甚至可以說是這本書的讀書筆記。也參考很多網(wǎng)上解讀的博客和學習資料。當然,最重要的資料還是框架的源代碼。后來由于開發(fā)者反對,新興的框架都在命名空間上構(gòu)建。 JavaScript框架學習筆記(一) 我為什么要學習框架 更深入的理解工具,以后用起來更順手而且也能做一定的工具取舍,學習理解新工具也就更快, 對提升js水平也很有幫助,框架有很多解決坑的經(jīng)典思...
摘要:當以非構(gòu)造函數(shù)形式被調(diào)用時,等同于。并且,函數(shù)執(zhí)行完畢后,其活動對象不會被銷毀,因為匿名函數(shù)的作用域鏈仍然在引用這個活動對象。知道閉包被銷毀,創(chuàng)建函數(shù)的活動對象才會被回收。 本著盡可能多的完善基礎(chǔ)知識,打好基礎(chǔ),做一條有夢想的咸魚。 1.數(shù)據(jù)類型 基本數(shù)據(jù)類型:Undefined,Null,Boolean,Number,String,一種復雜數(shù)據(jù)類型Object 2.typeof操...
摘要:文檔地址中文文檔英文文檔源碼地址第一個函數(shù)是,不過源碼中依賴了,所以第一篇文章就從開始。這個函數(shù)的作用就是裁剪數(shù)組,從下標開始,到下標結(jié)束,但是并不包含,并將結(jié)果作為一個數(shù)組返回。并且注明了這個方法用于代替來確保數(shù)組正確返回。 百忙之中(閑來無事)想抽點時間好好讀一下源碼,于是就選了Lodash來寫一個系列罷。讀源碼順序就按照loadsh文檔順序來。 文檔地址:中文文檔?? 英文文檔源...
摘要:如果網(wǎng)頁中包含多個框架,那實際上就存在兩個以上不同的全局執(zhí)行環(huán)境,從而存在兩個以上不同版本的構(gòu)造函數(shù)。如果你從一個框架向另一個框架傳入一個數(shù)組,那么傳入的數(shù)組與在第二個框架中原生創(chuàng)建的數(shù)組分別具有各自不同的構(gòu)造函數(shù)。 如何檢測某個變量是否為數(shù)組? 《javascript 高級程序設(shè)計》原文摘錄: 自從 ECMAScript 3 做出規(guī)定以后,就出現(xiàn)了確定某個對象是不是數(shù)組的經(jīng)典問題...
摘要:的理解函數(shù)與其他語言函數(shù)最大的不同在于,其不介意傳入多少參數(shù)以及參數(shù)的類型比如函數(shù)的形參有兩個,但是調(diào)用函數(shù)傳入的參數(shù)可以寫一個,三個或不寫參數(shù)對應(yīng)等,解析器都可以正常解析,這是因為中參數(shù)在內(nèi)部是以一個數(shù)組形式來表示,故而不需要關(guān)系傳入?yún)?shù) ECMAScript function的理解 ECMAScript 函數(shù)與其他語言函數(shù)最大的不同在于,其不介意傳入多少參數(shù)以及參數(shù)的類型...
閱讀 3735·2021-11-24 10:46
閱讀 1706·2021-11-15 11:38
閱讀 3761·2021-11-15 11:37
閱讀 3481·2021-10-27 14:19
閱讀 1939·2021-09-03 10:36
閱讀 1991·2021-08-16 11:02
閱讀 2998·2019-08-30 15:55
閱讀 2251·2019-08-30 15:44