Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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”)原因是数组元素未赋值。描述的第一段。。。回调仅对具有赋值(包括未定义)的数组索引调用

考虑:

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。

    如前所述,
    数组(2)
    将只创建一个包含两个无法映射的空插槽的数组

    就和而言,
    数组(2)
    实际上是一个空数组:

    Array(2).some(() => 1 > 0); //=> false
    Array(2).every(() => 1 < 0); //=> true
    
    因此,我们可以利用这些知识,想出一些有趣且有点讽刺意味的方法,在这种“空”数组上使用ES5数组函数

    你自己也想到了这个:

    [...Array(2)].map(foo);
    
    @charlietfl建议的变体:

    Array(2).fill().map(foo);
    
    我个人推荐这一款:

    Array.from(Array(2)).map(foo);
    
    有点老派:

    Array.apply(null, Array(2)).map(foo);
    
    这一条很冗长:

    Array(2).join(',').split(',').map(foo);
    

    […数组(2)]
    @Kain0\u 0的结果是什么?它是[undefined,undefined]。isArray(数组(2))为true。也可以使用
    fill()
    <代码>数组(2).填充(“foo”);//[“foo”,“foo”]
    只需小心传递要填充的对象,因为所有元素都将是相同的引用。JavaScript中可能存在索引越界错误。我在一门课程中看到了
    Array()
    ,这让我想起了Python中有用的东西,但遗憾的是,它可能没有那么有用。干杯。在
    Array.from
    可用之前,它曾经是一个不错的选择,但现在我不认为有任何理由使用它,它有太多的潜在混乱。
    Array(2).join(',').split(',').map(foo);