js中数组检测

方法1:检测数组,在ECMAScript3中,对于一个网页或一个全局作用域而言,使用instanceof即可:
if(arr instanceof Array) {}
问题:
(1)它假定只有一个全局执行环境,如果网页中包含多个框架,那实际上就存在两个以上不同的执行环境,从而存在两个及以上不同的Array构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与第二个框架中原生创建的数组分别具有各自不同的构造函数。
(2)在检测对象是原生对象还是开发人员自定义对象时也会有问题。


方法2:为解决上述问题,ECMAScript5中新增了方法 Array.isArray(arr)
if(Array.isArray(arr)) {}
注意:这个方法的目的是最终确定的某个值到底是不是数组,而不管它是在哪个全局执行环境中创建的。支持该方法的浏览器有:IE9+ Firefox4+  Safari5+  Opera10.5+  Chrome


方法3:对于尚未实现Array.isArray()这个方法的浏览器使用下列方法
①检测是否是原生数组:
function isArray(arr) {
return Object.prototype.toString.call(arr) == "[object Arrray]";
}

//此处对函数及正则表达式的检测进行扩展
②检测是否是原生函数;
function isFunction(arr) {
return Object.prototype.toString.call(arr) == "[object Function]";
}


③检测是否是正则表达式:
function isRegExp(arr) {
return Object.prototype.toString.call(arr) == "[object RegExp]";
}
原理:在任何值上调用object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串。每个类的内部都有一个[[class]]属性,这个属性中就指定了该字符串的构造函数名。由于原生数组的构造函数与全局作用域无关,因此使用toString()就能保证返回一致的值。
注意:①对于在IE中以COM对象形式实现的任何函数,isFunction()都将返回false(因为它们并非原生JS函数)


②这一技巧也广泛应用于检测JSON对象。Object的toString()方法不能检测非原生构造函数的构造函数的构造函数名。因此,开发人员定义的任何构造函数都将返回[[object Object]].有些js库会包含下列代码:
var isNativeJSON = window.JSON && Object.pototype.toString.call(JSON) == "[object JSON]";


//在web开发中能够区分原生与非原生js对象非常重要,只有这样才能确切知道某个对象到底有哪些功能。注意:Object.prototype.toString()本身也可能被修改。此处讨论的前提是Object.prototype.toString()是未被修改的原生版本。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值