Передача неопределенного эквивалента передаче без аргумента? - PullRequest
0 голосов
/ 11 февраля 2019

Любопытно, что

['a', 'b', 'c'].lastIndexOf('b', undefined)

возвращает -1, а следующее:

['a', b', 'c'].lastIndexOf('b')

возвращает 1 (по крайней мере, на блокноте Firefox 65).

Я предположил, что прошелundefined будет иметь тот же результат, что и передача без аргумента.

Однако кажется, что

['a', 'b', 'c'].lastIndexOf('a', undefined)

действительно возвращает 0, как и ожидалось, что заставляет меня поверить, что мой undefined конвертируется в 0.

Я понимаю, что значение по умолчанию для параметра index в lastIndexOf указывает на последний элемент массива.Но разве передача 1020 * не должна вести себя так же, как передача без аргументов? 1021 *

1 Ответ

0 голосов
/ 11 февраля 2019

Ранее я писал комментарий , объясняющий, что согласно polyfill в MDN , undefined является вторым аргументом Array.prototype.lastIndexOf (в polyfill параметр с именем n) действительно преобразуется в 0 с помощью следующих шагов:

  1. n = Number(undefined) => преобразует undefined в NaN.
  2. if(n != n) n = 0 => проверки дляNaN и преобразует его в 0.

let n = Number(undefined);
if (n != n) n = 0;
console.log(n);

Так как это всего лишь полифилл в MDN, мне показалось, что он не стоит правильного ответа.Однако спецификация в ECMA-International говорит то же самое о Array.prototype.lastIndexOf(searchElement[,fromIndex]):

Если передан аргумент fromIndex, пусть n будет ToInteger (fromIndex);иначе пусть n будет len-1.

Где len-1, очевидно, является последним индексом массива.Тогда мы имеем в ToInteger:

  1. Пусть число будет ToNumber (аргумент).
  2. ReturnIfAbrupt (число).
  3. Если число равно NaN, верните + 0.

В заключение ваш undefined преобразуется в 0 и, следовательно, передача undefined в качестве второго аргумента Array.prototype.lastIndexOf отличается от передачиничего.

РЕДАКТИРОВАТЬ

Учитывая ваш последний комментарий Я считаю, что причина вашего недопонимания ясна.Видите ли, здесь нет параметра по умолчанию, и вся эта проблема не имеет к этому никакого отношения.Позвольте мне объяснить:

Как вы знаете, в JavaScript мы можем передавать больше аргументов, чем параметров, или меньше аргументов, чем параметров.Если мы передадим слишком мало аргументов, пропущенные параметры будут undefined.Это легко показать:

function foo(parameter1, parameter2) {
  console.log("parameter 2 is " + parameter2)
};
foo("bar");
foo("bar", undefined);

Как видите, пропуск ничего или пропуск undefined имеет одинаковый эффект.Однако, это , а не , что здесь происходит.В polyfill функция использует массив псевдо-аргументов, например arguments, чтобы получить второй аргумент, проверяя на arguments.length > 1.Следовательно, когда вы говорите ...

Не считается ли неопределенный аргумент переданным аргументом?Я думал, что это не так.

Это происходит, если принять во внимание длину массива arguments, подобного объекту.И в этом случае разница имеет значение:

function foo(parameter1, parameter2) {
  if (arguments.length > 1) {
    console.log("parameter 2 is " + arguments[1])
  } else {
    console.log("no second parameter")
  }
};
foo("bar");
foo("bar", undefined);
...