es6判断数组是否包含某个元素,es6判断两个数组中的值是否相同
本教程运行环境:windows7系统,ECMAScript版本6,Dell G3电脑。
在ES5中判断变量是否为数组
在ES5中,我们至少有以下五种方法来判断一个值是否是数组:
var a=[];
//1.基于实例of
数组的实例;
//2.基于构造函数
a .构造函数===数组;
//3.基于Object.prototype.isPrototypeOf
array . prototype . isprototypeof(a);
//4.基于getPrototypeOf
object . getprototypeof(a)===array . prototype;
//5.基于Object.prototype.toString
object . prototype . tostring . apply(a)===[对象数组];以上,除了Object.prototype.toString,其他方法都无法正确判断变量的类型。
要知道,代码的运行环境是非常复杂的,一个变量可能会想尽办法迷惑它的创建者。你看。
var a={
__proto__: Array.prototype
};
//分别在控制台中测试运行以下代码
//1.基于实例of
数组的实例;//=真
//2.基于构造函数
a .构造函数===数组;//=真
//3.基于Object.prototype.isPrototypeOf
array . prototype . isprototypeof(a);//=真
//4.基于getPrototypeOf
object . getprototypeof(a)===array . prototype;//=高于true,所有4个方法都将返回true。为什么?我们只是手动将一个对象的__proto__属性指定为Array.prototype,这导致该对象继承了Array对象。这种不负责任的继承方式,让基于继承的判决方案瞬间土崩瓦解。
不仅如此,我们还知道Array是堆数据,变量只指向它的引用地址,所以每个页面的Array对象引用的地址是不一样的。iframe中声明的数组,其构造函数是iframe中的Array对象。如果在iframe中声明一个数组X,并将其赋给父页面的变量Y,那么在父页面中使用y instanceof Array必然导致false。最后一个返回一个字符串,所以不存在引用问题。事实上,多个页面或系统之间的交互只能通过字符串才能畅通无阻。
在ES6中判断变量是否为数组
鉴于数组的常用,在ES6中加入了Array.isArray方法。使用此方法确定变量是否为数组非常简单,如下所示:
array . isarray([]);//=真
Array.isArray({0: a ,长度:1 });//=false其实通过Object.prototype.toString判断一个值的类型也是各大主流库的标准。因此,Array.isArray的polyfill通常如下所示:
如果(!Array.isArray){
Array.isArray=function(arg){
return object . prototype . tostring . call(arg)==[对象数组];
};
}【相关推荐:javascript视频教程,web前端】以上是es6如何判断变量是否为数组的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。