原始值包装类型Boolean
Boolean 是对应布尔值的引用类型。要创建一个Boolean 对象,就使用Boolean 构造函数并传入true 或false。
let booleanObject = new Boolean(true);
Boolean 的实例会重写valueOf()方法,返回一个原始值为true 或false。toString()方法被调用时也会被覆盖,返回字符串“true”或“false”。不过,Boolean 对象在ECMAScript 中用的很少。不仅如此,它们还会引起误会,尤其是在布尔表达式中使用Boolean 对象时。
let falseObject = new Boolean(false);
let result = falseObject && true;
console.log(result);// true
let fasleValue = false;
result = falseValue && true;
console.log(reulst); //false
在这段代码中 ,我们创建一个值为false的Boolean 对象。然后,在一个布尔值表达式中通过&& 操作讲这个对象与一个原始值true组合起来。在布尔算术中,false && true 等于false。可是这个表达式是对falseObject 对象而不是对他的表示的值(false)求值。原始值包装类型中提到过,所有对象在布尔表达式中都会自动转换为true,因此falseObject 在这个表达式里实际上表示一个true值。那么true && true 当然是true。
除此之外,原始值和引用值(Boolean对象)还有几个区别。首先,typeof 操作符对原始值返回“boolean”,但对引用值返回“object”。同样,Boolean 对象首先是Boolean 类型的实例,在使用instanceof操作符时返回true,但对原始值返回false。
理解原始布尔值和Boolean 对象之间的区别非常重要,强烈建议永远不要使用后者。
原始值包装类型Number
Number 时对应数值的引用类型。要创建一个Number 对象,就是用Number 构造函数并传入一个数值。
let numberObject = new Number(10);
与Boolean 类型一样,Number 类型重写了valueOf(),toLocaleString()和toString()方法。valueOf()方法返回Number对象表示的原始数值,另外两个方法返回数值字符串。toString()方法可选的接收一个表示基数的参数,并返回相应基数形式的数值字符串。
let num = 10;
console.log(num.toString());//"10"
console.log(num.toString(2));//"1010"
console.log(num.toString(8));//"12"
console.log(num.toString(10));//"10"
console.log(num.toString(16));// "a"
除了继承的方法,Number 类型还提供了几个用于将数值格式化为字符串的方法。 toFiexed()方法返回包含指定小数点位数的数值字符串。
let num = 10;
console.log(num.toFixed(2));// "10.00"
这里的toFixed()方法接收了参数2,表示返回的数值字符串要包含两位小数。结果返回值为“10.00”,小数位填充了0.如果数值本身小数位数超过了参数指定的位数,则四舍五入到最接近的小树位。
let num = 10.005;
console.log(num.toFixed(2));//"10.01"
另一个用于格式化数值的方法是toExponential(),返回科学计数法表示的数值字符串。与toFixed()一样,toExponential()也接收一个参数,表示结果中小数的位数。
let num = 10;
consoloe.log(num.toExponential(1));// "1.0e+1"
这段代码的输出为“1.0e+1”。一般来说,这么小的数不用科学计数法形式。如果想得到数值最适当的形式,那么可以使用toPecision().
toPecision()方法会根据实际情况返回最合理的输出结果,可能是固定长度,也可能是科学计数法形式。这个方法接收一个参数,表示结果中数字的位数(不包含指数)。
let num = 99;
console.log(num.toPrecision(1));//"1e+2"
console.log(num.toPrecision(2));//"99"
console.log(num.toPrecision(3));//"99.0"
isInteger()方法与安全整数
ES6 新增了Number.isInteger()方法,用于辨别一个数值是否保存为整数,有时候,小数位的可能让人误认为数值是一个浮点值。
console.log(Number.isInteger(1));//true
console.log(Number.isInteger(2));//true
console.log(Number.isInteger(3));//false
IEEE 754 数据格式有一个特殊的数据范围,在这个范围内二进制值可以表示一个整数值。这个数值范围从Number.MIN_SAFE_INTEGER(-2 ** 53 + 1)到 Number.MAX_SAFE_INTEGER(2 ** 53 - 1).对超出这个数值的范围的数值,即使尝试保存为整数,IEEE 754 编码格式也意味着二进制值可能会表示一个完全不同的数值,为了鉴别整数是否在这个范围内,可以使用Number.isSafeInteger()方法:
console.log(Number.isSafeInteger( -1 * (2 ** 53))); //false
console.log(Number.isSafeInteger( -1 * (2 ** 53) + 1));//true
console.log(Number.isSafeInteger( 2 ** 53)); //false
console.log(Number.isSafeInteger( 2 ** 53) - 1);//false