Ранее я писал комментарий , объясняющий, что согласно polyfill в MDN , undefined
является вторым аргументом Array.prototype.lastIndexOf
(в polyfill параметр с именем n
) действительно преобразуется в 0
с помощью следующих шагов:
n = Number(undefined)
=> преобразует undefined
в NaN
. 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
:
- Пусть число будет ToNumber (аргумент).
- ReturnIfAbrupt (число).
- Если число равно 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);