Стратегии оценки в JavaScript

JavaScript
Стратегии оценки в JavaScript

исследую недавнолямбда-исчислениесерединаη-变换Применение в JavaScript, я наткнулся на интересный вопрос на stackoverflow. Что касается стратегии оценки JavaScript, какова передача параметров функции в JS?передать по значениюещепройти по ссылке? Ответ классический.

Каштан, чтобы скрыть это

function changeStuff(a, b, c) {
  a = a * 10;
  b.item = "changed";
  c = {item: "changed"};
}

var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};

changeStuff(num, obj1, obj2);

console.log(num);         // 10
console.log(obj1.item);   // changed
console.log(obj2.item);   // unchanged
  • Если передача параметра функции в JSпередать по значению, то в функцииchangeStuffВнутреннее изменениеb.itemЗначение не повлияет на внешнийobj1стоимость объекта.
  • Если передача параметра функции в JSПропустить импорт, эта функцияchangeStuffИзменения, сделанные внутри, повлияют на все определения переменных вне функции.numстанет 100,obj2.itemстанетchanged. Ясно, что это не так.

Так что нельзя сказать, что передача параметров функций в JS строгопередать по значениюилиПропустить импорт. В общем случае параметры функциипередача по значению. JS также использует стратегию передачи параметров, называемуюПройти мимо Поделиться. Это зависит от типа параметра.

  • если параметрбазовый тип, тогда дапередать по значениюиз;
  • если параметртип ссылки, тогда даПройти мимо Поделитьсяиз.

Передача параметров

Параметры всех функций в ECMAScript:передать по значениюиз. То есть копирование значения вне функции в параметр внутри функции аналогично копированию значения из одной переменной в другую.базовый типПередача по значению похожа на копирование переменной примитивного типа, тогда кактип ссылкиПередача по значению аналогична копированию переменной ссылочного типа. -- "Продвинутое программирование на JavaScript"

Красная книгаПараметры всех вышеперечисленных функцийпередать по значениюДа, не так ли? Давайте проанализируем каштан выше:

передать по значению

Стратегия использования примитивных типов в качестве параметров в JavaScript такова.передать по значению(Вызов по значению):

function foo(a) {
  a = a * 10;
}

var num = 10;

foo(num);

console.log(num); // 10 没有变化

Здесь видно, что изменение внутренних параметров функции не влияет на внешние переменные.передать по значениюВот так.

Пройти мимо Поделиться

Стратегия передачи объектов в качестве параметров в JavaScript такова:Пройти мимо Поделиться(звоните по обмену):

  • Изменение свойств параметров повлияет на внешние объекты
  • Переназначение не повлияет на внешние объекты

Измените параметры в соответствии с приведенной выше функцией каштана.bсвойстваitem, повлияет на объект вне функции, поэтомуobj1свойстваitemтакже изменился.

function bar(b) {
  b.item = "changed";
  console.log(b === obj1) // true
}

var obj1 = {item: "unchanged"};

bar(obj1);

console.log(obj1.item);   // changed 修改参数的属性将会影响到外部对象

отb === obj1Результат печати такойtrueВидно, что свойство параметра изменяется внутри функции и не влияет на ссылку параметра.bа такжеobj1Совместно используйте адрес объекта, поэтому изменение свойств параметра повлияет на внешний объект.

в то время как параметрcПереназначение нового объекта не повлияет на внешний объект.

function baz(c) {
  c = {item: "changed"};
  console.log(c === obj2) // false
}

var obj2 = {item: "unchanged"};

baz(obj2);

console.log(obj2.item);   // unchanged 重新赋值将不会影响到外部对象

установить параметрcпереназначить новый объект, затемcпривязан к новому адресу объекта,c === obj2Результат печати такойfalse, посчитав, что они больше не используют один и тот же адрес объекта. Каждый из них имеет отдельные адреса объекта. Таким образом, переназначение не повлияет на внешний объект.

Суммировать

Можно сказатьПройти мимо Поделитьсядапередать по значениюВ частном случае передается копия ссылочного адреса. Так что то, что говорит Красная книга, правда.

Думайте о параметрах функций ECMAScript как о локальных переменных. -- "Продвинутое программирование на JavaScript"

растянуть - ленивая оценка

Ранее я узнал, что параметры всех функцийпередать по значениюиз. В JavaScript параметры должны оцениваться перед передачей в функции в качестве аргументов. Но в ES6 есть особый случай.

Значение параметра по умолчанию не передается по значению, но значение выражения значения по умолчанию каждый раз пересчитывается. То есть значение параметра по умолчанию равноленивая оценкаиз. -- "Введение в ECMAScript 6"

let x = 99;
function foo(p = x + 1) {
  console.log(p);
}

foo() // 100

x = 100;
foo() // 101

В приведенном выше коде параметрpЗначение по умолчаниюx + 1. В этом случае при каждом вызове функцииfoo, будет пересчитанx + 1, вместо стандартногоpравно 100.

Ссылаться на

стратегия оценки

Is JavaScript a pass-by-reference or pass-by-value language?

Значения по умолчанию для параметров функции в ES6