JS中的类型以及类型转换
在文章开始,先提一个问题,在JS中,1+‘1’-1的值是多少?答案可以在文章中找到。
JS存在以下几种数据类型:Number, String, Object, Function, Null, Undefined, Boolean, Array, Date, Expression, Error.
Null是一种空值. var i = null; 如果使用var i; 则i为undefined. 声明过但没有赋值的变量都为undefined.
Error跟java中的exception类似,使用throw, try-catch对其操作。
Expression为正则表达式。
不同的数据类型在计算,比较和赋值时,可以进行类型转换。所有的类型可以向String, Number, Boolean和Object进行转换,下面表格为转换的准则,此表格引自JS权威书籍。
数据类型判断当前运算的上下文需要什么类型,如果类型不符合,则进行相应的类型转换。比如'2'*3,上下文需要Number进行乘法,'2'将转换成Number.
有的时候,当前运算上下文可能会有多种解释,比如1+'1', +可以是Number运算,也可以是String拼接。那应该转换谁呢?
+, 当运算的一边出现String的时候,则优先选择String运算。如果为Object,则尝试调用Object的valueOf()或者toString().
==, 当运算符两边是Number和String,则转换String为Number。运算符一边是Boolean,转true为1,转false为0。Null和Undefined相等。如果Object1===Object2,则Object1==Object2,否则调用Object的valueOf()或者toString()转为primitive类型。NaN与任何东西比较都返回false。
>,>=,<,<=, 运算符两边只接受Number,String两种数据的比较。如果两边同为Number,则按照Number比较,如果两边同为String,则按照字母顺序来比较。如果两边同时具有Number和String,则将String转换为Number。如果数据类型不是Number或者String,则转换为Number或者String。NaN与任何东西比较都返回false。
根据上面的规则,1+'1'-'1'应该等于10,1==true, 0<true, '1'==true. 大家可以去试试。
JS里面的变量以primitive type和reference type区分。在赋值,传值和比较时,使用的是value还是reference,以下表为准:
Type | Copied by | Passed by | Compared by |
Number | Value | Value | Value |
Boolean | Value | Value | Value |
String | Immutable | Immutable | Value |
Object | Reference | Reference | Reference |
转载于:https://my.oschina.net/xpbug/blog/61068