Почему доступ к свойству indexOf все еще компилируется?
Я сделал опечатку в TypeScript, которая была подобрана во время проверки кода.
Я использовал someArray.indexOf[someObject]
вместо someArray.indexOf(someObject)
.
Я ожидал бы ошибку от IDE/Compiler. Вместо этого никаких ошибок не возникало, и результат был просто неопределенным.
Кто-нибудь может объяснить это?
Ответы
Ответ 1
Довольно легко.
someArray.indexOf
вы знаете, что это function
, которая также является объектом и может иметь свойства.
Делая someArray.indexOf[someObject]
, вы пытаетесь получить доступ к свойству с ключом, равным значению someObject
.
Конечно, он не определен в функции indexOf
, поэтому возвращает undefined
.
Быстрый пример, который иллюстрирует синтаксис и тот факт, что функция может иметь свойства;):
const array = [];
array.indexOf['anyValue'] = 'test';
console.log(array.indexOf.anyValue);
Ответ 2
Это не ошибка, потому что --noImplicitAny
компилятора --noImplicitAny
не включена. При включенной опции компилятора вы получите сообщение об ошибке:
![noImplicitAny enabled]()
Причина в том, что выражение доступа к элементу возвращает объект, типизированный как any
когда для типа не определена сигнатура индекса (это неявное значение any
).
![enter image description here]()
Итак, еще раз, поскольку --noImplicitAny
не включен, это не ошибка. Я настоятельно рекомендую включить эту опцию компилятора.
Ответ 3
array.indexOf
- это функция.
Функции являются объектами.
Вы someObject
свойству array.indexOf
функции array.indexOf
.
Вы бы получили undefined
.
const array = [1, 2, 3]
const someObject = 'asdasd'
console.log(array.indexOf[someObject])
// undefined
Ответ 4
Вкратце: потому что так устроен язык.
JavaScript оценивает попытку доступа к свойству, которое не существует, как undefined
.
Это не вызывает исключения.
Ответ 5
Единственная реальная проблема заключается в том, что вы ожидали, что Typescript выдаст ошибку, которая выявила проблему в вашей логике. Предполагаемая логика заключалась в использовании фигурных скобок и использовании функции someArray.indexOf(someObject)
.
Когда вы использовали квадратные скобки, someArray.indexOf[someObject]
, во время выполнения JS сначала преобразовал ваш объект someObject
в строку, вызвав функцию someObject.toString
, которая, скорее всего, вернула "[object object]"
. Затем к объекту someArray.indexOf
был запрошен ключ "[object object]"
которого не было, и возвращенный undefined
. Что касается Typescript, это вполне нормально.
Дэвид Шеррет отметил, что --noImplicitAny
указал бы на ошибку, но он бы только указал на другую ошибку, как он объяснил, которая не помогла бы вам напрямую найти ошибку в вашей логике.
Ответ 6
Функции в JavaScript являются объектами первого класса.
Когда вы Array.indexOf()
доступ к функции Array.indexOf()
через скобку Array.indexOf['prop']
вы фактически пытаетесь получить доступ к свойству, которого нет в indexOf
поэтому вы получаете undefined
.