Знаете ли вы C?Ссылки / указатели на C - хороший способ понять сложные переменные в Javascript.«Комплекс» означает все, что не является числом, строкой, логическим значением - все остальное является «объектом».Переменные для комплексных типов (объектов) действительно похожи на указатели.Если вам известны понятия «вызов по ссылке» и «вызов по значению», в Javascript это не так, вроде: если вы передаете объекты функциям, сам «указатель» является вызовом по значению, но значение является ссылкой наобъект (на самом деле в область в куче, где хранится объект, хотя JS-программисты не обрабатывают кучу, как в C / C ++, это все еще место хранения вещей).Пример:
function fn (a) {
//changing the argument itself does NOT change the original object
a = null;
//but changing its properties does:
a.foo = 42;
}
var o = { foo:1, bar:2 };
fn(o);
Так что теперь должно стать понятно, почему вы должны клонировать объект, если вы хотите настоящий «вызов по значению».Эта реализация была выбрана для JS, потому что в противном случае каждый раз, когда вызывается функция с не примитивным типом, куча должна быть скопирована, и 99% времени просто не требуется.«Истинный» дух функционального программирования, конечно, был бы чисто вызовом по значению, здесь мы видим практические соображения (производительность и использование памяти), которые нарушают теорию:)