原文链接http://www.nowamagic.net/librarys/veda/detail/1250
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" src="3.html"></iframe>
<script type="text/javascript">
window.onload = 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>
控制台的结果
![](https://img.haomeiwen.com/i5401241/084db0a557a4372c.png)
寻找原因
//2.thml
<body>
<iframe name="childframe" src="3.html"></iframe>
<script type="text/javascript">
window.onload = 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>
![](https://img.haomeiwen.com/i5401241/633c70005bb57324.png)
综上,在2.html和fram中的window是两个不同时实例,而Array又是window的属性,既然大环境都不一样,那么Array也肯定不是同一个,因此对于同一个Array实例来说,在这两种环境下游走,它的根不变,就好比,A是中国人,A在美国定居生活,但是他始终不是美国银
终极BOSS Object.prototype.toString
![](https://img.haomeiwen.com/i5401241/739d7f32ffc7b0be.png)
//2.html
<body>
<iframe name="childframe" src="3.html"></iframe>
<script type="text/javascript">
window.onload = 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>
控制台结果
![](https://img.haomeiwen.com/i5401241/48e4c0ff146220ae.png)
以上部分在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
网友评论