Изменение массива в функции JavaScript меняет массив вне функции?

Почему два сценария ведут себя по-разному? Я хочу использовать первый скрипт, но во второмdrawData() называть это изменениямиdata; это странно, а не то, чего я хочу. Второй скрипт не имеет этой проблемы. Почему так, и как я могу исправить первый скрипт?

Первый скрипт не меняетсяdata:

var data = ["right"];

function drawData(arrs, type) {
    if (type == "percentage") {
        arrs[0] = "omg";
    }
    alert(data[0]); // Changed!?
}
drawData(data);
drawData(data, "percentage");

Второй скрипт:

var data = "right";

function drawData(arrs, type) {
    if (type == "percentage") {
        arrs = "omg";
    }
    alert(data); // OK, not changed.
}
drawData(data);
drawData(data, "percentage");
 user16639012 июн. 2012 г., 06:49
О, и ответчики,before you say & quot; передать по ссылке & quot ;, пожалуйста, прочитайтеEvaluation strategies и найдите термин «ссылка»; вECMAScript specification и иметь возможность подтвердить свой выбор слов. Спасибо!
 user16639012 июн. 2012 г., 06:45
Это потому, что объект сам по себе. Когда объект измененthat объект изменен Когда значение (объект) передается в функцию, этоnot copied, cloned or duplicated (внутренне есть разные методы, которые используются, но это семантически правильно). То есть существует только один массив - и этоsame массив изменяется внутри функции. Если вы хотите иметь возможность изменить его, не боясь повлиять на внешний вид, сначала сделайте копию. Для простого массива это можно сделать с помощьюArray.prototype.slice, В противном случае такие библиотеки, как jQuery, имеют удобные методы копирования.
 Tom Tom12 июн. 2012 г., 07:35
спасибо, я нашел что-то интересное вhttp://stackoverflow.com/  просто посмотрите на ответ Джона Резига.

Ответы на вопрос(2)

Первый вариант изменяет объект, передаваемый в качестве параметра функции (который является массивом), поэтому это изменение видно вне функции. Второй вариант присваивает новое значение параметру функции (который является ссылкой на массив), но не меняет сам массив.

 12 июн. 2012 г., 07:02
Ответ слишком неясен / загадочен для этого вопроса и использует плохо определенные термины: «изменяет ссылку на этот массив»? Он также смешивает область действия (назначение локальной переменной) с изменчивостью объекта (назначение свойства объекта).

В этом разница между назначением локальной переменной и мутацией данного объекта.

В обеих частях кодаarrs является локальной переменной, отличной отdata, Ноelements и другие свойстваarrs точно такие же, как те,data, Внесение изменений в эти значения свойств (которые обычно называютmutation объекта / массива) будет видно, если вы обращаетесь к ним черезarrs или черезdata, И это именно то, что делает первый скрипт.

Однако второй сценарий не изменяет значение свойстваarrs, но присваивает совершенно новое значениеarrs, так что теперь он больше не разделяет никаких свойств сdata, Это еще более очевидно, потому что обаdata а такжеarrs являются примитивными значениями, которые не могут изменяться, как объяснено в предыдущем абзаце. Но даже если бы они были объектами или массивами, вы бы выполнили следующее задание:

arrs = [1234];

Это не повлияетdata. data будет затронуто только если вы назначите свойство / индексarrs без присвоенияarrs непосредственно.

Ваш ответ на вопрос