在js中typeof 是判断数据类型的运算符。但是返回值中却没有数组。当它遇到null类型和Array对象这两个时,都会被判断为object
var ary = [1,23,4];
console.log(typeof ary); //输出结果是Object
其方法并不能检测出是否是数组,只能判断其类型,所以说typeof判断基本类型数据还是挺好的,但是不能准确测试出是否是数组
判断是否为数组
1. Array.isArray() 用于确定传递的值是否是一个 Array。
Array.isArray([1, 2, 3]); // true
Array.isArray({foo: 123}); // false
该方式是数组构造函数上的一个方法
ECMAScript 5.1中新增的 在IE9以下不兼容
2 验证构造函数是否为数组
1.instanceof 判断的是数组时返回true,否则返回false。
var arr = [1,23,4];
var obj = {};
console.log(arr instanceof Array)//true;
console.log(obj instanceof Array)//false;
``
上面的方法其判断的是constructor属性,因为在js中每个对象都有constructor属性,这种也常用作判断未知对象的类型。
``js
console.log(ary.constructor == Array );//true
console.log(obj .constructor == Array)//false
从输出的效果来看,能准确的检测出数据类型是否是数组,我们都是知道在js中原型是可以改变的,所以该方法是只在不改变其构造函数的前提下
var arr = [1,23,4];
var obj = {};
obj.__proto__ = arr.__proto__;
console.log(arr instanceof Array)//true;
console.log(obj instanceof Array)//true;
console.log(arr.constructor == Array);//true
console.log(obj.constructor == Array)//true
3. 验证原型
- Object.getPrototypeOf() 方法返回指定对象的原型(内部[[Prototype]]属性的值)
判断变量的原型是否为Array.prototype
如果arr的原型为Array.prototype则为true
var arr = [1,23,4];
var obj = {};
console.log(Object.getPrototypeOf(arr) == Array.prototype); //true
console.log(Object.getPrototypeOf(obj) == Array.prototype);//false
- isPrototypeOf() 方法用于测试一个对象是否存在于另一个对象的原型链上。
判断Array.prototype是否在该对象的原型链中
如果Array.prototype在arr的原型链上则为true
console.log(Array.prototype.isPrototypeOf(arr));//true
console.log(Array.prototype.isPrototypeOf(obj));//false
但是该方法也是有缺点的和第二种缺点是一样的要是改变了其原型就会出现我们不想要的结果
4. 通用方法tostring()
每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 “[object type]”,其中 type 是对象的类型。以下代码说明了这一点:
var o = new Object();
o.toString(); // returns [object Object]
所以说这个方法是最稳妥的
但是tostring 在其他类型的原型中都被重写了所以在使用改方法的时候要改变tostring中的this的指向
var arr = [1,23,4];
var obj = {};
console.log(Object.prototype.toString.call(arr)=='[object Array]');//true
console.log(Object.prototype.toString.call(obj)=='[object Array]');//false