以下代码片段用于检查变量或值是否为数组。Array.isArray方法可以在主流浏览器中使用。对于老浏览器,可以使用polyfillconstvariable=['🍝','🍜','🍲'];//主流浏览器Array.isArray(variable);//老式浏览Object.prototype.toString.call(variable)==='[objectArray]';检查数组的现代方法检查数组的最佳方法是使用内置的Array.isArray()Array.isArray([]);//trueArray.isArray(['🍝']);//trueArray.isArray(newArray('🍝'));//真正的浏览器支持浏览器对Array.isArray()的支持非常好并且适用于旧浏览器的Polyfill如果您需要对旧浏览器的支持,您可以使用这个MDNpolyfill。if(!Array.isArray){Array.isArray=function(org){returnObject.prototype.toString.call(org)==='[objectArray]'}}其他方式:如果您使用外部库,请使用Lodash或Underscore,它们也有一些内置方法——Lodash检查一个值是否是一个数组对象。constnotArray=['🍝','🍜','🍲'];constnotArray='notarray';_.isArray(array);//true_.isArray(notArray);//falseUnderscore如果对象是数组,则返回true。constnotArray=['🍝','🍜','🍲'];constnotArray='notarray';_.isArray(array);//true_.isArray(notArray);//false为什么我们不能使用typeof?通常,我们要检查一个值的类型,我们只是使用typeoftypeof'string';//'string'typeof100;//'number'typeoftrue;//'boolean'typeoffalse;//'boolean'typeofffunction(){};//'function'typeof{};//'object'typeof[];//'object'<--😱问题是数组实际上在Object数据类型的保护之下。所以typeof的返回值是没有问题的。不幸的是,这并不能真正帮助我们,因为我们只想检查该值是否为数组。typeof类型示例返回值Stringtypeof"hello""string"Booleantypeoftruetypeoffalse"boolean"Numbertypeof100"number"Undefinedtypeofundefined"undefined"Functiontypeoffunction(){}"function"Nulltypeofnull"object"non基本类型typeof{}typeof[]"object"基本类型JS中的基本数据类型有6种.它们是通过引用存储的,我更喜欢称它为“非原始类型”,但它们被称为对象。objectarrayfunction虽然当我们在函数上使用typeof来检查函数的类型时它返回“function”,但它实际上是一个对象。MDN:虽然每个Function构造函数都派生自Object构造函数,但它是Function的特殊简写。代码诊断我收到了开发人员提供的许多不同的检查数组的解决方案。乍一看,它们似乎是一个很好的解决方案。有点遗憾的是,有些问题或极端情况使它们不太理想。Array.length的问题constarray=['🍝','🍜','🍲'];array.length;//3如果数组有长度,我们可以假设它是数组?抱歉不幸的是,这个解决方案的问题是还有其他具有长度的数据类型,例如:字符串。因此,这可能会导致误报。conststring='notarray';string.length;//9即使是对象也可以有长度属性:constobject={length:2};constarray=['🍝','🍜','🍲'];typeofarray==='object'&&Boolean(array.length);//truetypeofobject==='object'&&Boolean(object.length);//true<--😱instanceof的问题constarray=['🍝','🍜','🍲'];arrayinstanceofArray;//true这个方法在ES5中很常见,在很多情况下,这样可以很好的工作。但是,这有一个问题!它不适用于多个上下文(例如框架或窗口)。因为每个框架在它自己的执行环境中都有不同的作用域。因此,它具有不同的全局对象和不同的构造函数。因此,如果您尝试根据框架的上下文测试数组,它不会返回true,而是错误地返回false。window.frames:frames[]是窗口中所有命名框架的数组。该数组的每个元素都是一个Window对象,对应于窗口中的一个框架。constframeNode=document.createElement('iframe');//创建一个iframe元素节点document.body.appendChild(frameNode);//从我们当前窗口访问frameconstframeBrowser=window.frames[window.frames.length-1];//访问我们创建的框架的“数组”对象frameArray=frameBrowser.Array;//在我们的框架环境中创建一个新数组127858;');newFrameArrayinstanceofArray;//?falseArray.isArray(newFrameArray);//?真正的构造函数问题constarray=['🍝','🍜','🍲'];array.constructor===Array;//true这是另一个很好的解决方案。不幸的是,这与instanceof有同样的问题。它也不适用于多种情况。//...newFrameArray.constructor===Array;//?falseArray.isArray(newFrameArray);//?truecom/tidbits/89-how-to-check-if-variable-is-array/这篇文章是转载自微信公众号“大千世界”,可通过以下二维码关注。转载本文请联系大千世界公众号。
