数据类型
JavaScript类型分为基本类型(原始类型)和引用类型(对象类型)两类。
基本类型(原始类型)
JavaScript基本类型包括数字、字符串、布尔值、null和undefined。JavaScript学习笔记1_null和undefined传送门!
引用类型(对象类型)
JavaScript中除数字、字符串、布尔值、null和undefined之外的都是引用类型(对象类型),主要包括对象、数组和函数。JavaScript
类型转换
转换规则见下表:
值 | 转换为: | |||
---|---|---|---|---|
字符串 | 数字 | 布尔值 | 对象 | |
undefined | "undefined" | NaN | false | throws TypeError |
null | "null" | 0 | false | throws TypeError |
true | "true" | 1 | new Boolean(true) | |
false | "false" | 0 | new Boolean(false) | |
""(空字符串) | 0 | false | new String("") | |
"1"(非空数字) | 1 | true | new String("1") | |
"one"(非空字符) | NaN | true | new String("one") | |
0 | "0" | false | new Number(0) | |
-0 | "0" | false | new Number(-0) | |
NaN | "NaN" | false | new Number(NaN) | |
Infinity | "Infinity" | true | new Number(Infinity) | |
-Infinity | "-Infinity" | true | new Number(-Infinity) | |
1(非0数字) | "1" | true | new Number(1) | |
{}(任意对象) | 参考转为字符串或数字 | 参考转为字符串或数字 | true | |
[](空数组) | "" | 0 | true | |
[1](1个数字元素) | '1' | 1 | true | |
['a'](非数字元素) | 使用join()方法 | NaN | true | |
function(){}(任意函数) | 参考转为字符串或数字 | NaN | true |
注意:使用Object()函数将null或undefined转换为对象不会抛出异常,仅会返回一个新建的空对象{}。
Object(undefined) // {}
Object(null) // {}
显示类型转换
- 使用Number()、Boolean()、String()或Object()函数(不通过new关键字调用这些函数)进行显示类型转换。
- 转换为Boolean时:仅""、null、undefined、0、NaN、false会转换为false,其他任何值都转换为true。
Number("2") // 2
Number("a12b") // NaN
Number("12a") // NaN
Number(true) // 1
String(false) // "false"
Boolean("false") // true 仅""、null、undefined、0、NaN、false会转换为false,其他都转换为true
Object(3) // 等价于new Number(3)
对象转换为原始值
转为Boolean
任何对象(包括数组和函数)在转为布尔值时都为ture,new Boolean(false)对象在转换时也为true。
转为字符串或数字
数组转换为字符串或数字参考上面的表格
- 除了null和undefined以为的任何值都具有toString(),这个方法的执行结果通常和String()方法的返回结果一致。
- 对象在转换为String时,是通过调用待转换对象的一个方法来完成的。
- 所有的对象都继承了toString和valueOf方法。通过这两个方法,我们可以完成对象到字符串或数字的转换。
- toString方法返回字符串,我们可以通过重写该方法,使之返回比较有意义的信息。
- valueOf方法一般只是简单的返回对象本身。日期类Date的valueOf返回1970/1/1以来的毫秒数。
转为字符串的步骤
- 如果对象具有toString方法,则自动调用该方法。如果该方法返回原始值,JavaScript会将这个值转换为字符串(返回值可以是非字符串),并返回这个字符串。转换为字符串的规则可以参照上面的表格。
- 如果没有toString方法,或toString的返回值不是原始值,那么JavaScript会调用valueOf方法,如果valueOf方法返回原始值,JavaScript会将该值转换为字符串并返回。
- 如果toString和valueOf方法都没有返回原始值,这时会抛出类型转换异常。
转为数字
在对象转为数字的过程中,JavaScript做了同样的事情,只是会先调用valueOf方法。
- 如果对象具有valueOf方法,该方法返回原始值,则将原始值转换为数字并返回。
- 如果没有valueOf方法或返回值不是原始值,则调用toString方法,如果同String方法返回一个原始值,则转换为数字返回。
- 如果toString和valueOf方法都没有返回原始值,这时会抛出类型转换异常。
- 原始值:基本类型。
- 非原始值:引用类型。
var o = { // 都返回原始值
toString: function() {return 1;},
valueOf: function() {return 2;}
}
'' + o // '1'
0 + o // 2
var o = {
toString: function() {return true;},
valueOf: function() {return {};}
}
'' + o // 'true'
0 + o // 1 valueOf返回{}非原始值,因此调用toString,返回true,true转为数字为1
var o = {
toString: function() {return [1,2,3];},
valueOf: function() {return {};}
}
'' + o // TypeError: Cannot convert object to primitive value
0 + o // TypeError: Cannot convert object to primitive value
网友评论