javascript v8 运行时切片的时间复杂度

0 javascript v8 time-complexity slice

根据 MDN

slice() 方法返回数组的一部分的浅表副本

这意味着您可以有效地以时间复杂度将指针返回到起始索引O(1)。但在许多讨论中,我看到了O(n)指定(链接如下)。

链接:

正在研究 v8 实现,但没有得到它。
https://chromium.googlesource.com/v8/v8/+/4.3.49/src/string.js?autodive=0%2F%2F

jmr*_*mrk 5

(V8 开发人员在此。)

Array.prototype.slice是 O(n),其中n是切片中的元素数量。
String.prototype.slice是 O(1),感谢我们的实现SlicedStrings,它只是将指针、偏移量、长度存储到原始字符串并避免复制字符(除非它们很小,因此复制少数字符实际上更便宜且更小)而不是存储引用;那仍然是 O(1))。

关键区别在于字符串是不可变的,而数组则不然。当您这样做时str1 = "Hello World"; str2 = str1.slice(2, 5);,由于之后无法修改str1其内容,因此str2不需要确保它不受任何此类修改的影响。
当你这样做时a = [1, 2, 3, 4]; b = a.slice(1, 3); a[1] = "changed"; console.log(b[0]);,你期望看到的2,却不是"changed"。这就是为什么b必须是真实的副本。(理论上,写时复制方法是可能的,但 V8 不会对数组切片执行此操作。)

“浅复制”意味着嵌套对象不会被复制。例子:

let nested = {property: "value"};
var a = [nested];
var b = a.slice(0, 1);
a[0].property = "new value";
console.log(a === b);          // false, `b` is a copy
console.log(a[0] === b[0]);    // true, `nested` was not copied
console.log(b[0] === nested);  // true
console.log(b[0].property);    // "new value"
Run Code Online (Sandbox Code Playgroud)