Javascript严格等同于奇怪的行为

时间:2015-12-15 08:34:57

标签: javascript

我注意到strict equal运算符如果操作数相等且类型相同则返回true。

但是,如果我这样做

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

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

它们是否具有相同的值和类型?

7 个答案:

答案 0 :(得分:4)

由于010005120o535349都是数字。 01000512是以不同方式写的相同值(“遗留”八进制文字和十进制文字); 0o535349(新式八进制文字和十进制文字)也是如此。您使用的文字形式对其创建的值或类型没有影响。类似地,'foo' === "foo"为真,即使我在一个中使用单引号字符串文字而在另一个中使用双引号字符串文字。

关于两种八进制文字:

01000是一个“遗留的”八进制文字,仅由前导零表示。 Web浏览器中的JavaScript引擎(从ES2015开始)需要在松散模式下支持它们,并且在严格模式下支持它们(例如,"use strict")。(注意松散模式和严格模式与松散相等和严格相等无关,这是一个单独的概念。)因此,在一个兼容的,基于浏览器的JavaScript引擎中,01000 === 512在松散模式下是真的,但在严格模式下是错误,因为遗留在严格模式下不允许使用八进制文字。(在ES2015之前,不需要在松散模式下支持传统的八进制文字。)

0o535是ES2015中添加的较新的八进制表示法,以前导0o表示。兼容的JavaScript引擎支持松散和严格模式。但同样,它是新的,因此旧的浏览器将不合规。

答案 1 :(得分:2)

如果某个号码以0开头,则会将其解释为octalbase 8

01000 in base 8 is 512 in base 10.

所以他们等同于真实。因为价值无论如何相同。

答案 2 :(得分:1)

这些是表示数字的不同方式,它们都是“数字”类型。作为一个例子

typeof 01000; //=> "number"

var num = 0o535;
num; //=> 349

答案 3 :(得分:1)

因为它们相同且属于同一类型。他们都是数字。数字没有基础 - 它只是一种表现形式。

答案 4 :(得分:1)

这是一个有趣的问题,因为可以假设===应该能够区分不同的符号。但是,情况并非如此,因为JavaScript会自动解释不同符号的整数。

有各种可用的数字文字。二进制,八进制和十六进制的新表示法来自ES6。

1)十进制数字通常在没有前导0的情况下看到,但它们可以用一个写入。如果前导0之后的下一个数字是8或更大, 它被解析为小数。否则,它将被解析为八进制。

0800 === 800 - >小数

0700 === 448 - >八进制

0700 === 0o0700

现在有了新的ES6号码功能:

2)二进制数字有一个前导0b0B

3)八进制数字有一个前导0o0O

4)十六进制数字有一个前导0x0X

答案 5 :(得分:0)

实际上,它们具有相同的类型:

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

他们是js认为的基础8

答案 6 :(得分:0)

你写的数字(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并不真正关心您用来编写数字的基础。