这些指针是在幕后工作的吗?Javascript

16 浏览
0 Comments

这些指针是在幕后工作的吗?Javascript

为了在JavaScript中复制一个数组:以下哪种方法更快?\n

Slice方法

\n

var dup_array = original_array.slice();

\n

For循环

\n

for(var i = 0, len = original_array.length; i < len; ++i)
   dup_array[i] = original_array[i];

\n


\n我知道这两种方法都只进行浅拷贝:如果original_array包含对对象的引用,那么对象将不会被克隆,只会将引用复制过来,因此两个数组都将引用相同的对象。\n但这不是这个问题的重点。\n我只是询问速度。

0
0 Comments

这篇文章的标题是“这些指针在幕后工作吗?JavaScript”。文章主要讨论了在JavaScript中使用ES6的展开运算符(spread operator)和slice方法进行数组复制的问题。下面是文章的整理:

ES6的展开运算符可以很方便地复制一个数组,代码如下:

arr2 = [...arr1];

但是,如果使用babel进行转换,代码将变成:

[].concat(_slice.call(arguments))

不清楚`arguments`是从哪里来的...我认为babel的输出混淆了几个不同的特性。更可能的是:

arr2 = [].concat(arr1)

`.concat()`和展开运算符的效果是不一样的,展开运算符会将空位转换为`undefined`。例如:

arr1 = Array(1);
arr2 = [...arr1];
arr3 = [].concat(arr1);
0 in arr2 !== 0 in arr3

在我的浏览器(Chrome 59.0.3071.115)中对Dan上面的答案进行了测试,使用展开运算符的方法比使用`.slice()`方法慢了10倍以上:

n = 1000*1000;
start = + new Date();
a = Array(n);
b = [...a];
console.log(new Date() - start); // 168

最简单的方法是使用ES6的展开运算符,但是在2015年之前,JavaScript并没有这个功能,所以以前的语言还是相当糟糕的。

然而,展开运算符仍然无法复制像`[{a: 'a', b: {c: 'c'}}]`这样的对象数组。如果在“复制”的数组中改变了`c`的值,原始数组中的值也会改变,因为只是引用的复制,而不是克隆。

正如评论中提到的,仍然存在引用的问题。我曾经遇到过非常令人困惑的情况,我使用`[...baseSet, ...baseSet]`来复制一个数组(用于记忆游戏),最后发现我遇到了引用的情况。我使用了lodash的`cloneDeep`方法来克隆我的对象数组。下次我会先阅读所有的评论!

在Node.js中,虽然速度并不重要,但截至2020年3月,`slice`方法(150,936,056 ops/sec ±3.17%)比展开运算符(34,565,713 ops/sec ±4.69%)要快大约5倍。

本文讨论了使用展开运算符和slice方法进行数组复制的问题,并提供了解决方法和一些测试结果。

0
0 Comments

这篇文章将讨论JavaScript中的一个问题:指针是否在幕后起作用?问题的出现原因和解决方法。

在JavaScript中,使用`slice`方法是最快的方式。然而,如果你在`slice`方法中加入`0`作为开始索引,它甚至会更快。

myArray.slice(0);

myArray.slice();

要快。你可以在https://jsben.ch/F0SZ3上查看相关的性能测试。

那么,`myArray.slice(0, myArray.length-1);`是否比`myArray.slice(0);`更快呢?

这是错误的,至少在我的机器上和根据你自己的基准测试结果来看是这样的。链接已经失效。

jsben.ch/56xWo上的测试结果显示,有时`slice()`更快,有时`slice(0)`更快,两者之间的差距仅仅很小(在Firefox 56和最新的基于Chrome的Vivaldi中)。但是`slice(0, length)`始终明显较慢(除了在Firefox 87中它是最快的)。

这样做并不是克隆数组,它仍然是引用复制。

根据以上内容,我们可以总结出问题的出现原因是在使用`slice`方法时,不同的参数传递会导致不同的性能表现。为了解决这个问题,我们可以根据具体情况选择使用`slice()`、`slice(0)`或`slice(0, length)`方法。

0
0 Comments

这篇文章讨论了在Javascript中克隆一个数组的方法,提供了至少6种不同的方法。其中,根据一项基准测试的结果,对于Blink浏览器来说,slice()方法是最快的,concat()方法稍慢一些,而while循环方法则慢了2.4倍。而对于其他浏览器来说,由于这些浏览器没有针对slice和concat方法的内部优化,while循环方法是最快的。

然后,文章给出了两个简单的脚本示例,可以在浏览器的控制台中运行多次来观察结果。这两个示例分别使用while循环和slice方法来克隆数组,并输出执行时间。

文章还指出,这些方法只会克隆数组对象本身,而不会深度克隆数组内容。最后,文章引用了其他人的测试结果,并讨论了不同浏览器和不同类型的元素对克隆速度的影响。

总结起来,根据不同浏览器和元素类型的不同,选择不同的克隆方法可以实现更高效的数组克隆。

0