js判断一个对象是数组(函数)的方法实例
1.typeof操作符
示例:
//数值 typeof37==='number'; //字符串 typeof''==='string'; //布尔值 typeoftrue==='boolean'; //Symbols typeofSymbol()==='symbol'; //Undefined typeofundefined==='undefined'; //对象 typeof{a:1}==='object'; typeof[1,2,4]==='object'; //下面的例子令人迷惑,非常危险,没有用处。避免使用它们。 typeofnewBoolean(true)==='object'; typeofnewNumber(1)==='object'; typeofnewString('abc')==='object'; //函数 typeoffunction(){}==='function';
从上面的实例我们可以看出,利用typeof除了array和null判断为object外,其他的都可以正常判断。
2.instanceof操作符和对象的constructor属性
这个操作符和JavaScript中面向对象有点关系,了解这个就先得了解JavaScript中的面向对象。因为这个操作符是检测对象的原型链是否指向构造函数的prototype对象的。
vararr=[1,2,3,1]; console.log(arrinstanceofArray);//true varfun=function(){}; console.log(funinstanceofFunction);//true
vararr=[1,2,3,1]; console.log(arr.constructor===Array);//true varfun=function(){}; console.log(arr.constructor===Function);//true
第2种和第3种方法貌似无懈可击,但是实际上还是有些漏洞的,当你在多个frame中来回穿梭的时候,这两种方法就亚历山大了。由于每个iframe都有一套自己的执行环境,跨frame实例化的对象彼此是不共享原型链的,因此导致上述检测代码失效
variframe=document.createElement('iframe');//创建iframe document.body.appendChild(iframe);//添加到body中 xArray=window.frames[window.frames.length-1].Array; vararr=newxArray(1,2,3);//声明数组[1,2,3] alert(arrinstanceofArray);//false alert(arr.constructor===Array);//false
4.使用Object.prototype.toString来判断是否是数组
Object.prototype.toString.call([])==='[objectArray]'//true Object.prototype.toString.call(function(){})==='[objectFunction]'//true
这里使用call来使toString中this指向obj。进而完成判断
5.使用原型链来完成判断
[].__proto__===Array.prototype//true varfun=function(){} fun.__proto__===Function.prototype//true
6.Array.isArray()
Array.isArray([])//true
ECMAScript5将Array.isArray()正式引入JavaScript,目的就是准确地检测一个值是否为数组。IE9+、Firefox4+、Safari5+、Opera10.5+和Chrome都实现了这个方法。但是在IE8之前的版本是不支持的。
总结:
综上所述,我们可以综合上面的几种方法,有一个当前的判断数组的最佳写法:
vararr=[1,2,3]; vararr2=[{name:'jack',age:22}]; functionisArrayFn(value){ //首先判断浏览器是否支持Array.isArray这个方法 if(typeofArray.isArray==="function"){ returnArray.isArray(value); }else{ returnObject.prototype.toString.call(value)==="[objectArray]"; //returnobj.__proto__===Array.prototype; } } console.log(isArrayFn(arr));//true console.log(isArrayFn(arr2));//true
上述代码中,为何我们不直接使用原型链的方式判断(兼容性好),而是先判断浏览器支不支持Array.isArray()这个方法,如果不支持才使用原型链的方式呢?我们可以从代码执行效率上看:
js如何判断一个对象是数组
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。