Я заметил, что оператор strict equal возвращает true, если операнды равны и имеют одинаковый тип.

Но если я сделаю это

01000 == 512; // returns true
01000 === 512; // returns true

Или

0o535 == 349; // returns true
0o535 === 349; // returns true

Они имеют одинаковое значение и тип?

1
choz 15 Дек 2015 в 11:34

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. Но опять же, он новый, поэтому старые браузеры не будут совместимы.

4
T.J. Crowder 15 Дек 2015 в 09:05

Числа, которые вы написали (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
Or Yaniv 15 Дек 2015 в 09:04

Если число начинается с 0, оно интерпретируется как octal или base 8.

01000 in base 8 is 512 in base 10.

Так что они приравнивают к истине. Потому что значение в любом случае одинаково.

2
void 15 Дек 2015 в 08:38

Это разные способы представления чисел, и все они типа "число". Например

typeof 01000; //=> "number"

var num = 0o535;
num; //=> 349
1
Sam 15 Дек 2015 в 08:41

На самом деле они имеют одинаковый тип:

typeof(01000) //"number"
typeof(0o535) //"number"

Они основа 8 думал JS

0
bjwzds 15 Дек 2015 в 08:45

Потому что они равны и одного типа. Они оба числа. Номер не имеет ничего общего с базой - это просто представление.

1
Qwertiy 15 Дек 2015 в 08:47

Это интересный вопрос, потому что можно предположить, что === должен различать разные обозначения. Однако это не так, потому что JavaScript автоматически интерпретирует целые числа различных обозначений.

Доступны различные числовые литералы. Новые обозначения для двоичного, восьмеричного и шестнадцатеричного введены в ES6.

1) десятичные числа обычно отображаются без начального 0, но их можно записать одним. Если следующая цифра после начального 0 равна 8 или больше, он анализируется как десятичное число. В противном случае он анализируется как восьмеричное.

0800 === 800 -> десятичный

0700 === 448 -> восьмеричный

0700 === 0o0700

Теперь для новых функций номера ES6:

2) двоичные числа имеют начальные 0b или 0B.

3) восьмеричные числа имеют начальные 0o или 0O.

4) шестнадцатеричные числа имеют начальные 0x или 0X.

1
boombox 15 Дек 2015 в 09:05