Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我需要复制数组才能对其使用方法?_Javascript_Arrays - Fatal编程技术网

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);