如何在 JavaScript 中检查变量是否为数组
以下是一个代码示例,用于检查变量或值是否为数组。您可以使用 Array.isArray() 方法。对于较旧的浏览器,您可以使用 polyfill 👍
const variable = ['🍝', '🍜', '🍲'];
// ✅ NEWER BROWSER
Array.isArray(variable);
// 🕰 OLDER BROWSER
Object.prototype.toString.call(variable) === '[object Array]';
检查数组的现代方法
检查数组的最佳方法是使用内置的Array.isArray()
👏
Array.isArray([]); // true
Array.isArray(['🍝']); // true
Array.isArray(new Array('🍝')); // true
浏览器支持
对的支持Array.isArray()
实际上非常好👍
浏览器 | |
---|---|
铬合金 | ✅ |
火狐 | ✅ |
Safari | ✅ |
边缘 | ✅ |
Internet Explorer 9 | ✅ |
适用于旧版浏览器的 Polyfill
如果您需要旧版浏览器支持,那么您可以使用这个MDN polyfill。
if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}
使用 Lodash 或 Underscore 的其他方法
如果您使用外部库,它们也有一些内置方法👏
Lodash
检查值是否被归类为数组对象。
const array = ['🍝', '🍜', '🍲'];
const notArray = 'not array';
_.isArray(array); // true
_.isArray(notArray); // false
下划线
如果对象是数组,则返回 true。
const array = ['🍝', '🍜', '🍲'];
const notArray = 'not array';
_.isArray(array); // true
_.isArray(notArray); // false
是的,语法与 Lodash 相同🤓
为什么我们不能使用typeof
?
通常,我们想要检查一个值的类型,我们只需使用typeof
typeof 'string'; // 'string'
typeof 100; // 'number'
typeof true; // 'boolean'
typeof false; // 'boolean'
typeof function() {}; // 'function'
typeof {}; // 'object'
typeof []; // 'object' <-- 😱
问题在于,Array 实际上属于Object数据类型。所以typeof
它确实返回了真实的值。不幸的是,这对于我们这些只想检查值是否为数组的人来说没什么用 🙊
typeof
桌子
类型 | 例子 | 返回 |
---|---|---|
细绳 | typeof "hello" |
“细绳” |
布尔值 | typeof true typeof false |
“布尔值” |
数字 | typeof 100 |
“数字” |
不明确的 | “不明确的” | |
功能 | typeof function() {} |
“功能” |
无效的 | typeof null |
“目的” |
非原始 | typeof {} typeof [] |
“目的” |
原语
MDN:原始数据类型是指既不是对象,也没有方法的数据类型。所有原始数据类型都是不可变的(即无法更改)。它们以值的形式存储。
在 JavaScript 中,有 6 种原始数据类型。
- 细绳
- 数字
- 大整数
- 布尔值
- 不明确的
- 象征
非原始类型(对象)
MDN:对象是指包含数据和操作数据的指令的数据结构。它们通过引用存储。
虽然我称之为“非原始”,但它们被称为“对象”。(我个人更喜欢前者,因为当我谈到对象时,我的大脑通常会响起{}
😳)
- 目的
- 大批
- 功能
尽管当我们使用typeof
函数时它返回的实际上"function"
是一个对象。
MDN:它是作为函数的一种特殊简写,尽管每个函数构造函数都是从对象构造函数派生出来的。
那么为什么简写没有扩展到数组呢,我不知道🤷♀️但至少他们正在尝试用内置方法来挽回自己Array.isArray()
😅
代码破坏者👩🔬
我收到了很多不同的解决方案,大家建议我们用它们来检查数组。乍一看,它们似乎很棒。但不幸的是,它们存在一些问题或极端情况,使得它们并不理想。所以,让我们来做一些代码破解吧💉
问题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); // true <-- 😱
⚠ 当然,这还有很多问题——这在检查空数组时不起作用,因为0
会被判定为 false。总之,长话短说;直接用Array.isArray()
👍 医生的嘱咐 👩⚕️
问题instanceof
const array = ['🍝', '🍜', '🍲'];
array instanceof Array; // true
👩⚕️这是我看到人们经常提到的一个解决方案。说实话,这确实是一个好主意。在很多情况下,它都能按预期工作。但是,这里存在一个问题!它不适用于多个上下文(例如框架或窗口)。因为每个框架都有不同的作用域和各自的执行环境。因此,它有不同的全局对象和不同的构造函数。所以,如果你尝试根据该框架的上下文测试一个数组,它不会返回true
,而是会错误地返回false
。
const frameNode = document.createElement('iframe'); // Create an iframe Element Node
document.body.appendChild(frameNode); // Append our frame element
const frameBrowser = window.frames[window.frames.length - 1]; // Access the frame from our current window
frameArray = frameBrowser.Array; // Access the "Array" object of the frame we created
// Create a new Array in our frame environment
const newFrameArray = new frameArray('🍝', '🍜', '🍲');
newFrameArray instanceof Array; // ❌ false
Array.isArray(newFrameArray); // ✅ true
问题constructor
const array = ['🍝', '🍜', '🍲'];
array.constructor === Array; // true
👩⚕️ 这又是一个很棒的解决方案。可惜的是,它和 有同样的问题instanceof
。它也不适用于多个上下文。
// ...
newFrameArray.constructor === Array; // ❌ false
Array.isArray(newFrameArray); // ✅ true
社区意见
-
[ @fabiokounang ](https://www.instagram.com/p/B-pfVTALEf/):其中一个例子可能是您正在制作一个动态表,因此如果它是一个数组,您想要循环该数组并将其输出到表中,但如果它只是一个对象,您可以先使用 Object.keys 循环它的键,然后循环所有的键和值。
-
这非常适合与条件语句一起使用。如果是数组,则执行某些操作;如果不是数组,则执行其他操作。
参考
- MDN Web 文档:Array.isArray()
- w3schools:Array.isArray()
- MDN Web 文档:instanceof 和多重上下文
- MDN 网络文档:instanceof 与 isArray
- MDN
- 2性:Array.isArray
- StackOverflow:如何检查 JavaScript 中的变量是否为数组?
- StackOverflow:如何检查一个对象是否是一个数组?
- JavaScript:回顾原始和非原始数据类型
- MIT:绝对准确地确定 JavaScript 对象是否为数组
感谢阅读❤
欲了解更多代码花絮,请访问samanthaming.com