Open vaakian opened 2 years ago
众所周知,数组本身就是对象,且它的key其实是被转换成了字符串! 分3步走:
创建键值对,这时候控制台打印出来是花括号的对象,显然不像数组。
花括号
添加数组重要的属性:length,这时候会更加奇怪,花括号的对象+奇怪的length属性。
不要着急,最重要的一部分,偷换原型。
let artificialArray = { 0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e' } artificialArray.length = 5 artificialArray.__proto__ = Array.prototype console.log(artificialArray)
这个时候,artificialArray拥有了所有的数组方法包括map、reduce、forEach等等。
artificialArray
map
reduce
forEach
在需要数组迭代器的地方,也能够正常迭代,而不会把length属性也遍历到。
length
但是通过Array.isArray和Object.toString.call()依然无法正常判断其为数组。 还需要进一步研究。
Array.isArray
Object.toString.call()
众所周知,数组本身就是对象,且它的key其实是被转换成了字符串! 分3步走:
创建键值对,这时候控制台打印出来是
花括号
的对象,显然不像数组。添加数组重要的属性:length,这时候会更加奇怪,
花括号
的对象+奇怪的length属性。不要着急,最重要的一部分,偷换原型。
大功告成!
这个时候,
artificialArray
拥有了所有的数组方法包括map
、reduce
、forEach
等等。在需要数组迭代器的地方,也能够正常迭代,而不会把
length
属性也遍历到。