摘要:多個(gè)窗口意味著多個(gè)全局環(huán)境,不同的全局環(huán)境擁有不同的全局對(duì)象,從而擁有不同的內(nèi)置類型構(gòu)造函數(shù)。這可能會(huì)引發(fā)一些問題。上面我們提到使用原生的方法來判斷值是否為數(shù)組的實(shí)例。這也意味著不是一個(gè)十分可靠的識(shí)別對(duì)象類型的方式。
在JavaScript中,可以通過typeof操作符來判斷基本數(shù)據(jù)類型(Undefined、Null、Boolean、Number和String),同時(shí)相信大家也熟知typeof對(duì)于對(duì)象的判斷是不準(zhǔn)確的,因?yàn)樘厥庵?b>Null被認(rèn)為是一個(gè)空的對(duì)象的引用。
對(duì)于數(shù)組的創(chuàng)建,可以使用構(gòu)造函數(shù),通過傳遞數(shù)量
var colors = new Array(3);
也可以在構(gòu)造函數(shù)中傳遞值來創(chuàng)建數(shù)組
var colors = new Array("red", "blue", "green");
創(chuàng)建數(shù)組的第二種基本方法是使用數(shù)組字面量
var colors = ["red", "blue", "green"];
判斷一個(gè)對(duì)象是否為數(shù)組,最先想到的就是instanceof操作符,通過判斷對(duì)象是否為Array的實(shí)例來達(dá)到目的
var array = []; console.log(array instanceof Array); // true
使用instanceof操作符的問題在于它假定只有一個(gè)全局執(zhí)行環(huán)境。
然而這在某些特殊環(huán)境下并不安全,下面引用自MDN:
在瀏覽器中,我們的腳本可能需要在多個(gè)窗口之間進(jìn)行交互。多個(gè)窗口意味著多個(gè)全局環(huán)境,不同的全局環(huán)境擁有不同的全局對(duì)象,從而擁有不同的內(nèi)置類型構(gòu)造函數(shù)。這可能會(huì)引發(fā)一些問題。比如,表達(dá)式?[] instanceof window.frames[0].Array?會(huì)返回false,因?yàn)?b>Array.prototype !== window.frames[0].Array.prototype。
因此,需要另尋別的方法來判斷。
大家知道在任何值上調(diào)用Object原生的toString()方法,都會(huì)返回一個(gè)[object NativeConstructorName]格式的字符串。
var colors = []; console.log(Object.prototype.toString.call(colors)); // "[object Array]"
利用這一點(diǎn)我們可以進(jìn)一步將其封裝成一個(gè)通用函數(shù)
function isArray(value) { return Object.prototype.toString.call(value).slice(8, -1) === "Array"; }
在ES5中,為了解決這個(gè)問題,提供了Array.isArray()方法來確定某個(gè)值到底是不是數(shù)組,而不管它是在哪個(gè)全局作用域中創(chuàng)建的。
var colors = []; console.log(Array.isArray(colors)); // true
行文到此應(yīng)該結(jié)束了,因?yàn)榕袛鄶?shù)組的方法其實(shí)沒有什么好說的。但是在ES6中,由于增加了一種新數(shù)據(jù)類型Symbol,并通過Symbol暴露了一些內(nèi)部操作,導(dǎo)致了在判斷的結(jié)果上會(huì)出現(xiàn)一些不確定情況。
和本文相關(guān)的一個(gè)是Symbol.hasInstance方法,它是執(zhí)行操作符instanceof時(shí)內(nèi)部調(diào)用的方法,用于檢測(cè)對(duì)象的繼承信息。當(dāng)我們調(diào)用colors instanceof Array時(shí),實(shí)際上調(diào)用的是Array[Symbol.hasInstance](colors)。
如果沒有了解過Symbol的童鞋還不清楚這意味著什么,且看下面的例子:
var sameArray = { [Symbol.hasInstance](instance) { return Array.isArray(instance); } } console.log([] instanceof sameArray); // true
這里我們定義了sameArray的instance行為,內(nèi)部調(diào)用了Array.isArray()方法來判斷傳入的參數(shù)是否為一個(gè)數(shù)組。同樣我們可以改變一個(gè)class的instanceof行為,這里需要注意一點(diǎn)的是在class中是作為類的靜態(tài)方法。
class Person { static [Symbol.hasInstance](instance) { return Array.isArray(instance); } }
最重要的是我們可以直接改變內(nèi)置Array的instanceof行為,導(dǎo)致其完全不可靠。
var colors = []; Object.defineProperty(Array, Symbol.hasInstance, { value(v) { return false; } }) console.log(colors instanceof Array); // false console.log(Array.isArray(colors)); // true
上面我們提到使用Object原生的toString()方法來判斷值是否為數(shù)組的實(shí)例。這在ES5中是一個(gè)很有效的方式,但在ES6中我們同樣可以通過Symbol.toStringTag來改變Object.prototype.toString()的默認(rèn)值。
Array.prototype[Symbol.toStringTag] = "Magic"; var colors = []; console.log(Object.prototype.toString.call(colors)); // "[object Magic]"
這也意味著Object.prototype.toString()不是一個(gè)十分可靠的識(shí)別對(duì)象類型的方式。
注意:雖然語言本身不會(huì)阻止你使用Symbol.toStringTag屬性來改變對(duì)象內(nèi)建的toString()方法的默認(rèn)值,但還是不建議這樣做。
最后:不論是在ES5還是ES6中,最可靠和最安全的數(shù)組判斷方法是使用原生的Array.isArray()方法,而在ES3中我們可以直接使用Object.prototype.toString()來達(dá)到數(shù)組識(shí)別的目的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/88496.html
摘要:比如我們今天要討論的,在當(dāng)中如何判斷一個(gè)數(shù)組是數(shù)組。在數(shù)組的原型鏈上也能找到構(gòu)造函數(shù)由上面的幾行代碼可以看出,使用運(yùn)算符可以分辨數(shù)組和對(duì)象,可以判斷數(shù)組是數(shù)組。用判斷實(shí)例化的數(shù)組擁有一個(gè)屬性,這個(gè)屬性指向生成這個(gè)數(shù)組的方法。 如果你沒有注意過這個(gè)問題,那么這個(gè)標(biāo)題應(yīng)該會(huì)讓你感到困惑,判斷數(shù)據(jù)類型這么基礎(chǔ)的問題能有什么坑呢? 少年,你不能太天真了,我們朝夕面對(duì)的這門語言,可是JavaSc...
摘要:不過讓流行起來的原因應(yīng)該是是目前所有主流瀏覽器上唯一支持的腳本語言。經(jīng)過測(cè)試,數(shù)字字符串布爾日期可以直接賦值,修改不會(huì)產(chǎn)生影響。再考慮對(duì)象類型為或者的情況。對(duì)于結(jié)果聲明其類型。判斷對(duì)象的類型是還是,結(jié)果類型更改。 轉(zhuǎn)載自我的個(gè)人博客 歡迎大家批評(píng)指正 1. 第一個(gè)頁面交互 這里最需要學(xué)習(xí)的老師的代碼中,每一部分功能都由函數(shù)控制,沒有創(chuàng)建一個(gè)全部變量。且最后有一個(gè)函數(shù)來控制執(zhí)行代碼...
摘要:最新版本見,點(diǎn)擊查看歷史版本提供一套實(shí)用的基礎(chǔ)函數(shù)任意格式的日期轉(zhuǎn)換函數(shù),瀏覽器相關(guān)操作函數(shù)等全局參數(shù)設(shè)置默認(rèn)全局參數(shù)基礎(chǔ)函數(shù)判斷是否非數(shù)值判斷是否為有限數(shù)值判斷判斷是否數(shù)組判斷是否小數(shù)判斷是否整數(shù)判斷是否對(duì)象判斷是否對(duì)象判斷是否對(duì)象判斷是 最新版本見 Github,點(diǎn)擊查看歷史版本 XEUtils 提供一套實(shí)用的基礎(chǔ)函數(shù)、任意格式的日期轉(zhuǎn)換函數(shù),瀏覽器相關(guān)操作函數(shù)等... API ...
摘要:專題系列預(yù)計(jì)寫二十篇左右,主要研究日常開發(fā)中一些功能點(diǎn)的實(shí)現(xiàn),比如防抖節(jié)流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點(diǎn)是研究和的實(shí)現(xiàn)方式。 JavaScript專題系列第五篇,講解更加復(fù)雜的類型判斷,比如 plainObject、空對(duì)象、類數(shù)組對(duì)象、Window對(duì)象、DOM 元素等 前言 在上篇《JavaScript專題之類型判斷(上)》中,我們抄襲 jQuery 寫了一個(gè) typ...
摘要:判斷是否為一個(gè)函數(shù),返回一個(gè)值。使用遞歸來實(shí)現(xiàn)一個(gè)深度克隆,可以復(fù)制一個(gè)目標(biāo)對(duì)象,返回一個(gè)完整拷貝被復(fù)制的對(duì)象類型會(huì)被限制為數(shù)字字符串布爾日期數(shù)組對(duì)象。經(jīng)過測(cè)試,數(shù)字字符串布爾日期可以直接賦值,修改不會(huì)產(chǎn)生影響。再考慮對(duì)象類型為或者的情況。 //判斷arr是否為一個(gè)數(shù)組,返回一個(gè)bool值 首先javascript有5大基本數(shù)據(jù)類型:Undefined,Null,Boolean,Num...
閱讀 3421·2021-10-20 13:49
閱讀 2793·2021-09-29 09:34
閱讀 3691·2021-09-01 11:29
閱讀 3081·2019-08-30 11:01
閱讀 838·2019-08-29 17:10
閱讀 866·2019-08-29 12:48
閱讀 2777·2019-08-29 12:40
閱讀 1348·2019-08-29 12:30