数字字面量扩展

在ES5之前,数字字面量看起来就像下面的东西 —— 八进制形式没有被官方指定,唯一被允许的是各种浏览器已经实质上达成一致的一种扩展:

  1. var dec = 42,
  2. oct = 052,
  3. hex = 0x2a;

注意: 虽然你用不同的进制来指定一个数字,但是数字的数学值才是被存储的东西,而且默认的输出解释方式总是10进制的。前面代码段中的三个变量都在它们当中存储了值42

为了进一步说明052是一种非标准形式扩展,考虑如下代码:

  1. Number( "42" ); // 42
  2. Number( "052" ); // 52
  3. Number( "0x2a" ); // 42

ES5继续允许这种浏览器扩展的八进制形式(包括这样的不一致性),除了在strict模式下,八进制字面量(052)是不允许的。做出这种限制的主要原因是,许多开发者似乎习惯于下意识地为了将代码对齐而在十进制的数字前面前缀0,然后遭遇他们完全改变了数字的值的意外!

ES6延续了除十进制数字之外的数字字面量可以被表示的遗留的改变/种类。现在有了一种官方的八进制形式,一种改进了的十六进制形式,和一种全新的二进制形式。由于Web兼容性的原因,在非strict模式下老式的八进制形式052将继续是合法的,但其实应当永远不再被使用了。

这些是新的ES6数字字面形式:

  1. var dec = 42,
  2. oct = 0o52, // or `0O52` :(
  3. hex = 0x2a, // or `0X2a` :/
  4. bin = 0b101010; // or `0B101010` :/

唯一允许的小数形式是十进制的。八进制,十六进制,和二进制都是整数形式。

而且所有这些形式的字符串表达形式都是可以被强制转换/变换为它们的数字等价物的:

  1. Number( "42" ); // 42
  2. Number( "0o52" ); // 42
  3. Number( "0x2a" ); // 42
  4. Number( "0b101010" ); // 42

虽然严格来说不是ES6新增的,但一个鲜为人知的事实是你其实可以做反方向的转换(好吧,某种意义上的):

  1. var a = 42;
  2. a.toString(); // "42" —— 也可使用`a.toString( 10 )`
  3. a.toString( 8 ); // "52"
  4. a.toString( 16 ); // "2a"
  5. a.toString( 2 ); // "101010"

事实上,以这种方你可以用从236的任何进制表达一个数字,虽然你会使用标准进制 —— 2,8,10,和16 ——之外的情况非常少见。