您好,匿名用户
随意问技术百科期待您的加入

javascript中Array的类型为什么是object?

0 投票

例如如下代码

console.log(typeof(new Array()));
console.log(typeof([]));

它们的输出都是object,为什么不是array呢?那么我们怎么判断一个对象是普通的object还是array类型呢?

用户头像 提问 2012年 12月1日 @ Zyra 上等兵 (289 威望)
分享到:

1个回答

0 投票
 
最佳答案

typeof可以检测基本类型包括 undefined, string, number, boolean,但是对于检测对象就不靠谱了。不只是Array,javascript中的对象,包括 Date, String, Boolean, Number, Object, Function, Array, RegExp, Error 使用typof只会返回 "object"。

使用 instanceof 或者 constructor 来检测 Array 也不是靠谱的办法。如果是待检测的数组来自一个iframe的数组时,instanceof和contructor都会失效。由于每个iframe都有一套自己的执行环境,跨frame实例化的对象彼此是不共享原型链的。

var iframe = document.createElement('iframe');   
  document.body.appendChild(iframe);   
  xArray = window.frames[window.frames.length-1].Array;   
  var arr = new xArray(1,2,3); // [1,2,3]    
  arr instanceof Array; // false    
  arr.constructor === Array; // false

ECMA中对Object.prototype.toString的解释:

When the toString method is called, the following steps are taken:
1. Get the http://Class property of this object.
2. Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.
3. Return Result (2)

其过程简单说来就是:1、获取对象的类名(对象类型)。2、然后将[object、获取的类名、]组合并返回。

另外,ECMA中对Array有如下说明:
The http://Class property of the newly constructed object is set to “Array”.
其他对象类似。

因此使用这种方法既解决了instanceof存在的跨页面问题,也解决了属性检测方式所存在的问题。

另外,使用Object.prototype.toString,而不是Object.toString是因为toString可能被覆写。

var type=function(object){
return Object.prototype.toString.call(object);
}

type({}) //"[object Object]"
type([1,2,3,4]); //"[object Array]"
type(new Date()); //"[object Date]"
type(/^hello/); //"[object RegExp]"
type(new Error()) //"[object Error]"
type(new Number()) //"[object Number]"
//......
用户头像 回复 2012年 12月1日 @ Apple 上等兵 (542 威望)
选中 2012年 12月1日 @Zyra
提一个问题:

相关问题

0 投票
1 回复 49 阅读
0 投票
1 回复 31 阅读
0 投票
1 回复 28 阅读
0 投票
1 回复 50 阅读
0 投票
1 回复 35 阅读
用户头像 提问 2012年 12月1日 @ Rider 上等兵 (281 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...