• 赚钱入口【需求资源】限时招募流量主、渠道主,站长合作;【合作模式】CPS长期分成,一次推广永久有收益。主动打款,不扣量;

如何在JavaScript中检查Variable是否为数组

JavaScript rin, seun 10个月前 (06-20) 113次浏览 0个评论

这是一个代码目录,用于检查变量或值是否为数组。您可以使用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()实际上还不错👍

如何在JavaScript中检查Variable是否为数组

  • 浏览器支持:占位符显示

适用于旧版浏览器的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 表

如何在JavaScript中检查Variable是否为数组

原语

MDN :基元是不是对象且没有方法的数据类型。所有原语都是不可变的(即,它们不能被更改)。它们按值存储

在JavaScript中,有6种数据类型是原语。

  1. 比金特
  2. 布尔值
  3. 未定义
  4. 符号

非原语(对象)

MDN :对象是指包含数据和用于处理数据的指令的数据结构。它们通过引用存储

尽管我将其称为“非原始”,但它们被称为Objects。(我个人更喜欢

之所以如此,是因为我的大脑在谈论物体时通常会响起来{}rings)

  1. 宾语
  2. 数组
  3. 功能

尽管当我们使用typeofon 函数时,它"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,然后循环所有键和值。
  • 与条件条件一起使用非常好。如果是数组,则要执行某些操作;如果不是数组,则要执行其他操作。
喜欢 (0)

您必须 登录 才能发表评论!