在 JS 中检查变量是否为数组的多种方式,并说说 ES6 引入检查数组的缘起!

 

下面的中检组的组代码片段用于检查变量或值是否为数组。在主流的查变查数浏览器可以使用Array.isArray方法。对于较旧的量否浏览器,可以使用polyfill

const variable = [🍝,为数 🍜, 🍲]; // 主流浏览器 Array.isArray(variable); // 老式浏览器 Object.prototype.toString.call(variable) === [object Array]; 

检查数组的现代方法

检查数组的最佳方法是使用内置的Array.isArray()

Array.isArray([]); // true Array.isArray([🍝]); // true Array.isArray(new Array(🍝)); // true 

浏览器支持

浏览器对 Array.isArray()的支持非常好 

适用于旧版浏览器的 Polyfill

如果需要让较早的浏览器支持,则可以使用此MDN polyfill。多种

if (!Array.isArray) {   Array.isArray = function(org) {     return Object.prototype.toString.call(org) === [object Array]   } } 

其它方式:使用 Lodash 或 Underscore

如果你使用的并说是外部库,它们也有一些内置方法?引缘起?

Lodash

检查值是否为数组对象。

const array = [🍝,入检 🍜, 🍲]; const notArray = not array; _.isArray(array); // true _.isArray(notArray); // false 

Underscore

如果对象是数组,返回 true。中检组的组

const array = [🍝,查变查数 🍜, 🍲]; const notArray = not array; _.isArray(array); // true _.isArray(notArray); // false 

为什么我们不能使用typeof?

通常,我们要检查值的量否类型,我们只需使用 typeof

typeof string; // string typeof 100; // number typeof true; // boolean typeof false; // boolean typeof function() {}; // function typeof {}; // object typeof []; // object <-- 😱 

问题是为数数组实际上处于 Object 数据类型的保护伞之下。所以typeof 返回值是多种没问题。云服务器不幸的并说是,这对我们并没有什么帮助,引缘起因为我们只想检查值是不是数组。

typeof

Type 例子 返回值 String typeof "hello" "string" Boolean typeof true

 typeof false "boolean" Number typeof 100 "number" Undefined typeof undefined "undefined" Function typeof function() {} "function" Null typeof null "object" 非基本类型 typeof {}

typeof [] "object"

基本类型

在 JS 中有 6 种基本数据类型

string number bigint boolean undefined symbol

非基本类型 (对象)

对象是指包含数据和使用数据的指令的数据结构。它们是通过引用存储的

我比较喜欢称它为“非基本类型 ”,但它们被称为Object。

object array function

尽管当我们在函数上使用typeof来检查函数的类型,它返回“ function”,但实际上它是一个对象。

》 MDN:尽管每个 Function 构造函数都是从 Object 构造函数派生的,但它是Function的特殊简写形式。

代码诊断

我收到了很多开发都提供用来检查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); // true <-- 😱 

instanceof 的问题

const array = [🍝, 🍜, 🍲]; array instanceof Array; // true 

这种方法在 ES5 很常见, 在许多情况下,这种可以很好的工作。但是,这有一个陷阱!它不适用于多个上下文(例如 框架 或windows)。因为每个框架在其自己的执行环境中都有不同的作用域。因此,它具有不同的全局对象和不同的构造函数。因此,如果尝试针对该框架的上下文测试数组,则该数组不会返回true,站群服务器而会错误地返回false。

window.frames: frames[] 是窗口中所有命名的框架组成的数组。这个数组的每个元素都是一个Window对象,对应于窗口中的一个框架。

const frameNode = document.createElement(iframe); // 创建一个iframe元素节点 document.body.appendChild(frameNode); // 从我们当前的窗口访问框架 const frameBrowser = window.frames[window.frames.length - 1]; // 访问我们创建的框架的“数组”对象 frameArray = frameBrowser.Array;  // 在我们的框架环境中创建一个新的数组 const newFrameArray = new frameArray(🍝, 🍜, 🍲); newFrameArray instanceof Array; // ❌ false Array.isArray(newFrameArray); // ✅ true 

构造函数的问题

const array = [🍝, 🍜, 🍲]; array.constructor === Array; // true 

这是另一个很好的解决方案。不幸的是,这和instanceof有同样的问题。它也不能在多个上下文中工作。

// ... newFrameArray.constructor === Array; // ❌ false Array.isArray(newFrameArray); // ✅ true 

作者:Samantha Ming 译者:前端小智 来源:medium

原文:https://www.samanthaming.com/tidbits/89-how-to-check-if-variable-is-array/

本文转载自微信公众号「大迁世界」,可以通过以下二维码关注。转载本文请联系大迁世界公众号。

应用开发
上一篇:假如你想清理你的 Ubuntu 主机,你可以按照以下的一些简单步骤来移除所有不需要的垃圾文件。移除多余软件包这又是一个内置功能,但这次我们不必使用新得立包管理软件(Synaptic Package Manager),而是在终端中达到目的。现在,在终端窗口中键入如下命令:复制代码代码如下:sudo apt-get autoclean这便激活了包清除命令。这个命令所做的工作是: 自动清除那些当你安装或升级程序时系统所缓存的 .deb 包(即清除 /var/cache/apt/archives 目录,不过只清理过时的包)。假如需要使用清除命令,只需在终端窗口中键入以下命令:复制代码代码如下:sudo apt-get clean然后你就可以使用自动移除命令。这个命令所做的工作是:清除那些 在系统中被某个已经卸载的软件 作为依赖所安装的软件包。要使用自动移除命令,在终端窗口中键入以下命令:复制代码代码如下:sudo apt-get autoremove移除不需要的本地化数据为达到此目的,我们需要安装 localepurge 软件,它将自动移除一些不需要的本地化数据(LCTT 译注:即各种语言翻译)。这个软件是一个简单的脚本,它将从那些不再需要的本地化文件和本地化联机手册( man pages ) 所占用的空间中回收磁盘空间。这个软件将在任何 apt 安装命令运行时 被自动激活。在 Ubuntu 中安装 localepurge:复制代码代码如下:sudo apt-get install localepurge在通过 apt-get install 安装任意软件后, localepurge 将移除所有不是使用你系统中所设定语言的翻译文件和翻译的联机手册。假如你想设置 localepurge,你需要编辑 /ect/locale.nopurge 文件。根据你已经安装的软件,这将为你节省几兆的磁盘空间。例子:假如我试着使用 apt-get 来安装 dicus软件:复制代码代码如下:sudo apt-get install discus在软件安装完毕之后,你将看到如下提示:复制代码代码如下:localepurge: Disk space freed in /usr/share/locale: 41860K移除孤包假如你想移除孤包,你需要安装 deborphan 软件:在 Ubuntu 中安装 deborphan :复制代码代码如下:sudo apt-get install deborphan使用 deborphan,打开终端并键入如下命令即可:复制代码代码如下:sudo deborphan | xargs sudo apt-get -y remove --purge使用 GtkOrphan 来移除孤包GtkOrphan (一个针对 debian 系发行版本的 Perl/Gtk2 应用) 是一个分析用户安装过程状态并查找孤立库文件的图形化工具,它为 deborphan 提供了一个 GUI 前端,并具备移除软件包的功能。在 Ubuntu 中安装 GtkOrphan,打开终端并运行如下命令:复制代码代码如下:sudo apt-get install gtkorphan一张截图使用 Wajig 移除孤包Wajig是 Debian 包管理系统中一个简单的软件包管理前端。它将 apt、apt-cache、 dpkg、 /etc/init.d 中的脚本等 通过一个单一命令集成在一起,它的设计初衷是使用简单和为它的所有功能提供丰富的文档。通过适当的 sudo配置,大多数(假如不是全部)的软件包安装和创建等任务可以通过一个用户 shell 来完成。Wajig 也适用于一般的系统管理。另外,一个 Gnome GUI 命令 gjig也被囊括在这个软件包之中。在 Ubuntu 中安装 Wajig,打开终端并运行如下命令:复制代码代码如下:sudo apt-get install wajigDebfoster --- 跟踪你在安装过程中的操作debfoster 将会维护一个列有被明确需要安装的软件包的列表,但不包括那些作为某个软件的依赖而被安装的软件包。参数是完全可选的,你甚至可以使得在 dpkg 和/或 apt-get 每次运行之后马上激活 debfoster 。另外,你还可以在命令行中使用 debfoster 来安装或移除某些特定的软件包。那些后缀为 --- 的软件包将会被移除,而没有后缀的软件包将会被安装。假如一个新的软件包或 debfoster 注意到作为某个软件包的依赖的软件包是一个孤包,则 debfoster 将会询问你下一步如何操作。若你决定保留这个孤包, debfoster 将只会进行记录并继续安装过程;若你觉得这个软件包不足以引起你的兴趣,在 debfoster 询问这个问题后,它将移除这个软件包。进一步的,假如你的决定使得其他的软件包变为孤包,更多的提问将会接踵而来。在 Ubuntu 中安装 debfoster,打开终端并运行如下命令:复制代码代码如下:sudo apt-get install debfoster使用 debfoster为了创建一个初始跟踪文件,可以使用如下命令:复制代码代码如下:sudo debfoster -q你总可以编辑 /var/lib/debfoster/keepers 文件,来定义那些你想留在系统中的软件包。为了编辑这个文件,可以键入:复制代码代码如下:sudo vi /var/lib/debfoster/keepers要强制使 debfoster 去移除所有没有被列在上面这个文件的软件包,或安装作为某些列在这个文件中的软件包的依赖,它也同时会添加所有在这个列表中没有被安装的软件包。若要根据这个列表来执行相关操作,只需执行:复制代码代码如下:sudo debfoster -f若需要跟踪你新安装的软件包,你需要时不时地执行如下命令:复制代码代码如下:sudo debfosterxdiskusage -- 查看你的硬盘空间都去哪儿了图形化地展示磁盘使用情况的 du。xdiskusage 是一个用户友好型的程序,它将为你展示你所有磁盘的使用情况。 它是在 Phillip C. Dykstra 所写的 “xdu” 程序的基础上设计的。做了一些修改以使得它可以为你运行 “du”命令,并显示磁盘的剩余空间,并且假如你想清晰地了解你的磁盘空间都去哪儿了,它还可以生成一个 PostScript 格式的名为 display.xdiskusage 的文件。在 Ubuntu 中安装 xdiskusage,只需使用如下命令:复制代码代码如下:sudo apt-get install xdiskusage若你想打开这个应用,你需要使用如下命令:复制代码代码如下: sudo xdiskusage一旦这个应用被打开,你将看到如下图所示的界面:BleachbitBleachBit 能快速地释放磁盘空间并不知疲倦地保护你的隐私。它可以释放缓存,删除 cookie,清除 Internet 上网历史,粉碎临时文件,删除日志,丢弃你所不知道存在何处的垃圾。为 Linux 和 Windows 系统而设计,它支持擦除清理数以千计的应用程序,如 Firefox, Internet Explorer, Adobe Flash, Google Chrome, Opera, Safari 等等。除了简单地删除文件,BleachBit 还包括许多高级功能,诸如粉碎文件以防止恢复,擦除磁盘空间来隐藏被其他应用程序所删除文件的痕迹,为火狐“除尘”,使其速度更快等。比免费更好,BleachBit 是一个开源软件。在 Ubuntu 中安装 Bleachbit,打开终端并运行如下命令:复制代码代码如下:sudo apt-get install bleachbit一张截图
下一篇:HTCE8(探索HTCE8的卓越功能和令人惊叹的设计)