最近在阅读 《Javascript高级程序设计 第三版》,会不时的将其中重要的知识点记录下来。
本文将根据数据类型来列出各种类型转换的情况。
typeof 是检验变量的数据类型的操作符,可检测的类型和返回的结果如下:
实际上null是一个空对象指针,所以在前面提到的 typeof null
中会返回 object
。
Undefined 派生于 null,所以以下表达式会返回 true:
undefined == null; // return true
但是两者的用法完全不同。
Boolean(): 将其他数据类型转换为布尔值。
其中的转换规则如下:
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | “”(空字符串) |
Number | 任何非0数字值(包括无穷大) | 0 和 NaN |
Object | 任何对象 | null |
Undefined | 不适用 | undefined |
基本数值字面量格式是十进制,但也能不同的字面量格式表示 八进制 、 十六进制。
var num1 = 55; // 十进制 55
var num2 = 055; // 八进制 等于十进制的 45
var num3 = 0x55; // 十六进制 等于十进制的 85
但是如果字面值超过进制的范围,前导将被忽略。后面的值当做 十进制 解析。如下:
var num2 = 079; // 无效的 八进制,解析为 十进制 79
在进行算数计算时,任何进制的值最终都会转换为十进制
由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript 会不失时机地将浮点数值转换为整数值。例如以下这种情况:
var float = 1.; // 解析为1
var float2 = 10.0; // 解析为10
浮点数值的最高精度是17 位小数,但在进行算术计算时其精确度远远不如整数。例如,0.1 加0.2的结果不是0.3,而是0.30000000000000004。这个小小的舍入误差会导致无法测试特定的浮点数值。例如:
if (a + b == 0.3){ // 不要做这样的测试!
alert("You got 0.3.");
}
在这个例子中,我们测试的是两个数的和是不是等于0.3。如果这两个数是0.05 和0.25,或者是 0.15 和 0.15 都不会有问题。而如前所述,如果这两个数是0.1 和0.2,那么测试将无法通过。因此,永远不要测试某个特定的浮点数值。
要计算这类值时可以先将浮点数值转换为整型,计算出结果后再除以相应的10的倍数:
var float1 = 0.1;
var float2 = 0.2;
var result = (float1 * 10 + float2 * 10) / 10; // 0.3
关于浮点数值计算会产生舍入误差的问题,有一点需要明确:这是使用基于IEEE754 数值的浮点计算的通病,ECMAScript 并非独此一家;其他使用相同数值格式的语言也存在这个问题。
Number.MAX_VALUE: ECMAScript 能够表示的最小数值,在大多数浏览器中,这个值是5e-324,如果小于这个数,则是-Infinity(负无穷)。
Number.MIN_VALUE: ECMAScript 能够表示的最大数值,在大多数浏览器中,这个值是1.7976931348623157e+308,如果大于这个数,则是Infinity(正无穷)。
NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。
注意,该数值并非唯一的。
NaN == NaN; // return false
isNaN() 这个函数接受一个参数,该参数可以是任何类型,而函数会帮我们确定这个参数是否“不是数值”。函数会先把参数转换为数字,如果无法转换为数字,则返回true。
isNaN(NaN); //true
isNaN(10); //false(10 是一个数值)
isNaN("10"); //false(可以被转换成数值10)
isNaN("blue"); //true(不能转换成数值)
isNaN(true); //false(可以被转换成数值1)
有3 个函数可以把非数值转换为数值:
其中,Number()函数的转换规则如下
parseInt()函数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直至找到第一个非空格字符。
例子如下:
var num1 = parseInt("1234blue"); // 1234
var num2 = parseInt(""); // NaN
var num3 = parseInt("0xA"); // 10(十六进制数)
var num4 = parseInt(22.5); // 22
var num5 = parseInt("070"); // 56(八进制数)
var num6 = parseInt("70"); // 70(十进制数)
var num7 = parseInt("0xf"); // 15(十六进制数)
由于ECMAScript 3 和5 存在分歧。所以可以为这个函数提供第二个参数:转换时使用的基数(即多少进制)。
var num = parseInt("0xAF", 16); //175
parseFloat() 和 parseInt() 的情况大部分相同。不同点如下:
要把一个值转换为一个字符串有两种方式。
toString(): 该函数几乎每个值都有(数值、布尔值、对象和字符串值都有,但null和undefined没有)。转换数值时可以传入参数,作用是以多少进制返回数值的字符串表示。
String(): 在不知道要转换的值是不是null 或undefined 的情况下,还可以使用转型函数String(),这个
函数能够将任何类型的值转换为字符串。String()函数遵循下列转换规则:
例子如下:
var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
alert(String(value1)); // "10"
alert(String(value2)); // "true"
alert(String(value3)); // "null"
alert(String(value4)); // "undefined"
Object对象自带的类型转换函数有: