Как передать значение вместо ссылки массива?

У меня есть эта структура:

var a = [];
a.push({"level": 1, "column": 4, "parent": "none", "title": "Node 0", "content": "Parintele suprem", "show": "1"});
var b = a;

a.push({"level": 1, "column": 5, "parent": "none", "title": "Node 1", "content": "Parintele suprem", "show": "1"});

console.log(b);

Теперь проблема в том, что b имеет точный контент как a (контент после второго нажатия). Это подсказывает (исправьте меня, если я ошибаюсь), что, когда я сказал b = a, я фактически дал такую ​​же ссылку как a, поэтому все, что я делаю в a, есть в b. Дело в том, что мне нужно передать значение. Поэтому у меня есть предварительный просмотр a, значение в b.

Изменить, чтобы сделать вопрос более ясным: как передать значение вместо ссылки?

Ответ 1

Я думаю, вы можете использовать это, чтобы скопировать значение вместо ссылки:

var b = a.slice(0);  

ИЗМЕНИТЬ
Как отмечалось в комментариях, и здесь также упоминается: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/slice

slice не изменяет исходный массив, но возвращает новую копию с одним уровнем глубины, которая содержит копии элементов, отрезанных от исходного массива. Элементы исходного массива копируются в новый массив следующим образом:

  • Для ссылок на объекты (а не на фактический объект) копии срезов ссылки на объекты в новый массив. И исходный, и новый массив обратитесь к одному и тому же объекту. Если объект, на который ссылается, изменяется, изменения видны как для нового, так и для оригинального массивов.

  • Для строк и чисел (а не для объектов String и Number), копии срезов строки и числа в новый массив. Изменения в строке или число в одном массиве не влияет на другой массив.

Если новый элемент добавлен в любой массив, другой массив не будет затронут.

Ответ 2

вы можете реализовать метод клонирования следующим образом:

function clone(source) {
    var result = source, i, len;
    if (!source
        || source instanceof Number
        || source instanceof String
        || source instanceof Boolean) {
        return result;
    } else if (Object.prototype.toString.call(source).slice(8,-1) === 'Array') {
        result = [];
        var resultLen = 0;
        for (i = 0, len = source.length; i < len; i++) {
            result[resultLen++] = clone(source[i]);
        }
    } else if (typeof source == 'object') {
        result = {};
        for (i in source) {
            if (source.hasOwnProperty(i)) {
                result[i] = clone(source[i]);
            }
        }
    }
    return result;
};

то

var b = clone(a);

если вы уверены, что a является массивом, используйте только приложение Niklas:

var b = a.slice();

ps: мой английский беден:)

Ответ 3

Да, то, как ссылочное присвоение работает в javascript. Вы хотите клонировать объект, чтобы сделать копию, что, к сожалению, больше связано с тем, что должно быть. Ракурсы, такие как MooTools, предоставляют простейшее решение, или вы можете перевернуть свою собственную функцию clone.