每日一题:如何判断是否是数组,一个既简单又复杂的问题。(不要再用Object.prototype.toString.call、instance of判断了!!!)

问题,prototype,call,instance of · 浏览次数 : 63

小编点评

1. 使用 `Object.prototype.toString.call()` 方法正常情况下无法识别数组类型。 2. 使用 `instanceof Array` 运算符可以正常识别数组类型。 3. `Array.isArray` 方法可以正常识别数组类型。

正文

1、不要使用Object.prototype.toString.call()

正常情况下:

const arr = [1,2,3,4,5]
const obj = {}
console.log(Object.prototype.toString.call(arr))//[Object,Array]
console.log(Object.prototype.toString.call(obj))//[Object,Object]

过去我们能够通过判断Object.prototype.toString.call(arr)第二个单词是否为Array来判断是否为数组,
但是时代变了,现在不行了。因为现在可以使用一个知名符号 toStringTag 改变生成的数组
例如:

const arr = [1,2,3,4,5]
const obj = {
    [Symbol.toStringTag]:'Array',
}
console.log(Object.prototype.toString.call(arr))//[Object,Array]
console.log(Object.prototype.toString.call(obj))//[Object,Array]

看到了吗?对象用这个方法,也可以把第二个单子变成Array。

虽然概率很小,但是不得不防。还是那句话你可以不用,但是你不能知道!!!

2、不要使用instance of

原理是通过判断一个对象上有没有Array的原型
正常情况下:

const arr = [1,2,3,4]
const obj = {}
console.log(arr instanceof Array) //true
console.log(obj instanceof Array) //false

说完正常情况下,就说一说不正常的情况下

  1. 通过Object.setPrototypeOf 将对象的原型改变为数组的原型
const arr = [1,2,3,4]
const obj = {}
Object.setPrototypeOf(obj,Array.prototype)
console.log(arr instanceof Array) //true
console.log(obj instanceof Array) //true

将对象也判断成数组了 ,哒咩

  1. 在页面环境中有iframe
    由于iframe会生成一套独立的document和独立的window,但是Array是window一个全局属性,这就造成了一个非常有意思的现象
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<iframe src="" frameborder="0"></iframe>
</body>
<script>
    const Array1 = window.Array
    const iframe = document.querySelector('iframe')
    const Array2 = iframe.contentWindow.Array
    const arr = new Array2()
    console.log(arr instanceof Array) //false
</script>
</html>

虽然我觉得出现这种情况的概率很小,但是还是那句话你可以不用,但是你不能知道!!!

3、唯一解:Array.isArray

const arr = [1,2,3,4,5]
//上述两种情况均可用Array.isArray判断
Array.isArray(arr) //true

4、免费的chatGPT

https://www.hangyejingling.cn/

与每日一题:如何判断是否是数组,一个既简单又复杂的问题。(不要再用Object.prototype.toString.call、instance of判断了!!!)相似的内容:

每日一题:如何判断是否是数组,一个既简单又复杂的问题。(不要再用Object.prototype.toString.call、instance of判断了!!!)

1、不要使用Object.prototype.toString.call() 正常情况下: const arr = [1,2,3,4,5] const obj = {} console.log(Object.prototype.toString.call(arr))//[Object,Array]

文心一言 VS 讯飞星火 VS chatgpt (104)-- 算法导论10.1 2题

二、用go语言,说明如何在一个数组 A[1..n]中实现两个栈,使得当两个栈的元素个数之和不为 n 时,两者都不会发生上溢。要求 PUSH 和 POP 操作的运行时间为 O(1)。 文心一言: 在这个问题中,我们要在一个数组 A[1..n] 中实现两个栈,使得当两个栈的元素个数之和不为 n 时,两者

文心一言 VS 讯飞星火 VS chatgpt (106)-- 算法导论10.1 4题

四、用go语言,重写 ENQUEUE 和 DEQUEUE 的代码,使之能处理队列的下溢和上溢。 文心一言: 在 Go 语言中,我们可以使用切片来实现队列。下面是如何实现 ENQUEUE 和 DEQUEUE 操作,同时处理队列的下溢和上溢的情况: package main import "fmt" t

后端每日一题 2:DNS 解析过程

本文首发于公众号:腐烂的橘子 本文梗概: DNS 是什么,有什么作用 一条 DNS 记录是什么样的 DNS 域名解析原理 DNS 服务器如何抵御攻击 DNS 是什么,有什么作用 DNS(Domain Name System)是一种应用层协议,用于映射域名和 ip 地址。 为什么要做映射呢?就像可以用

2024-06-15:用go语言,Alice 和 Bob 在一个环形草地上玩一个回合制游戏。 草地上分布着一些鲜花,其中 Alice 到 Bob 之间顺时针方向有 x 朵鲜花,逆时针方向有 y 朵鲜花

2024-06-15:用go语言,Alice 和 Bob 在一个环形草地上玩一个回合制游戏。 草地上分布着一些鲜花,其中 Alice 到 Bob 之间顺时针方向有 x 朵鲜花,逆时针方向有 y 朵鲜花。 游戏规则如下: 1.游戏从 Alice 开始。 2.每个回合中,当前玩家必须选择顺时针或逆时针,

大数据面试SQL每日一题系列:最高峰同时在线主播人数。字节,快手等大厂高频面试题

大数据面试SQL每日一题系列:最高峰同时在线主播人数。字节,快手等大厂高频面试题 之后会不定期更新每日一题sql系列。 SQL面试题每日一题系列内容均来自于网络以及实际使用情况收集,如有雷同,纯属巧合。 1.题目 问题1:如下为某直播平台各主播的开播及关播时间数据明细,现在需要计算该平台最高峰期同时

2024-04-27:用go语言,在一个下标从 1 开始的 8 x 8 棋盘上,有三个棋子,分别是白色车、白色象和黑色皇后。 给定这三个棋子的位置,请计算出要捕获黑色皇后所需的最少移动次数。 需要注意

2024-04-27:用go语言,在一个下标从 1 开始的 8 x 8 棋盘上,有三个棋子,分别是白色车、白色象和黑色皇后。 给定这三个棋子的位置,请计算出要捕获黑色皇后所需的最少移动次数。 需要注意的是,白色车可以垂直或水平移动,而白色象可以沿对角线移动,它们不能跳过其他棋子。 如果白色车或白色象

每日一题:通过css变量来控制主题

1、定义不同主题颜色 :root{ --theme-color: blue; --font-size: 18px;; } html[theme="dark"]{ --theme-color: #000; 2、通过切换html自定义属性来控制主题

每日一题:探究响应式本质,以最简单的方式理解响应式

1、响应式本质 就是把数据和函数相关联起来,当数据变化时,函数自动执行。当然这对于函数和数据也是有要求的 函数必须是以下几种: render computed watch watchEffect 数据必须是以下几种: 响应式数据 在函数中用到的数据 2、例子 2.1

每日一题:吃透大文件上传问题(附可运行的前后端源码)

大文件上传 前言 在日常开发中,文件上传是常见的操作之一。文件上传技术使得用户可以方便地将本地文件上传到Web服务器上,这在许多场景下都是必需的,比如网盘上传、头像上传等。 但是当我们需要上传比较大的文件的时候,容易碰到以下问题: 上传时间比较久 中间一旦出错就需要重新上传 一般服务端会对文件的大小