这是一个代码目录,用于检查变量或值是否为数组。您可以使用Array.isArray()方法。对于较旧的浏览器,可以使用polyfill👍
const variable = ['🍝','🍜','🍲'];//✅更新浏览器 Array.isArray(variable);//🕰旧浏览器 Object.prototype.toString.call(variable)==='[对象数组]';
检查数组的方法
检查Array的最佳方法是使用内置的Array.isArray()
👏
Array.isArray([]); // true
Array.isArray(['🍝']); // true
Array.isArray(new Array('🍝')); //正确
浏览器支持
的支持Array.isArray()
实际上还不错👍
- 浏览器支持:占位符显示
适用于旧版浏览器的Polyfill
如果需要较早的浏览器支持,则可以使用此MDN polyfill。
如果(!Array.isArray){
Array.isArray = function(arg){
return Object.prototype.toString.call(arg)==='[对象数组]';
};
}
使用Lodash或Underscore的其他方式
如果您使用的是外部库,它们也有一些内置方法👏
Lodash
检查value是否归类为Array对象。
const array = ['🍝','🍜','🍲']; const notArray ='非数组';_.isArray(array); // true _.isArray(notArray); //错误
下划线
如果object是Array,则返回true。
const array = ['🍝','🍜','🍲']; const notArray ='非数组';_.isArray(array); // true _.isArray(notArray); //错误
是的,语法与Lodash相同
我们为什么不能使用typeof
?
通常,我们想要检查值的类型,我们只需使用 typeof
typeof'字符串'; //' string'typeof 100; //' number'typeof true; //' boolean'typeof false; //' boolean'typeof function(){}; //'function'typeof {}; //'对象'类型 []; //'object'<-😱
问题在于Array实际上是在Objects数据类型的保护之下。所以typeof
确实返回如实。不幸的是,这对于只想检查该值是否为数组的人没有太大帮助。
typeof
表
原语
MDN :基元是不是对象且没有方法的数据类型。所有原语都是不可变的(即,它们不能被更改)。它们按值存储
在JavaScript中,有6种数据类型是原语。
- 串
- 数
- 比金特
- 布尔值
- 未定义
- 符号
非原语(对象)
MDN :对象是指包含数据和用于处理数据的指令的数据结构。它们通过引用存储
尽管我将其称为“非原始”,但它们被称为Objects。(我个人更喜欢
之所以如此,是因为我的大脑在谈论物体时通常会响起来{}
rings)
- 宾语
- 数组
- 功能
尽管当我们使用typeof
on 函数时,它"function"
实际上返回了一个对象。
MDN:尽管每个Function构造函数都是从Object构造函数派生的,但它是Function的特殊速记形式。
那么为什么不将简写扩展到array,我也不知道🤷♀️但是至少他们正在尝试使用内置方法来赎回自己Array.isArray()
😅
Code Buster 👩🔬
我收到了很多不同的解决方案,人们建议我们使用这些解决方案来检查Array。乍一看,它们似乎是不错的解决方案。但不幸的是,有些问题或极端情况使它们不理想。所以让我们做一些代码破坏💉
问题 Array.length
const array = ['🍝','🍜','🍲'];array.length; // 3
😷因此,如果数组有长度,我们可以假定它是数组?
遗憾的是,此解决方案的问题在于还有其他具有长度即为的数据类型。字符串。因此,这可能导致误报。
const string ='not array';string.length; // 9
length
如果设置它,即使对象也可以具有属性😱
const object = {length:2}; const array = ['🍝','🍜','🍲'];typeof array ==='object'&& Boolean(array.length); // true typeof object ==='object'&& Boolean(object.length); //正确<-😱
⚠当然,这还有很多问题-这在检查空数组上不起作用,因为它0
被认为是错误的。无论如何,TLDR;只需使用Array.isArray()
👍医生的命令👩⚕️
问题 instanceof
const array = ['🍝','🍜','🍲'];数组实例 //正确
This⚕️这是我也看到人们引用的常见解决方案。老实说,这是一个很好的。在许多情况下,这将按预期工作。但是,这有一个陷阱!它不适用于多个上下文(例如框架或窗口)。因为每个框架在其自己的执行环境中都有不同的作用域。因此,它具有不同的全局对象和不同的构造函数。因此,如果您尝试针对该框架的上下文测试数组,则该数组将不会返回true
,而是会错误地返回false
。
const frameNode = document.createElement('iframe'); //创建一个iframe元素节点 document.body.appendChild(frameNode); //附加框架元素 const frameBrowser = window.frames [window.frames.length-1]; //从当前窗口访问框架 frameArray = frameBrowser.Array; //访问我们创建的框架的“ Array”对象//在我们的框架环境中创建一个新的数组 const newFrameArray = new frameArray('🍝','🍜','🍲');newFrameArray Array的instance; //❌假Array.isArray(newFrameArray); //✅是
问题 constructor
const array = ['🍝','🍜','🍲'];array.constructor ===数组; //正确
This⚕️这是另一个非常好的解决方案。不幸的是,这遭受了与相同的问题instanceof
。它也不适用于多个上下文。
// ...newFrameArray.constructor ===数组; //❌假Array.isArray(newFrameArray); //✅是
- @fabiokounang:_示例之一可能是如果您正在创建动态表,那么如果它是一个数组,则要循环该数组并将其输出到表中,但是如果它只是一个对象,则可以按其循环键首先使用Object.keys,然后循环所有键和值。
- 与条件条件一起使用非常好。如果是数组,则要执行某些操作;如果不是数组,则要执行其他操作。