区块链技术博客
www.b2bchain.cn

没有那么简单:如何判断变量是不是数组求职学习资料

本文介绍了没有那么简单:如何判断变量是不是数组求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

数组是JavaScript常见的类型,相信每一个前端开发都对它非常熟悉。然而很多人对如何判断变量是否为数组不太清楚。我也经常在面试中使用这个问题测试候选人对数组的了解程度,有的人表示不知道,有的人给出的判断方法不正确,仅有一小部分人能给出正确的答案。

今天我们就一起整理一下所有可能的方式,一起探讨每种方式的优缺点。以小见大,深入理解。

1. 使用 length属性 判断

相信很多开发小伙伴一下就能认识到这种方式不靠谱,但是在面试中我不止一次听到过这个答案。我推测给出这个答案的原因是对数组 length 属性太熟悉,下意识以为只有数组有这个属性。
没有那么简单:如何判断变量是不是数组
如上图所示,不仅数组有 length 属性,对象和字符串也有。所以根据这一属性无法判断出变量是否为数组。

2. 使用 typeof 判断

给出这个答案的同学对JavaScript类型判断有一些了解了,但是没有考虑到数组的特殊性。typeof 会返回一个表示数据类型的字符串。下面是不同数据类型对应的 typeof 返回值:
没有那么简单:如何判断变量是不是数组

typeof 返回值

从上表中可以看出,Null, Object, Arraytypeof 返回值都是 object。因此这种方式也不能区分出变量是不是数组。
没有那么简单:如何判断变量是不是数组

3. 使用 instanceof 判断

instanceof 能够检测 构造函数的 prototype 属性是否在对象的原型链上。举个栗子说明一下,方便理解。
没有那么简单:如何判断变量是不是数组

instanceof 的判断过程是在检测对象的原型链上寻找构造函数的 prototype 属性。

第一个判断结果为 true 是因为 People.prototype 存在于 owen 的原型链上。
第二个判断结果为 false 是因为 String.prototype 不存在于 owen 的原型链上。

简单来说,instanceof 可以判断变量是否是由构造函数生成的。因为数组 Array 也是一个构造函数,所以可以用 instanceof 判断变量是不是数组。
没有那么简单:如何判断变量是不是数组

Array.prototype 存在于 arr 的原型链上,其他两个变量的原型链上不存在。

但是这种方式真的能100%判断正确吗?我们再看一下 instanceof 判断的原理,检测构造函数的 prototype 属性是否在对象的原型链上。
如果修改了对象的原型链呢?
没有那么简单:如何判断变量是不是数组

修改了 arr 的原型链之后,instanceof 判断就不准确了。

instanceof 在跨 iframe / window 时也会判断错误,因为使用的不是同一个构造函数。举个例子:
“`
const iframeEl = document.createElement(‘iframe’);
document.body.appendChild(iframeEl);
iframeArray = window.frames[window.frames.length – 1].Array;

const array1 = new Array(1,1,1,1);
const array2 = new iframeArray(1,1,1,1);

console.log(array1 instanceof Array); // true
console.log(array2 instanceof Array); // false

数组是JavaScript常见的类型,相信每一个前端开发都对它非常熟悉。然而很多人对如何判断变量是否为数组不太清楚。我也经常在面试中使用这个问题测试候选人对数组的了解程度,有的人表示不知道,有的人给出的判断方法不正确,仅有一小部分人能给出正确的答案。

今天我们就一起整理一下所有可能的方式,一起探讨每种方式的优缺点。以小见大,深入理解。

1. 使用 length属性 判断

相信很多开发小伙伴一下就能认识到这种方式不靠谱,但是在面试中我不止一次听到过这个答案。我推测给出这个答案的原因是对数组 length 属性太熟悉,下意识以为只有数组有这个属性。
没有那么简单:如何判断变量是不是数组
如上图所示,不仅数组有 length 属性,对象和字符串也有。所以根据这一属性无法判断出变量是否为数组。

2. 使用 typeof 判断

给出这个答案的同学对JavaScript类型判断有一些了解了,但是没有考虑到数组的特殊性。typeof 会返回一个表示数据类型的字符串。下面是不同数据类型对应的 typeof 返回值:
没有那么简单:如何判断变量是不是数组

typeof 返回值

从上表中可以看出,Null, Object, Arraytypeof 返回值都是 object。因此这种方式也不能区分出变量是不是数组。
没有那么简单:如何判断变量是不是数组

3. 使用 instanceof 判断

instanceof 能够检测 构造函数的 prototype 属性是否在对象的原型链上。举个栗子说明一下,方便理解。
没有那么简单:如何判断变量是不是数组

instanceof 的判断过程是在检测对象的原型链上寻找构造函数的 prototype 属性。

第一个判断结果为 true 是因为 People.prototype 存在于 owen 的原型链上。
第二个判断结果为 false 是因为 String.prototype 不存在于 owen 的原型链上。

简单来说,instanceof 可以判断变量是否是由构造函数生成的。因为数组 Array 也是一个构造函数,所以可以用 instanceof 判断变量是不是数组。
没有那么简单:如何判断变量是不是数组

Array.prototype 存在于 arr 的原型链上,其他两个变量的原型链上不存在。

但是这种方式真的能100%判断正确吗?我们再看一下 instanceof 判断的原理,检测构造函数的 prototype 属性是否在对象的原型链上。
如果修改了对象的原型链呢?
没有那么简单:如何判断变量是不是数组

修改了 arr 的原型链之后,instanceof 判断就不准确了。

instanceof 在跨 iframe / window 时也会判断错误,因为使用的不是同一个构造函数。举个例子:
“`
const iframeEl = document.createElement(‘iframe’);
document.body.appendChild(iframeEl);
iframeArray = window.frames[window.frames.length – 1].Array;

const array1 = new Array(1,1,1,1);
const array2 = new iframeArray(1,1,1,1);

console.log(array1 instanceof Array); // true
console.log(array2 instanceof Array); // false

数组是JavaScript常见的类型,相信每一个前端开发都对它非常熟悉。然而很多人对如何判断变量是否为数组不太清楚。我也经常在面试中使用这个问题测试候选人对数组的了解程度,有的人表示不知道,有的人给出的判断方法不正确,仅有一小部分人能给出正确的答案。

今天我们就一起整理一下所有可能的方式,一起探讨每种方式的优缺点。以小见大,深入理解。

1. 使用 length属性 判断

相信很多开发小伙伴一下就能认识到这种方式不靠谱,但是在面试中我不止一次听到过这个答案。我推测给出这个答案的原因是对数组 length 属性太熟悉,下意识以为只有数组有这个属性。
没有那么简单:如何判断变量是不是数组
如上图所示,不仅数组有 length 属性,对象和字符串也有。所以根据这一属性无法判断出变量是否为数组。

2. 使用 typeof 判断

给出这个答案的同学对JavaScript类型判断有一些了解了,但是没有考虑到数组的特殊性。typeof 会返回一个表示数据类型的字符串。下面是不同数据类型对应的 typeof 返回值:
没有那么简单:如何判断变量是不是数组

typeof 返回值

从上表中可以看出,Null, Object, Arraytypeof 返回值都是 object。因此这种方式也不能区分出变量是不是数组。
没有那么简单:如何判断变量是不是数组

3. 使用 instanceof 判断

instanceof 能够检测 构造函数的 prototype 属性是否在对象的原型链上。举个栗子说明一下,方便理解。
没有那么简单:如何判断变量是不是数组

instanceof 的判断过程是在检测对象的原型链上寻找构造函数的 prototype 属性。

第一个判断结果为 true 是因为 People.prototype 存在于 owen 的原型链上。
第二个判断结果为 false 是因为 String.prototype 不存在于 owen 的原型链上。

简单来说,instanceof 可以判断变量是否是由构造函数生成的。因为数组 Array 也是一个构造函数,所以可以用 instanceof 判断变量是不是数组。
没有那么简单:如何判断变量是不是数组

Array.prototype 存在于 arr 的原型链上,其他两个变量的原型链上不存在。

但是这种方式真的能100%判断正确吗?我们再看一下 instanceof 判断的原理,检测构造函数的 prototype 属性是否在对象的原型链上。
如果修改了对象的原型链呢?
没有那么简单:如何判断变量是不是数组

修改了 arr 的原型链之后,instanceof 判断就不准确了。

instanceof 在跨 iframe / window 时也会判断错误,因为使用的不是同一个构造函数。举个例子:
“`
const iframeEl = document.createElement(‘iframe’);
document.body.appendChild(iframeEl);
iframeArray = window.frames[window.frames.length – 1].Array;

const array1 = new Array(1,1,1,1);
const array2 = new iframeArray(1,1,1,1);

console.log(array1 instanceof Array); // true
console.log(array2 instanceof Array); // false

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 没有那么简单:如何判断变量是不是数组求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们