Может ли Javascript обрабатывать целые числа как массивы?

#javascript

Вопрос:

Я только начал изучать JS и совершенно ошеломлен его безопасностью типа. Я объявил функцию:

function foo(args) { if (args[0] == undefined) { ... } }

и призовите его как:

foo(3)

Во время выполнения он с удовольствием индексирует это целое число. Я, по крайней мере, ожидал, что он не будет рассматривать » 3 «как массив во время выполнения и говорить «не может индексировать целочисленный тип». Но предикат оценивается.

Это так либерально или я что-то упускаю из виду, касающееся проверок времени выполнения JS?

Комментарии:

1. Вы можете получить доступ к произвольным реквизитам для чего угодно , включая реквизиты с числовыми именами, такие как элементы массива.

2. и обратитесь за функциональностью, которую вы, похоже, ищете. вам не нужно указывать параметр. функции без стрелок (синтаксис, отличный от лямбда) имеют arguments массив как часть прототипа. наконец, если вам нужна безопасность ввода, TypeScript

Ответ №1:

Массивы в javascript-это в основном просто объекты только с числовыми свойствами. Поскольку все в javascript является объектом (да, и функциями тоже), вы можете получить доступ к свойствам чего угодно.

Вы можете сделать something.foo , something["foo"] или something[0] , независимо от того, что something есть. В худшем случае, ты вернешься undefined .

Вы также можете задать свойства для объектов с числовыми значениями:

 let one = 1;
one.foo = "test";
one[0] = 42;

alert(one.foo);
alert(one[0]);
 

Комментарии:

1. Если вы попытаетесь undefined.foo , вы получите ошибку типа

2. Справедливый. Неопределенное, очевидно, является исключением из правила «все является объектом».