Начнем с вопроса интервью, который может (изменить) любовь (состояние).
На прошлой неделе наша команда Little Fairy приняла от меня вопрос для интервью на тему:При каких обстоятельствах a === a - 1.
Я не знаю, кто является конкретным источником этого вопроса, но как старый Цзянху, который много лет был погружен во фронтенд, для меня, естественно, такой вопрос не сложен.
Конечно, этот вопрос не сложный, многие студенты должны уметь говорить ответ по первому впечатлению, но сколько ответов? Можете ли вы дать больше ответов, даже бесконечное количество ответов?
Подумай 10 секунд, а потом посмотри вниз -
Первый ответ, естественно, Бесконечность, или, расширяясь, должна быть положительная и отрицательная Бесконечность.
👉🏻Точка знаний: в JavaScript,Infinityявляется литералом типа Number, представляющим бесконечность. Когда значение типа Number превышает максимальное значение, которое может быть представлено во время операции, оно получает бесконечность.
Например, если мы разделим положительное число, отличное от 0, на 0, результатом будет бесконечность.
console.log(100 / 0); // Infinity
Соответственно отрицательные числа имеют отрицательную бесконечность.
console.log(-100 / 0); // -Infinity
Если значение нашей числовой операции превышает диапазон, разрешенный Числом, мы также получим Бесконечность.
console.log(1e1000); // Infinity
В JavaScript,Number.POSITIVE_INFINITYа такжеNumber.NEGATIVE_INFINITYЗначение двух констант, соответствующих положительной и отрицательной бесконечности.
Number.isFinite()Вы можете судить о том, является ли число конечным, Number.isFinite(n), когда n является числовым типом, только если оно является положительным или отрицательным Infinity или NaN, оно возвращает false, в противном случае возвращает true.
Результат сложения и вычитания любого конечного числа и Бесконечности есть Бесконечность, иInfinity === Infinity,так:
let a = Infinity;
console.log(a === a - 1); // true
let b = -Infinity;
console.log(b === b - 1); // true
Таким образом, мы получаем два ответа.
💡 Однако следует отметить, что результатом операции Бесконечность не всегда является Бесконечность.Для примера рассмотрим следующие операции:
console.log(Infinity + Infinity); // Infinity
console.log(Infinity - Infinity); // NaN
console.log(Infinity * Infinity); // Infinity
console.log(Infinity / Infinity); // NaN
console.log(Infinity * 0); // NaN
Вывод таков, что операция Infinity также может получить NaN, поэтому нужно быть осторожным.Например, в одном из наших расчетных выражений при умножении двух значений одно значение может быть очень большим, а другое значение может быть 0, вам нужно быть осторожным. Если это большое значение получает Infinity, а другое значение оказывается равным 0, все выражение может быть NaN, что вызовет некоторые ошибки.
const result = a + b * c + d;
// 如果 b 是 Infinity 而 c 是 0,整个表达式的结果就有可能是 NaN
Что ж, это наш первый ответ: положительная и отрицательная Бесконечность.
Далее мы смотрим на другой (другой) ответ.
Мы даем относительно большое количество, например 1E45:
let a = 1e45;
console.log(a); // 1e+45
console.log(a === a - 1); // true
Некоторые студенты посмотрели на это и сказали: а, это нормально?
Это не только возможно, вы можете найти двабольшеВсе числа должны быть возможными:
let a = 6.22e23;
console.log(a === a - 1); // true
Так что же здесь происходит?
👉🏻Точка знаний: В JavaScript целые числа могут бытьточно представленДиапазон от-2 ** 53 + 1прибыть2 ** 53 - 1,Прямо сейчас-9007199254740991прибыть9007199254740991. Целые числа за пределами этого значения не могут быть представлены точно.
постоянныйNumber.MAX_SAFE_INTEGERа такжеNumber.MIN_SAFE_INTEGERсоответствуют соответственно9007199254740991а также-9007199254740991.
Давайте проверим это:
let a = 9007199254740986;
for(let i = 0; i < 10; i++) {
console.log(`${i} : ${a + i}`);
}
Вывод в хроме выглядит так:
0 : 9007199254740986
1 : 9007199254740987
2 : 9007199254740988
3 : 9007199254740989
4 : 9007199254740990
5 : 9007199254740991
6 : 9007199254740992
7 : 9007199254740992
8 : 9007199254740994
9 : 9007199254740996
Можно видеть, что когда значение a + i меньше или равно 9007199254740991, выводится обычный результат добавления 1 к каждому циклу. и 9007199254740 отсутствуют. Это связано с тем, что за пределами 9007199254740991 тип JavaScript Number не может точно представлять целые числа. Из-за потери точности 9007199254740993 и 9007199254740995 пропали.
Мы можем использовать эту точку зрения, чтобы построить некоторые другие ценности, которые соответствуют нашим потребностям:
let a = Number.MIN_SAFE_INTEGER - 1;
console.log(a === a - 1); // true
Большое целое число
Фактически, в последнем браузере Chrome мы можем точно представлять большие целые числа,Предложение TC39 Big Integer в настоящее время находится на стадии 3., который уже поддерживается в браузере Chrome.
console.log(2 ** 2000); // Infinity
console.log(2n ** 2000n); // 114813069527425452423283320117768198402231770208869520047764273682576626139237031385665948631650626991844596463898746277344711896086305533142593135616665318539129989145312280000688779148240044871428926990063486244781615463646388363947317026040466353970904996558162398808944629605623311649536164221970332681344168908984458505602379484807914058900934776500429002716706625830522008132236281291761267883317206598995396418127021779858404042159853183251540889433902091920554957783589672039160081957216630582755380425583726015528348786419432054508915275783882625175435528800822842770817965453762184851149029376n
NaN
Некоторые учащиеся могут подумать о NaN, но NaN не равно никакому значению, в том числе самому NaN, поэтому использовать NaN невозможно:
let a = NaN;
console.log(a === a - 1); // false
Наконец, давайте немного расширим, если вопрос интервью требует чего-то другого, кромеa === a - 1, ноa == a - 1, так есть ли другой ответ? Вы можете подумать об этом и обсудить это в github issue.