【Web前端问题】javascript中数组和类数组对象(Array-like Object)的区别?

javascript中数组和类数组对象(Array-like Object),有3个问题:

1、数组和类数组对象有什么区别?
2、类数组对象怎么产生?
3、我怎么知道一个东西是类数组对象?

请大佬说一下,谢谢

回答:

你好朋友,下面是我的理解,希望对你有帮助!

1、类数组有 length 属性,其他属性为非负整数的对象,不同的是类数组没有数组的方法,例如 push 等。

2、类数组怎么产生?参考 1 的特征,我们可以定义一个类数组如下:

let person = {

0: "小明",

1: "18",

length: 2

};

3、判断是不是类数组?根据 1 的描述可以简单写出一下代码:

function isLikeArray(o) {

if (typeof o === 'object' && isFinite(o.length) && o.length >= 0 && o.length < 4294967296){

// 4294967296: 2^32

return true

} else {

return false

}

}

4、常用的类数组转数组,通常用下面两种方法:

Array.prototype.slice.call(person);

Array.from(person);

回答:

数组就不介绍了,只说说类数组对象吧。

类数组对象:
arguments对象
NodeList(比如 document.getElementsByClassName('a') 得到的数据集
typedArray
...

最主要的区别:
类数组对象不能调用数组原型上的方法。就是:xx.push()、xx.slice()、xx.indexOf() 等等这些方法都不能用。

怎么判断是类数组对象:
不用特别去区分类数组对象,除了上面两种其它的其实也不常用了。区分好数组和对象就行了。

回答:


能提出这个问题,你的观察十分敏锐。

一般来说,我们都知道 arguments 是类数组对象。但其实不太了解,什么才是类数组对象,为何 arguments 它属于类数组对象。

数组和类数组对象有什么区别?

它们均可以通过索引进行元素的访问,都存在 length 属性;区别在于,类数组对象不具备数组的方法。

类数组对象怎么产生?

要想知道怎样生成一个类数组对象,必须先明白,什么是类数组对象。

在新版的 ECMA-262 文档中,我们可以看到已经有相关定义

它必须是对象
它有 length 属性

所以说,一个对象,只要它存在 length 属性,它就可以被视为类数组对象。

这就可以解释类数组对象如何产生:声明一个对象,设置它的 length 属性,那么就能产生了一个类数组对象。

我怎么知道一个东西是类数组对象?

判断标准:1、它是对象;2、它有 length 属性。

这里扩展一下 ——

通过查看 ECMA-262 文档可以看到,和类数组对象相关的还有 CreateListFromArrayLike(argArray)内置函数,它的作用是接收一个类数组对象,将其转换成数组。

我们不能在外部调用这个函数,但是通过 apply() 可以间接调用这个函数。我认为,这个函数可以间接地证明一个变量是否属于类数组对象。例如,你可以通过 Array.apply(null, arguments) 将参数转换成数组,arguments 就是类数组对象。

如果为我们向其传入字符串,例如 Array.apply(null, '123') ,那么,它将抛出错误:

Uncaught TypeError: CreateListFromArrayLike called on non-object

所以说,字符串并不是类数组对象。

你可能会有疑惑,如果字符串不是类数组对象,为什么能使用 Array.from() 将字符串转换成数组。Array.from()的作用不就是将类数组对象转换成数组吗?

答案在于 Array.from() 内部会将字符串转变成字符串对象,而字符串对象才是类数组对象。

欢迎➕关注个人公众号「前后端面试题带答案」,恰好有对这个问题的文章讨论。更详细的内容请参阅公众号文章,这里将重点列出,方便大家参考。
前后端面试题带答案

以上是 【Web前端问题】javascript中数组和类数组对象(Array-like Object)的区别? 的全部内容, 来源链接: utcz.com/a/142796.html

回到顶部