当前位置: 首页 > Web前端 > JavaScript

JavaScript判断是否为数组的方法总结

时间:2023-03-26 20:51:50 JavaScript

前言在我们日常的开发中,经常会有判断一个值的类型的需求。今天我们总结了几种常见的判断是否为数组的JavaScript方法。Array.isArrayArray.isArray()是一个新的ES5方法,用于判断传入的值是否为数组。如果是数组则返回true,否则返回false。让arr=[];console.log(Array.isArray(arr));//true以下函数调用全部返回true:Array.isArray([]);Array.isArray([1]);Array.isArray(newArray());Array.isArray(newArray("a","b","c","d"));需要注意的一点是:其实Array.prototype也是一个数组。Array.isArray(Array.prototype);//true以下函数调用全部返回false:Array.isArray();Array.isArray({});Array.isArray(null);Array.isArray(undefined);Array.isArray(17);Array.isArray('Array');Array.isArray(true);Array.isArray(false);Array.isArray(newUint8Array(32))Array.isArray({__proto__:Array.prototype});兼容性如下图所示:可以看到,主流浏览器的新版本都支持这种方式,大家可以放心使用。constructorObject的每个实例都有一个constructor构造器,用于保存创建当前对象所用的函数letarr=[];console.log(arr.constructor===Array);//true需要注意的是构造函数有被修改的风险,判断结果不一定准确,例如:letarr=[1,2,3];arr.constructor=function(){}console.log(arr.constructor===Array);//一般为false不建议使用constructor判断是否为数组,只需要知道有这个方法即可。instanceofinstanceof运算符用于检测构造函数的原型属性是否出现在实例对象的原型链上。例如://定义构造函数C(){}functionD(){}varo=newC();oinstanceofC;//正确,因为Object.getPrototypeOf(o)===C.prototypeoinstanceofD;//false,因为D.prototype不在o的原型链上oinstanceofObject;//true,因为Object.prototype.isPrototypeOf(o)返回trueC.prototypeinstanceofObject;//true,如上使用instanceof判断是否为数组使用如下:letarr=[];console.log(arrinstanceofArray);//true使用instanceof需要注意两点:构造函数的原型和实例的原型链可能会发生变化,所以判断的结果不一定是常量。在带有iframe的页面脚本中使用instanceof可能会得到错误的结果,因为iframe具有独立的全局环境,不同的全局环境具有不同的全局对象,因此具有不同的内置类型构造函数。isPrototypeOfisPrototypeOf()可用于测试一个对象是否存在于另一个对象的原型链上。用法如下:functionFoo(){}functionBar(){}functionBaz(){}Bar.prototype=Object.create(Foo.prototype);Baz.prototype=Object.create(Bar.prototype);varbaz=newBaz();console.log(Baz.prototype.isPrototypeOf(baz));//trueconsole.log(Bar.prototype.isPrototypeOf(baz));//trueconsole.log(Foo.prototype.isPrototypeOf(baz));//trueconsole.log(Object.prototype.isPrototypeOf(baz));//true如果想通过isPrototypeOf判断传入参数是否为数组,可以这样使用:letarr=[];console.log(Array.prototype.isPrototypeOf(arr));//trueObject.prototype.toString每个对象都有一个toString()方法,当对象被表示为文字值时,或者当对象以预期的字符串方式被引用时,该方法会自动调用。默认情况下,toString()方法由每个Object对象继承。如果在自定义对象中未覆盖此方法,则toString()返回“[objecttype]”字符串,其中type是对象的类型。通过toString()可以得到每个对象的类型。为了让每个对象都能被Object.prototype.toString()检测到,需要以Function.prototype.call()或Function.prototype.apply()的形式调用,将要检测的对象作为第一个参数,叫做thisArg。用法如下:vartoString=Object.prototype.toString;toString.call(newDate);//[对象日期]toString.call(newString);//[对象字符串]toString.call(Math);//[objectMath]//自JavaScript1.8.5toString.call(undefined);//[对象未定义]toString.call(null);//[objectNull]如果要判断一个对象是否为数组,可以这样使用:letarr=[];console.log(Object.prototype.toString.call(arr)==="[对象数组]");//true兼容性如下:typeof说到判断类型,很多人可能会想到typeof方法,这里先回顾一下typeof的相关内容。typeof运算符返回一个字符串,表示未计算的操作数的类型。控制台日志(类型42);//"number"console.log(typeof'blubber');//"string"console.log(typeoftrue);//"boolean"console.log(typeofundeclaredVariable);//"undefined"typeof可能的返回值如下:从上图可以看出,数组对象属于"anyotherobject",所以数组对象的typeof的返回值为“object”:letarr=[];console.log(typeofarr);//"object"所以,我们应该尽量避免使用typeof。综上所述,以上就是判断一个值是否为数组的几种方法。当然,有的有用,有的没用,但不管怎样,我们知道有这样一个东西是好的。总结一下:最好的方法是Array.isArray,但是不支持IE8及以下。如果考虑兼容性,您可以使用Object.prototype.toString。~~本文到此结束,感谢阅读!~学习有趣的知识,认识有趣的朋友,塑造有趣的灵魂!大家好,我是〖编程三昧〗的作者王隐,我的公众号是《编程三昧》,欢迎关注,希望大家多多指教!你来,怀揣期待,我以墨香迎接你!您归来,不分得失,只送回味!知识与技能并重,内功与外功并重,理论与实践两手抓,两手都要用力!