为什么console.log(00);和console.log(01);打印0在浏览器控制台1,而不是00 01?
console.log(00); // prints 0;
console.log(01); // prints 1;
console.log(011); // prints 9;
console.log(0111); // prints 73;
Run Code Online (Sandbox Code Playgroud)
Gan*_*nnu 23
永远不要写一个前导零的数字(如07).一些JavaScript版本将数字解释为八进制,如果它们使用前导零写入.
这是因为JavaScript将前导0视为八进制数,这就是为什么要获得八进制数(基数为8).
你可以使用parseInt和radix来消除这些问题.
并且console.log将输入视为八进制的原因是,默认情况下console.log调用valueOf输入方法.如果它没有返回任何内容,它将调用toString方法.
并且该valueOf方法返回如下值:
00.valueOf() // 0
01.valueOf() // 1
011.valueOf() // 9
0111.valueOf() // 73
Run Code Online (Sandbox Code Playgroud)
参考: - http://javascript.info/tutorial/object-conversion
为了您的参考,我添加了数字系统表
Tib*_*bos 12
评估
在执行console.log(stuff)打印之前,stuff将对其进行评估,以查看要打印的内容.这就是为什么console.log(3+2)打印5而不是3+2.这与console.log特别是无关,评估是在执行之前完成的console.log.任何函数的行为方式都相同,它将5作为参数传递,而不是初始值3+2
解析
甚至在评估之前,还有另一个因素在起作用:解析.解析是解释源代码的第一步,它指的是分析源代码中的字符以确定它们引用的逻辑结构(标记).
这里的棘手问题是数字可以用几种方式编写:
1,15 - 以十进制表示的数字(基数为10)01,017- 以八进制写的数字(基数为8)0b1,0b1111- 以二进制编写的数字(基数2)0x1,0xE- 以十六进制表示的数字(基数为16)所有这些都指的是相同的2个数字 - 1和15,但它们是不同的图形表示,与您考虑的方式6和0000006数字相同.
解析源代码后,源代码中写入的字符将被它们所代表的实际数字"替换".这意味着即使在Javascript引擎知道它必须进行一些打印之前,您编写的字符也会消失,剩下的是您引用的实际数字.
附件B.
虽然主要的Javascript规范只考虑那些以八进制数开头的数字0o,但遗留语法会考虑那些以八进制数开头的数字0.
小智 6
在控制台中领先零,使其达到8.
console.log(00)=0
console.log(01)=1
console.log(011)=9 //0+8+1
console.log(0111)=73 //0+64+8+1
Run Code Online (Sandbox Code Playgroud)
小智 1
当您编写 console.log(00) 时,参数 00 被解释为数字,因此打印 0。另一方面,如果您编写 console.log("00") 00 将被解释为字符串并打印 00。
| 归档时间: |
|
| 查看次数: |
1692 次 |
| 最近记录: |