摘要:如果網頁中包含多個框架,那實際上就存在兩個以上不同的全局執行環境,從而存在兩個以上不同版本的構造函數。如果你從一個框架向另一個框架傳入一個數組,那么傳入的數組與在第二個框架中原生創建的數組分別具有各自不同的構造函數。
1. 首先,typeof肯定是不行的
對于一些基本類型,typeof是可以判斷出數據類型,但是判斷一些引用類型時候,不能具體到具體哪一種類型
再來復習一下typeof的用法:
// 基本類型 typeof 123; //number typeof "123"; //string typeof true; //boolean typeof undefined; //undefined typeof null; //object let s = Symbol; typeof s; //symbol // 引用類型 typeof [1,2,3]; //object typeof {}; //object typeof function(){}; //function typeof Array; //function Array類型的構造函數 typeof Object; //function Object類型的構造函數 typeof Symbol; //function Symbol類型的構造函數 typeof Number; //function Number類型的構造函數 typeof String; //function String類型的構造函數 typeof Boolean; //function Boolean類型的構造函數2. 兩種簡單,但是不是十分準確的方法
var obj = [4,67,23]; obj instanceof Array; //return true obj.constructor == Array; // return true
為什么不準確?
2.1 首先來復習一下instanceof用法判斷一個實例是否屬于某種類型
function Foo(name) { this.name = name; } var f = new Foo("zhangsan"); console.log(f instanceof Foo); //true console.log(f instanceof Object); //true
判斷一個實例是否屬于它的父類型
function Person() {}; function Student() {}; var p = new Person(); Student.prototype = p; var s = new Student(); console.log(s instanceof Student); //true console.log(s instanceof Person); //true 記憶: A instanceof C 等價于 A 是否是 C子類,或者后代?2.2 instanceof 判斷邏輯?
判斷邏輯翻譯成js代碼如下:
_instanceof(f, Foo); function _instanceof(L, R) { var R = o.prototype; var L = L.__proto__; while( true) { if(L == null) { return false; } if(L == R) { return true; } L = L.__proto__; } }2.3 instanceof 不準確的原因?
代碼如下:
var iframe = document.createElement("iframe"); document.body.appendChild(iframe); var arr = [1,2,3]; xArray = window.frames[0].Array; //iframe中的構造函數 var arrx = new xArray(4,5,6); console.log(arrx instanceof Array); //false console.log(arrx.constructor == Array);// false console.log(Array.prototype == xArray.prototype); //false console.log(arr instanceof xArray); //false console.log(arrx.constructor === Array);// false console.log(arr.constructor === Array);// true console.log(arrx.constructor === xArray);// true console.log(Array.isArray(arrx)); //true
解釋:紅寶書,p88
instanceof操作符的問題在于,它假定只有一個全局環境。如果網頁中包含多個框架,那實際上就存在兩個以上不同的全局執行環境,從而存在兩個以上不同版本的Array構造函數。
如果你從一個框架向另一個框架傳入一個數組,那么傳入的數組與在第二個框架中原生創建的數組分別具有各自不同的構造函數。
因為constructor可以被重寫,所以不能確保一定是數組
example:
var str = "abc"; str.constructor = Array; str.constructor === Array // return true
而很明顯str不是數組。
而且constructor和instanceof存在同樣問題,不同執行環境下,constructor判斷不正確問題。
最終確定某個值到底是不是數組,而不管它是在哪個全局執行環境中創建的,這個方法的用法如下。
if(Array.isArray(value)){ return true; }4. Object.prototype.toString
如果在尚未實現isArray方法的瀏覽器中準確監測數組,我們需要用到Object.prototype.toString方法來判斷,每一個繼承自Object的對象都擁有toString的方法。
if(!Array.isArray){ Array.isArray = function(arg){ return Object.prototype.toString.call(arg)==="[object Array]" } }
自己可以封裝一個獲取變量類型的函數
function getType(obj) { return Object.prototype.toString.call(obj).slice(8,-1); } var a = [1,2,3]; console.log(getType(a)); //Array var b = function(){}; console.log(getType(b)); //Function5. 參考文章
JavaScript instanceof 運算符深入剖析
javascript 判斷變量是否是數組(Array)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99140.html
摘要:前一個值,當前值,索引,數組對象產生新數組的迭代器方法類似,對數組的每個元素使用某個函數,并返回新數組和相似,傳入一個返回值為布爾類型的函數。 1. 前言 數組真的是每天用了,但是有很多方法都是記不住,總是要百度查,很煩,所以才寫了個數組使用總結,有什么不對的希望大家指出來。 2. 思路 先看看這些問題都記得很清楚么? 創建數組,怎么創建數組的 數組的構造方法Array有哪些方法?E...
摘要:年月歐洲計算機制造商協會發表了標準,它是的一個擴延,它也被稱為年月首版年月日截止發布日期,的官方名稱是,國際意在更頻繁地發布包含小規模增量更新的新版本,下一版本將于年發布,命名為。 前端最基礎的就是 HTML+CSS+Javascript。掌握了這三門技術就算入門,但也僅僅是入門,現在前端開發的定義已經遠遠不止這些。前端小課堂(HTML/CSS/JS),本著提升技術水平,打牢基礎知識的...
摘要:二用操作符構造對象屬性名屬性值屬性名屬性值屬性名屬性值屬性名屬性值方法名方法名首先用創建一個空對象,然后用多條語句給對象添加屬性方法。他的寫法與三用函數聲明的方式構造對象比較像,但是稍有不同。 -- 新手向知識,就不用ES6寫法了。 一、字面量聲明 var obj = { 屬性名1 : 屬性值, 屬性名2 : 屬性值, 屬性名3 : 屬性...
摘要:番外關于糯米面試結果總而言之一句話糯米的面試掛了過程把面試過程中面試官的問題分享一下有幾種數據類型。將一個字符串轉化為數字,將數字轉化為字符串。獲取當前網址并從中截取信息。究其愿意還是對字符串和數組的操作不熟練,我決定深刻反思。 番外:關于糯米面試 結果 總而言之一句話:糯米的面試掛了 過程 把面試過程中面試官的問題分享一下: js有幾種數據類型。 將一個字符串轉化為數字,將數字轉化...
閱讀 1236·2021-11-23 09:51
閱讀 683·2021-11-19 09:40
閱讀 1347·2021-10-11 10:58
閱讀 2356·2021-09-30 09:47
閱讀 3729·2021-09-22 15:55
閱讀 2164·2021-09-03 10:49
閱讀 1259·2021-09-03 10:33
閱讀 701·2019-08-29 17:12