vaakian / vaakian.github.io

some notes
https://vaakian.github.io
3 stars 0 forks source link

数组也是对象——人造数组 #40

Open vaakian opened 2 years ago

vaakian commented 2 years ago

众所周知,数组本身就是对象,且它的key其实是被转换成了字符串! 分3步走:

  1. 创建键值对,这时候控制台打印出来是花括号的对象,显然不像数组。 image

  2. 添加数组重要的属性:length,这时候会更加奇怪,花括号的对象+奇怪的length属性。 image

  3. 不要着急,最重要的一部分,偷换原型。 image

大功告成!

let artificialArray = {
    0: 'a',
    1: 'b',
    2: 'c',
    3: 'd',
    4: 'e'
}
artificialArray.length = 5
artificialArray.__proto__ = Array.prototype
console.log(artificialArray)

这个时候,artificialArray拥有了所有的数组方法包括mapreduceforEach等等。

image

在需要数组迭代器的地方,也能够正常迭代,而不会把length属性也遍历到。

image

vaakian commented 2 years ago

但是通过Array.isArrayObject.toString.call()依然无法正常判断其为数组。 还需要进一步研究。