Javascript 为什么直接在数组实例上调用Array.prototype.map会导致;“未经修改”;阵列?
为什么直接在数组实例Javascript 为什么直接在数组实例上调用Array.prototype.map会导致;“未经修改”;阵列?,javascript,arrays,spread-syntax,Javascript,Arrays,Spread Syntax,为什么直接在数组实例o上调用Array.prototype.map会导致“未修改”的数组 相反,我必须使用apply(或call): 我错过了什么 最后,上述方案的替代方案是: [...o].map((x, y) => y*2); // [ 0, 2, 4] 我这样认为是因为这纠正了我最初实现中缺少的任何东西 为什么直接在数组实例o上调用Array.prototype.map会导致“未修改”的数组 因为.map只对实际存在的元素起作用数组(3)创建长度为3的空数组。换句话说:.map忽略
o
上调用Array.prototype.map
会导致“未修改”的数组
相反,我必须使用apply(或call):
我错过了什么
最后,上述方案的替代方案是:
[...o].map((x, y) => y*2); // [ 0, 2, 4]
我这样认为是因为这纠正了我最初实现中缺少的任何东西
为什么直接在数组实例o上调用Array.prototype.map会导致“未修改”的数组
因为.map
只对实际存在的元素起作用<代码>数组(3)创建长度为3
的空数组。换句话说:.map
忽略孔
相反,我必须使用apply(或call):。。。我错过了什么
Array.apply(0,o)
相当于Array(undefined,undefined,undefined)
在您的情况下,即您正在创建一个包含三个元素的数组
如果你比较一下,差异会变得更加明显
console.dir(Array(3));
// vs
console.dir(Array.apply(null, Array(3)));
第一个仅具有属性length
,第二个还具有属性0
、1
和2
最后,上述方法的另一种选择是:
扩展运算符将调用o[Symbol.iterator]
。数组的迭代器将在孔上迭代,就像使用正常的for
循环一样
为什么直接在数组实例o上调用Array.prototype.map会导致“未修改”的数组
因为.map
只对实际存在的元素起作用<代码>数组(3)创建长度为3
的空数组。换句话说:.map
忽略孔
相反,我必须使用apply(或call):。。。我错过了什么
Array.apply(0,o)
相当于Array(undefined,undefined,undefined)
在您的情况下,即您正在创建一个包含三个元素的数组
如果你比较一下,差异会变得更加明显
console.dir(Array(3));
// vs
console.dir(Array.apply(null, Array(3)));
第一个仅具有属性length
,第二个还具有属性0
、1
和2
最后,上述方法的另一种选择是:
扩展运算符将调用
o[Symbol.iterator]
。数组的迭代器将在孔上迭代,就像使用正常的for
循环一样。您有一个空数组,因此没有任何东西可以在大多数数组迭代器函数上迭代跳过未初始化的元素。如果查看[].map()多边形填充(真正的多边形填充,而不是u或lodash),您将看到类似于if的内容(r中的i)
对映射的元素进行筛选。您有一个空数组,因此没有任何东西可以在大多数数组迭代器函数上迭代跳过未初始化的元素。如果查看[].map()polyfills(real polyfills,而不是u或lodash),您将在映射的元素上看到类似于if(r中的i)
的筛选。
console.dir(Array(3));
// vs
console.dir(Array.apply(null, Array(3)));