精確判斷對象類型
typeof操作符
对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时
var arr=new Array("1","2","3","4","5"); alert(typeof(arr));
你会收到一个object 的答案,有点让人失望。
typeof操作符不能区分对象类型,null、array等都是object
instanceof 操作符
JavaScript中instanceof运算符会返回一个 Boolean 值,指出对象是否是特定类的一个实例。 使用方法:result = object instanceof class,还是刚刚的数组,再来一次,嗯,成功的返回 true。
var arrayStr=new Array("1","2","3","4","5"); alert(arrayStr instanceof Array); //true
但当和frame打交道的时候instanceif就呵呵了。请看下面的代码:
//2.html<body> <iframe name="childframe" class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="3.html"></iframe> <script type="text/javascript"> window. = function () { var airplanes = ["MU", "CA", "CZ"]; var r=airplanes instanceof Array; console.log('2.html,airplanes instanceof Array:'+r) var result = window.frames[0].flight(airplanes); }; </script></body>//3.html<body> <script type="text/javascript"> var flight = function (arr) { var result = arr instanceof Array console.log('frame,arr instanceof Array:'+result);//false }; </script></body>
控制台的结果
寻找原因
//2.thml<body> <iframe name="childframe" class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="3.html"></iframe> <script type="text/javascript"> window. = function () { var airplanes = ["MU", "CA", "CZ"]; var r=airplanes instanceof Array; var result = window.frames[0].flight(airplanes); console.log("2.html,airplanes.constructor:"+airplanes.constructor) var y=window.constructor==Window console.log("2.html,window.constructor==Window:"+y) var z=window.constructor==window.frames[0].Window console.log("2.html,window.constructor==.frames[0].Window:"+z) }; </script></body>//3.html<body> <script type="text/javascript"> var flight = function (arr) { var result = arr instanceof Array console.log("frames,airplanes.constructor:"+arr.constructor) var r=window.constructor==Window console.log('frames,window.constructor==Window:'+r) }; </script></body>
综上,在2.html和fram中的window是两个不同时实例,而Array又是window的属性,既然大环境都不一样,那么Array也肯定不是同一个,因此对于同一个Array实例来说,在这两种环境下游走,它的根不变,就好比,A是中国人,A在美国定居生活,但是他始终不是美国银
终极BOSS Object.prototype.toString
//2.html<body> <iframe name="childframe" class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="3.html"></iframe> <script type="text/javascript"> window. = function () { var airplanes = ["MU", "CA", "CZ"]; var result = window.frames[0].flight(airplanes); }; </script></body>//3.html<body> <script type="text/javascript"> var flight = function (arr) { var result = Object.prototype.toString.call(arr) console.log(result) }; </script></body>
控制台结果
以上部分在IE和火狐下测试正确,在谷歌下有关于跨域的错误
call改变toString的this引用为待检测的对象,返回此对象的字符串表示,然后对比此字符串是否是'[object Array]',以判断其是否是Array的实例。也许你要问了,为什么不直接o.toString()?嗯,虽然Array继承自Object,也会有toString方法,但是这个方法有可能会被改写而达不到我们的要求,而Object.prototype则是老虎的屁股,很少有人敢去碰它的,所以能一定程度保证其“纯洁性”:)
还有一种便捷的写法,来检测对象类型toString.apply(arr),但是IE不兼容。
var v=[1,2];console.log( toString.apply(v) === '[object Array]')//true
作者:fenerchen
链接:https://www.jianshu.com/p/6ac0964fb132
共同學習,寫下你的評論
評論加載中...
作者其他優質文章