Javascript 为什么我需要复制数组才能对其使用方法?
我可以使用Javascript 为什么我需要复制数组才能对其使用方法?,javascript,arrays,Javascript,Arrays,我可以使用Array()。比如说 Array(2); // [empty × 2] 但是如果我去使用map方法,比如在我的新数组上,条目仍然是未定义的: Array(2).map( () => "foo"); // [empty × 2] 如果复制阵列,则映射会起作用: [...Array(2)].map( () => "foo"); // ["foo", "foo"] 为什么我需要副本才能使用阵列?使用阵列(arrayLength)创建阵列时,您将: 一个新的Java
Array()。比如说
Array(2); // [empty × 2]
但是如果我去使用map方法,比如在我的新数组上,条目仍然是未定义的:
Array(2).map( () => "foo"); // [empty × 2]
如果复制阵列,则映射会起作用:
[...Array(2)].map( () => "foo"); // ["foo", "foo"]
为什么我需要副本才能使用阵列?使用阵列(arrayLength)
创建阵列时,您将:
一个新的JavaScript数组,其length属性设置为该数字(注意:这意味着一个arrayLength空插槽数组,而不是具有实际未定义值的插槽)
数组实际上不包含任何值,甚至不包含未定义的值-它只是有一个length
属性
将具有length
属性的iterable对象展开到数组中时,展开语法将访问每个索引并在新数组中设置该索引处的值。例如:
const arr1=[];
arr1.length=4;
//arr1实际上没有任何索引属性:
console.log(arr1中的“1”);
常数arr2=[…arr1];
控制台日志(arr2);
控制台日志(arr2中的“2”)代码>使用数组(arrayLength)
创建数组时,您将:
一个新的JavaScript数组,其length属性设置为该数字(注意:这意味着一个arrayLength空插槽数组,而不是具有实际未定义值的插槽)
数组实际上不包含任何值,甚至不包含未定义的值-它只是有一个length
属性
将具有length
属性的iterable对象展开到数组中时,展开语法将访问每个索引并在新数组中设置该索引处的值。例如:
const arr1=[];
arr1.length=4;
//arr1实际上没有任何索引属性:
console.log(arr1中的“1”);
常数arr2=[…arr1];
控制台日志(arr2);
控制台日志(arr2中的“2”)代码>原因是数组元素未赋值。描述的第一段。。。回调仅对具有赋值(包括未定义)的数组索引调用
考虑:
var array1 = Array(2);
array1[0] = undefined;
// pass a function to map
const map1 = array1.map(x => x * 2);
console.log(array1);
console.log(map1);
产出:
Array [undefined, undefined]
Array [NaN, undefined]
打印阵列时,将询问其每个元素。第一个已分配未定义
,另一个默认为未定义
映射操作调用第一个元素的映射操作,因为它已被定义(通过赋值)。它不调用第二个参数的映射操作,只传递未定义的原因是数组元素未赋值。描述的第一段。。。回调仅对具有赋值(包括未定义)的数组索引调用
考虑:
var array1 = Array(2);
array1[0] = undefined;
// pass a function to map
const map1 = array1.map(x => x * 2);
console.log(array1);
console.log(map1);
产出:
Array [undefined, undefined]
Array [NaN, undefined]
打印阵列时,将询问其每个元素。第一个已分配未定义
,另一个默认为未定义
映射操作调用第一个元素的映射操作,因为它已被定义(通过赋值)。它不调用第二个参数的映射操作,只传递未定义的,正如@CertainPerformance所指出的,您的数组除了其长度之外没有任何属性,您可以使用以下行验证:新数组(1).hasOwnProperty(0)
,它返回false
看看你可以看到,在7.3中,有一个检查数组中是否存在一个键
1..6。[…]
7.重复一遍,
而k
让
Pk是ToString(k)
让
kPresent是调用[[HasProperty]]的结果
带参数Pk的O的内部方法
如果
那么kPresent是真的吗
让
kValue是调用[[Get]]内部
带参数Pk的O方法
让
mappedValue是调用[[Call]]内部函数的结果
以T作为this的callbackfn方法
包含kValue、k和k的值和参数列表
O
呼叫
具有的函数的[[DefineOwnProperty]]内部方法
参数Pk,属性描述符{[[Value]]:mappedValue,
[[Writable]]:true,[[Enumerable]]:true,
[[Configurable]]:true}和false
增加
k乘以1
9返回A.正如@CertainPerformance所指出的,您的数组除了其长度
之外没有任何属性,您可以通过这一行验证:新数组(1).hasOwnProperty(0)
,它返回false
看看你可以看到,在7.3中,有一个检查数组中是否存在一个键
1..6。[…]
7.重复一遍,
而k
让
Pk是ToString(k)
让
kPresent是调用[[HasProperty]]的结果
带参数Pk的O的内部方法
如果
那么kPresent是真的吗
让
kValue是调用[[Get]]内部
带参数Pk的O方法
让
mappedValue是调用[[Call]]内部函数的结果
以T作为this的callbackfn方法
价值与
[...Array(2)].map(foo);
Array(2).fill().map(foo);
Array.from(Array(2)).map(foo);
Array.apply(null, Array(2)).map(foo);
Array(2).join(',').split(',').map(foo);