Я заметил, что оператор strict equal
возвращает true, если операнды равны и имеют одинаковый тип.
Но если я сделаю это
01000 == 512; // returns true
01000 === 512; // returns true
Или
0o535 == 349; // returns true
0o535 === 349; // returns true
Они имеют одинаковое значение и тип?
7 ответов
Потому что 01000
, 512
, 0o535
и 349
являются числами. 01000
и 512
- это одно и то же значение, записанное разными способами (восьмеричный «устаревший» литерал и десятичный литерал); как и 0o535
и 349
(восьмеричный литерал нового типа и десятичный литерал). Форма литерала, которую вы используете, не имеет значения для значения или типа того, что он создает. Аналогично, 'foo' === "foo"
имеет значение true, хотя я использую строковый литерал в одинарных кавычках в одном и строковый литерал в двойных кавычках в другом.
О двух видах восьмеричных литералов:
01000
- это восьмеричный восьмеричный литерал, обозначаемый только начальным нулем. Механизмы JavaScript в веб-браузерах обязаны (начиная с ES2015) поддерживать их в свободном режиме и не поддерживать их в строгом режиме (например, "use strict")
. (Обратите внимание, что свободный режим и строгий режим) режим не имеет ничего общего со свободным равенством и строгим равенством, что является отдельной концепцией.) Таким образом, в совместимом браузерном движке JavaScript 01000 === 512
имеет значение true в свободном режиме, но является ошибкой в строгом режиме, поскольку наследие восьмеричные литералы не допускаются в строгом режиме (до ES2015 поддержка устаревших восьмеричных литералов в свободном режиме не требовалась).
0o535
- это более новая восьмеричная запись, добавленная в ES2015, обозначенная лидирующей 0o
. Он поддерживается как в свободном, так и в строгом режимах совместимыми движками JavaScript. Но опять же, он новый, поэтому старые браузеры не будут совместимы.
Числа, которые вы написали (01000 и 0o535), являются просто восьмеричным представлением чисел 512 и 349.
01000 = 0 * 8 ^ 0 + 0 * 8 ^ 1 + 0 * 8 ^ 2 + 1 * 8 ^ 3 = 512
0o535 = 5 * 8 ^ 0 + 3 * 8 ^ 1 + 5 * 8 ^ 2 = 5 + 24 + 320 = 349
Javascript на самом деле не волнует база, которую вы используете для написания своих чисел.
Если число начинается с 0
, оно интерпретируется как octal
или base 8
.
01000 in base 8 is 512 in base 10.
Так что они приравнивают к истине. Потому что значение в любом случае одинаково.
Это разные способы представления чисел, и все они типа "число". Например
typeof 01000; //=> "number"
var num = 0o535;
num; //=> 349
На самом деле они имеют одинаковый тип:
typeof(01000) //"number"
typeof(0o535) //"number"
Они основа 8 думал JS
Потому что они равны и одного типа. Они оба числа. Номер не имеет ничего общего с базой - это просто представление.
Это интересный вопрос, потому что можно предположить, что ===
должен различать разные обозначения. Однако это не так, потому что JavaScript автоматически интерпретирует целые числа различных обозначений.
Доступны различные числовые литералы. Новые обозначения для двоичного, восьмеричного и шестнадцатеричного введены в ES6.
1) десятичные числа обычно отображаются без начального 0, но их можно записать одним. Если следующая цифра после начального 0 равна 8 или больше, он анализируется как десятичное число. В противном случае он анализируется как восьмеричное.
0800 === 800
-> десятичный
0700 === 448
-> восьмеричный
0700 === 0o0700
Теперь для новых функций номера ES6:
2) двоичные числа имеют начальные 0b
или 0B
.
3) восьмеричные числа имеют начальные 0o
или 0O
.
4) шестнадцатеричные числа имеют начальные 0x
или 0X
.
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.