Как передать значение вместо ссылки на массив? - PullRequest
11 голосов
/ 08 февраля 2012

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

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, я фактически дал b ту же ссылку, что и a, поэтому все, что я делаю в a, я имею в b. Дело в том, что мне нужно передать значение. Итак, у меня есть превью a, значение в b.

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

Ответы [ 3 ]

15 голосов
/ 08 февраля 2012

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

var b = a.slice(0);  

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

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

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

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

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

7 голосов
/ 08 февраля 2012

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

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 голосов
/ 08 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...