【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