【发布时间】:2011-12-09 20:04:04
【问题描述】:
js中typeof不能派上用场的数组和对象如何识别?
var arr = [], ob = {};
由于js中的一切都是对象,
if(typeof arr == typeof ob) => returns true
我想要一个运算符或...,它会告诉我变量是一个数组。然后我可以只对数组对象使用数组函数。这怎么可能?
【问题讨论】:
标签: javascript
js中typeof不能派上用场的数组和对象如何识别?
var arr = [], ob = {};
由于js中的一切都是对象,
if(typeof arr == typeof ob) => returns true
我想要一个运算符或...,它会告诉我变量是一个数组。然后我可以只对数组对象使用数组函数。这怎么可能?
【问题讨论】:
标签: javascript
var arr = [], ob = {};
由于js中的一切都是对象,即使**Array是一个Object,而是一个Array类的实例
if(typeof arr == typeof ob) => returns true as Both are **Objects
那么,你将如何识别对象。
这就是 instanceof 操作符派上用场的地方,要确定它是否是一个数组,您可以添加一个额外的检查 cde:
if(arr instanceof Object && arr instanceof Array) => returns true
if(ob instanceof Object && ob instanceof Array) => returns false
【讨论】:
Object.prototype.toString.call() 或新的isArray()。
您可以使用 Array.isArray() 方法来检查变量是否为数组。
var myArray = [1,2,3,4,5];
console.log(Array.isArray(myArray));
是的
【讨论】:
在众多简单/复杂的比较中,一个区别是:
var arr = []; # arr.length => 0
var obj = {}; # obj.length => undefined
【讨论】:
length 键的对象时。 let obj = { length: 11 }; // obj.length => 11
有多种区分数组和对象的方法,上面已经提到了一些我想补充一下上面的答案。
第一种方法 使用长度进行区分,长度属性存在于数组上但不存在于对象上
var arr = [1,2,3]; arr.length => 3
var obj = {name: 'name'}; obj.length => undefined
注意:当有人像下面这样声明对象时,这种方法会失败,只有当我们确定不会得到任何具有长度属性的对象时,我们才能使用这种方法
var rectangle = {length: 50, width: 50}; rectangle.length => 50
第二种方法 使用实例数组
var arr = [1,2,3]; arr instanceof Array => true
var obj = {name: 'name'}; ojb instanceof Array => false
第三种方法 使用 Array.isArray,这是最可取的方法,现在大多数浏览器都支持
注意:Array.isArray 优于 instanceof,因为它有效 通过 iframe。
Array.isArray(arr) => true
true
Array.isArray(obj) => false
如果你想支持ie 8浏览器使用Object.prototype.toString 我们可以为 8 编写 polyfill
if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}
Object.prototype.toString.call(arr); =>"[object Array]"
Object.prototype.toString.call(obj); =>"[object Object]"
参考:isArray
【讨论】: