JS判断对象是不是数组“Array”

在开发中,我们经常需要判断某个对象是否为数组类型,在Js中检测对象类型的常见方法都有哪些呢?

typeof 操作符

对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时

var arr=new Array("1","2","3","4","5");
alert(typeof(arr));
你会收到一个object 的答案,有点让人失望。

instanceof 操作符

JavaScript中instanceof运算符会返回一个 Boolean 值,指出对象是否是特定类的一个实例。 使用方法:result = object instanceof class,还是刚刚的数组,再来一次,嗯,成功的返回 true。

var arrayStr=new Array("1","2","3","4","5");
alert(arrayStr instanceof Array);
小总结:看样子我们今天讨论的问题已经得到了解答,但事实上在多个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","4","5");//这个写法IE大哥下是不支持的,FF下才有
alert(arr instanceof Array); // false
alert(arr.constructor === Array); // false
返回结果为两个False,让人大失所望。

ECMA-262 写道

Object.prototype.toString( ) When the toString method is called, the following steps are taken:

Get the [[Class]] property of this object.
Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.
Return Result (2)
上面的规范定义了Object.prototype.toString的行为:首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于"[object Array]"的字符串作为结果(看过ECMA标准的应该都知道,[[]]用来表示语言内部用到的、外部不可直接访问的属性,称为“内部属性”)。利用这个方法,再配合call,我们可以取得任何对象的内部属性[[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。还是先来看看在ECMA标准中Array的描述吧。

ECMA-262 写道

new Array([ item0[, item1 [,…]]])
The [[Class]] property of the newly constructed object is set to “Array”.

于是利用这点,第三种方法登场了。

function isArray(obj) {  
  return Object.prototype.toString.call(obj) === ‘[object Array]‘;   
}
call改变toString的this引用为待检测的对象,返回此对象的字符串表示,然后对比此字符串是否是‘[object Array]‘,以判断其是否是Array的实例。也许你要问了,为什么不直接o.toString()?嗯,虽然Array继承自Object,也会有toString方法,但是这个方法有可能会被改写而达不到我们的要求,而Object.prototype则是老虎的屁股,很少有人敢去碰它的,所以能一定程度保证其“纯洁性”:)

时间: 2024-10-25 06:09:43

JS判断对象是不是数组“Array”的相关文章

js判断对象是否为数组

1.ECMAScript5中有一个现成的方法:Array.isArray(). var obj = {1:[1],2:[2]}, arr = [1], str = "1"; Array.isArray(obj) // return false Array.isArray(arr) // return true Array.isArray(str) // return false 2.instanceofinstanceof操作符用于判断对象是不是类的实例.使用方法是object ins

JS中判断对象是不是数组的方法

JavaScript中检测对象的方法 1.typeof操作符 这种方法对于一些常用的类型来说那算是毫无压力,比如Function.String.Number.Undefined等,但是要是检测Array的对象就不起作用了. 利用typeof除了array和null判断为object外,其他的都可以正常判断 alert(typeof null); // "object" alert(typeof function () { return 1; }); // "function&

js判断对象数组中是否存在某个对象

1. 如果要判断数组中是否存在某个元素的话很好判断,直接用数组的indexOf方法就好,存在返回当前索引不存在返回-1 var arr=[1,2,3,4] arr.indexOf(3) // 2 arr.indexOf(5) // -1 2. 要只是判断的话是可以遍历后判断对象的属性是否相同的,像这种: arr.forEach(item=>{ if(item.name=='Alex'){ alert('存在这个元素'); } }) 3. 但实际中往往是需要动态添加或删除对象或元素的,用这个方法的

JavaScript判断对象和数组

在调用后端接口时,由于后端接口的不规范统一,接口最外层在没有数据时返回的是空数组(其实更想要的是空json对象),而在有数据时返回的是json对象,所以在接收到后端返回的接口时就需要首先判断返回的数据是对象还是数组,这里提供一些方法 方法一: //判断是否为数组 function isArray(obj) { return obj instanceof Array; } //判断是否为对象 function isObject(obj) { return obj instanceof Object

JS中对象与数组(大括号{}与中括号[])

一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数. 如:var LangShen = {"Name":"Langshen","AGE":"28"}; 上面声明了一个名为“LangShen”的对象,多个属性或函数用,(逗号)隔开,因为是对象的属性, 所以访问时,应该用.(点)来层层访问:LangShen.Name.LangShen.AGE,当然我们也可以用数组的方式来访问,如:LangShen[&q

JS判断对象是否存在的方法

Javascript语言的设计不够严谨,很多地方一不小心就会出错. 举例来说,请考虑以下情况. 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对它进行声明.用自然语言描述的算法如下: if (myObj不存在){ 声明myObj; } 你可能会觉得,写出这段代码很容易.但是实际上,它涉及的语法问题,远比我们想象的复杂.Juriy Zaytsev指出,判断一个Javascript对象是否存在,有超过50种写法.只有对Javascript语言的实现细节非常清楚,才可能分得清它们的区别

js判断对象是否为空

/** *判断对象是否为空 * * @param e * @returns {Number} */function isEmptyObject(e) { var t; for (t in e) return !1; return !0 }

js实现对象或者数组深拷贝

今天遇到个问题,就是vue绑定的数组在push中所有的数组都会跟着改变.这个主要是因为 JavaScript中对象或者数组等引用类型,直接拷贝,改变一个另外一个也会改变: 有个简单的方法就是先转换为字符串再转换为json var arr = [1,2,3]; var arr1 = arr; arr1.push(4); console.log(arr); //[1,2,3,4] console.log(arr1);//[1,2,3,4] 上面这是没转换的. 1.通过JSON.stringfy()和

JS的对象、数组等处理方法:解构

对象方法简写 你可以在定义方法时省略function和 :: const obj = { insteadOfThis: function() { // do stuff }, youCanDoThis() { // do stuff } } 请注意,以上不是箭头函数,只是对象方法的简写语法. 解构对象 对象解构是获取对象并将其内部属性提取到对象外部变量的一种方法: const obj = { x: 1, y: 2 } // 不使用解构语法 const x = obj.x const y = ob