2015-12-23 3 views
3

Я хочу знать, делает ли javascript мелкую или глубокую копию при копировании объектов.Назначение объектов в Javascript: мелкая или глубокая копия?

const a = ['value1', 'value2']; 
const b = ['value3', 'value4']; 
const new_ab = [a, b]; 

new_ab собираются новые выделенные значения или ссылки? Если это глубокая копия, как я могу заставить ее проглотить? Благодарю.

+1

'a' и 'b' - ссылки на массивы, поэтому' new_ab' будет ссылкой на массив, содержащий эти ссылки. Никакие объекты не копируются вообще в коде, который вы отправили. – Pointy

+1

Вы можете проверить это очень легко, изменив 'new_ab [0]' и посмотрев, что происходит с 'a'. – Blender

+0

Итак, для использования вышеприведенного кода, так как это только ссылки? –

ответ

1

Как указано в комментариях, JavaScript работает исключительно на ссылках, единственным исключением является то, что примитивные значения хранятся в стеке, и поэтому программа не требует ссылки для доступа к ним. В вашем примере все объявления переменных создают новые значения - каждый экземпляр массива - однако то, что возвращается из объявления массива, является ссылкой, а не самим массивом. Например, [1, 2] - это массив значений (целые числа), но [a, b] - это массив ссылок.

So ... ничего не скопировано. Мы можем продемонстрировать это, поместив объект в качестве элемента массива и проверив, что ранее назначенное свойство все еще доступно через новый «родительский» массив.

(И ответить на ваш вопрос в комментариях, да, ваш пример является более производительным, чем если бы вы (или JavaScript) должны были скопировать значения.)

'use strict'; 
 

 
const arrayOne = []; 
 

 
arrayOne.someProperty = "This string is a property of `arrayOne`, " + 
 
         "accessed via the reference to it in `arrayTwo`." 
 

 
const arrayTwo = [arrayOne]; 
 

 
span.innerHTML = arrayTwo[0].someProperty;
<span id="span"></span>

+1

* "Единственным исключением является то, что примитивные значения хранятся в стеке, поэтому программа не требует ссылки на" * Как вы это знаете? Вы можете ссылаться на спецификацию? Кроме того, как это будет работать с закрытием? –

+0

@FelixKling Не все примитивные значения хранятся в стеке. Способ обработки этих значений является имплантированным. подробно по требованию спецификации. Когда примитивное значение требуется при закрытии, компилятор помещает это значение в кучу. Ссылки [здесь] (https://www.quora.com/JavaScript-programming-language/With-JavaScript-functions-always-acting-as-closures-at-what-point-do-any-variables-get- [здесь] (http://duartes.org/gustavo/blog/post/closures-objects-heap/), и хотя некоторые из них - это все, что у меня есть без чтения исходного кода v8. :) – sdgluck

+0

По общему признанию, я свободен от цитируемого утверждения, однако принцип хранения примитивных значений в стеке справедлив для многих языков ООП. Когда происходит принуждение и другие подобные операции, или значение ссылается на замыкание, как вы сказали, тогда этот принцип может быть искажен. – sdgluck

Смежные вопросы