splincodewd
@splincodewd
Developer

Почему интерпретатор указывает нам в выводе тип number?

Провалил на собеседовании этот момент, я так и не понял на уровне основ программирования, почему именно number? Есть описание как это должно работать?

document.body.innerHTML = typeof (1 / []);

Дома потестировал:
// при работе с нулевым указателем
document.body.innerHTML  = "1. " +  typeof (1 / undefined) + "<br>";
document.body.innerHTML += "2. " + typeof (1 * null) + "<br>";
document.body.innerHTML += "3. " + typeof (1 / void 0) + "<br>";

// при работе с типами данных
document.body.innerHTML += "4. " + typeof (1 / String) + "<br>";
document.body.innerHTML += "5. " + typeof (1 * Number) + "<br>";
document.body.innerHTML += "6. " + typeof (1 - Array) + "<br>";
document.body.innerHTML += "7. " + typeof (1 + Object) + "<br>";

// при работе с прототипами
document.body.innerHTML += "8. " + typeof (1 * new function(){}) + "<br>";
document.body.innerHTML += "9. " + typeof (1 / function(){}) + "<br>";

// при работе с объектами
document.body.innerHTML += "10. " + typeof (1 / []) + "<br>";
document.body.innerHTML += "11. " + typeof (1 * []) + "<br>";
document.body.innerHTML += "12. " + typeof (1 / {}) + "<br>";
document.body.innerHTML += "13. " + typeof (1 * {}) + "<br>";


1. number
2. number
3. number
4. number
5. number
6. number
7. string
8. number
9. number
10. number
11. number
12. number
13. number
  • Вопрос задан
  • 165 просмотров
Решения вопроса 6
Sanasol
@Sanasol Куратор тега JavaScript
нельзя просто так взять и загуглить ошибку
Deonisius
@Deonisius
Родился в 11110110111 году, 11000 января.
Неявное численное преобразование примитивов. Если простым языком, то во время математических операций, операнды преобразовываются к числовым типам. Исключением в JS является сложение строковых значений, если их не получилось преобразовать к числовым. В этом случае, мы получим на выходе строку. С другим оператором, в большинстве случаем - NaN
console.log( +[] ); // 0
console.log( 1 / [] ); // Infinity, т.к. исходя из примера выше, +[] === 0, т.е. деление на 0
console.log( 'A' + [] ); // A
console.log( 'A' - [] ); // NaN


P.S. И по поводу Infinity:
Глобальное свойство Infinity является числовым значением, представляющим бесконечность.
Ответ написан
Комментировать
evgeniy8705
@evgeniy8705
Повелитель вселенной
Во всех* математических операциях операнды стремятся к неявному преобразованию к численному типу. И поэтому во всех случаях математических вычислений, кроме конкатенации строковых значений (в этом случае операнды стараются преобразоваться в строковый тип) вычисления будут равны типу number.
Тут ничего понимать и не надо. Математические вычисления...значит вычисления в любом случае будут равны числовому типу (исключениями являются конкатенация и NaN, что логически не должно быть числовым типом, но это так)
Ответ написан
Комментировать
1 делить на что угодно будет number
NaN например, в данном случае infinity, почему - другой вопрос.
Ответ написан
@sanex3339
При арифметических операциях с массивом используется его 1-й элт, в данном случае его нет, по этому берется 0.
1 / 0 - бесконечность.
typeof Infinity - number.

ИМХО, такой вопрос на собеседовании - идиотский,.
Ответ написан
Меня поражают идиотские собеседования.
Когда только начинал, пошел в компанию на программиста-юниора устраиваться (с обучением, все дела) - отлично поболтали, все обсудили. Напоследок дали ручку, бумагу, какую-то задачку с хабра и 5 минут времени.
5 минут прошло и я успешно ушел в поисках себя.
Так я стал верстальщиком, а не php-программистом
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы