方法一: 通过判断变量的类型, 并且变量的 length 属性(除了有一种例外是 arguments 对象 - 当给函数传参时数据存储的地方)
- var arr=[2,3,4];
- var obj={"name":"maomao","age":20};
- console.log(typeof arr); //object
- console.log(typeof obj); //object
- console.log(arr.length); //3
- console.log(obj.length); //undefined
- console.log(obj.name); //maomao
- // 这里说明在对象中并没有 length 属性, 所以是未定义.
方法二:
使用 toString 方法将对象转换成其他类型的 string, 该例很好的证明了 arguments 对象不是数组, 而是对象
- var arr=[2,3,4];
- var obj={"name":"maomao","age":20};
- // console.log(arr.toString()); //'2,3,4'
- // console.log(obj.toString()); //[object Object]
- function sum(a,b){
- // console.log(arguments);
- // console.log(typeof arguments); //object
- // console.log(arguments.length); //2 根据具体调用函数传的实参决定
- // console.log(arguments.toString()); //[object Arguments]
- return a+b;
- }
- alert(sum(3,4));
web 前端 JavaScript 学习群: 618522268
方法三: ->不可行
instanceof 指出对象是否是特定类的一个实例.
结论: instanceof 检测一个对象 A 是不是另一个对象 B 的实例的原理是: 查看对象 B 的 prototype 指向的对象是否在对象 A 的 [[prototype]] 链上. 如果在, 则返回 true, 如果不在则返回 false. 不过有一个特殊的情况, 当对象 B 的 prototype 为 null 将会报错(类似于空指针异常).
- var arr=[2,3,4,"haa"];
- var obj={"name":"maomao","age":20};
- console.log(arr instanceof Array); //true
- console.log(obj instanceof Object); //true
- console.log(arr instanceof Object); //true
--- 这里跟网上的不同, 不知道是什么原因
console.log(obj instanceof Array); //false
4,ECMAScript 5 中可以使用 isArray 来判断
- var arr=[2,3,4,"haa"];
- var obj={"name":"maomao","age":20};
- console.log(Array.isArray(arr)); //true
- console.log(Array.isArray(obj)); //false
- // 注意没有 isObject 这种方法 暂时
5, 使用 isPrototypeOf()函数
原理: 检测一个对象是否是 Array 的原型(或处于原型链中, 不但可检测直接父对象, 还可检测整个原型链上的所有父对象)
使用方法: parent.isPrototypeOf(child)来检测 parent 是否为 child 的原型;
需注意的是 isPrototypeOf()函数实现的功能和 instancof 运算符非常类似;
- var arr=[2,3,4,"haa"];
- var object={"name":"maomao","age":20};
- console.log(Array.prototype.isPrototypeOf(arr)); //true
- console.log(Array.prototype.isPrototypeOf(object)); //false
- console.log(Object.prototype.isPrototypeOf(arr)); //true console.log(Object.prototype.isPrototypeOf(object)); //true
- // 从上面上看 Array.prototype.isPrototypeOf()可以作为判断的依据
6, 使用 constructor 属性
- var arr=[2,3,4,"haa"];
- var obj={"name":"maomao","age":20};
- console.log(arr.constructor); //function Array() { [native code] }
- console.log(obj.constructor); //function Object() { [native code] }
- console.log(arr.constructor==Array); //true
- console.log(arr.constructor==Object); //false
- console.log(obj.constructor==Array); //false
- console.log(obj.constructor==Object); //true
7, 使用 concat 方法 - 灵活变通
array.concat(数组 1, 数组 2,...)
返回一个新数组, 这个新数组是由两个或更多数组组合而成的
- var arr=[2,3,4];
- var obj={"name":"maomao","age":20,'concat':function(){ return 1;}};
- console.log(arr.concat()); //[2,3,4]
- console.log(obj.concat()); //1 当然这个 concat 是我自定义上去的方法, 返回值也是可以定制的. 如果没有该方法则会报出 Uncaught TypeError: obj.concat is not a function 这个错误.
来源: http://www.qdfuns.com/article/50415/caf967a54fd699fde3ef3291889cff5e.html