Страницы

Поиск по вопросам

среда, 11 декабря 2019 г.

Скопировать значение массива, а не ссылку на него

#javascript #массивы


Здравствуйте! Скажите, а как можно скопировать в JavaScript массив так, чтобы, при
изменении копии, оригинал не менялся? Например:

a = [0, 1, 2, 3]
b = clone(a)
b[0] = 10
a[0] == 0 // => true


Можно ли реализовать такой метод clone?
    


Ответы

Ответ 1



var a = [0, 1, 2, 3] var b = a.slice(0); b[0] = 10; console.log('a: ' + a); console.log('b: ' + b); slice - возвращает поверхностную копию части массива в новый объект массива. В данном случае с начала и до конца Технически slice - наибыстрый путь, ОДНАКО это будет даже еще быстрее если добавить 0 - как начало "отрезания" myArray.slice(0); быстрее, чем myArray.slice(); ....так говорят языки %)

Ответ 2



var a = [0, 1, 2, 3] var b = [].concat(a) b[0] = 10 console.log(a + '\n' + b)

Ответ 3



var oldArray = [0, 1, 2, 3]; var newArray = oldArray.slice();

Ответ 4



Замер производительности В хроме slice(0) действительно немного быстрее, чем просто slice() и в 2 раза быстрее, чем concat. А вот Array.from даже concatу проигрывает в 10 раз - 3 секунды на миллион итераций о_О. А вот Edge так не считает - там concat самый быстрый. А Array.from по-прежнему в 10 (с хвостиком) раз медленнее concatа - 1.4 секунды. При запуске сниппета браузер повиснет на несколько секунд - это нормально. function test(f) { var a = [0, 1, 2, 3]; var t = performance.now(); f(a); t = performance.now() - t; console.log((""+f).match(/var b = .*$/m)[0] + " // " + t.toFixed(3) + " ms"); } test(function testSlice(a) { for (var q=0; q<1000000; ++q) { var b = a.slice(); } }); test(function testSlice0(a) { for (var q=0; q<1000000; ++q) { var b = a.slice(0); } }); test(function testConcat(a) { for (var q=0; q<1000000; ++q) { var b = [].concat(a); } }); test(function testFrom(a) { for (var q=0; q<1000000; ++q) { var b = Array.from(a); } }); test(function testAssign(a) { // Так делать не надо, просто для сравнения for (var q=0; q<1000000; ++q) { var b = Object.assign([], a); } }); test(function testDesruct(a) { for (var q=0; q<1000000; ++q) { var b = [...a]; } });

Комментариев нет:

Отправить комментарий