Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 严格等同于奇怪的行为_Javascript - Fatal编程技术网

Javascript 严格等同于奇怪的行为

Javascript 严格等同于奇怪的行为,javascript,Javascript,我注意到,如果操作数相等且类型相同,strict equal运算符返回true 但是,如果我这样做 01000 == 512; // returns true 01000 === 512; // returns true 或 它们是否具有相同的值和类型?如果数字以0开头,则解释为octall,或base8 01000 in base 8 is 512 in base 10. 因此,它们等于真的。因为值无论如何都是相同的。如果一个数字以0开头,它将被解释为octall,或base 8 0100

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

但是,如果我这样做

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


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

如果数字以
0
开头,则解释为
octall
,或
base8

01000 in base 8 is 512 in base 10.

因此,它们等于真的。因为值无论如何都是相同的。

如果一个数字以
0
开头,它将被解释为
octall
,或
base 8

01000 in base 8 is 512 in base 10.

因此,它们等于真的。因为值是一样的。

因为
01000
512
0o535
349
都是数字
01000
512
是以不同方式写入的相同值(“传统”八进制文字和十进制文字);
0o535
349
(一种新型的八进制文字和十进制文字)也是如此。您使用的文字形式对它所创建的内容的值或类型没有影响。类似地,
'foo'=“foo”
是真的,尽管我在其中一个中使用单引号字符串文字,在另一个中使用双引号字符串文字

关于两种八进制文字:

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


0o535
是ES2015中添加的较新的八进制符号,用前导的
0o
表示。兼容的JavaScript引擎在松散模式和严格模式下都支持它。但同样,它是新的,所以旧的浏览器不会兼容。

因为
01000
512
0o535
349
都是数字
01000
512
是以不同方式写入的相同值(“传统”八进制文字和十进制文字);
0o535
349
(一种新型的八进制文字和十进制文字)也是如此。您使用的文字形式对它所创建的内容的值或类型没有影响。类似地,
'foo'=“foo”
是真的,尽管我在其中一个中使用单引号字符串文字,在另一个中使用双引号字符串文字

关于两种八进制文字:

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


0o535
是ES2015中添加的较新的八进制符号,用前导的
0o
表示。兼容的JavaScript引擎在松散模式和严格模式下都支持它。但是,它是新的,所以旧的浏览器将不兼容。

这些是表示数字的不同方式,它们都是“数字”类型。例如

typeof 01000; //=> "number"

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

这些是表示数字的不同方式,它们都是“数字”类型。例如

typeof 01000; //=> "number"

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

因为他们是平等的,属于同一类型。它们都是数字。数字没有任何类似于基数的东西——它只是一种表示。

因为它们是相等的,并且是相同类型的。它们都是数字。数字没有任何类似于基数的东西-它只是一种表示形式。

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

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

它们是js认为的基础8,实际上,它们具有相同的类型:

typeof(01000) //"number"
typeof(0o535) //"number"
它们是js认为的基数8。你写的数字(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并不真正关心你用来写数字的基数。

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

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

有各种可用的数字文字。二进制、八进制和十六进制的新符号来自ES6

1) 十进制数字通常不带前导0,但可以用一个来书写。如果前导0后的下一位数字为8或更大, 它被解析为十进制。否则,它将被解析为八进制

0800==800
-->十进制

0700===448
-->八进制

0700==0o0700

现在了解新的ES6数字功能:

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

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

4) 十六进制数字的前导
0x