我们已经知道了JS的六种基本数据类型:number,boolean,string,object,undefined,null,但是js是动态类型1语言,变量没有类型限制,可以随时赋予任意值。所以我们来讨论js的数据类型转换。
一 强制转换
强制转换主要指使用Number、String和Boolean三个函数,手动将各种类型的值,分布转换成数字、字符串或者布尔值。
Number转换
数值:转换后还是原来的值
字符串:如果可以被解析为数值,则转换为相应的数值Number('324')// 324//
字符串:如果不可以被解析为数值,返回 NaN
空字符串转为0
布尔值:true 转成 1,false 转成
undefined:转成 NaN
null:转成0
String函数
数值:转为相应的字符串。
字符串:转换后还是原来的值。
布尔值:true转为字符串"true",false转为字符串"false"。
undefined:转为字符串"undefined"。
null:转为字符串"null"。
Boolean函数
undefined,null,-0或+0,NaN'',(空字符串)转换为false,其余全部为true
二 自动转换
遇到以下三种情况时,JavaScript 会自动转换数据类型,即转换是自动完成的,用户不可见。
第一种情况,不同类型的数据互相运算。
第二种情况,对非布尔值类型的数据求布尔值。
第三种情况,对非数值类型的值使用一元运算符(即+和-)。
自动转换的规则是这样的:预期什么类型的值,就调用该类型的转换函数。比如,某个位置预期为字符串,就调用String函数进行转换。如果该位置即可以是字符串,也可能是数值,那么默认转为数值。
由于自动转换具有不确定性,而且不易除错,建议在预期为布尔值、数值、字符串的地方,全部使用Boolean、Number和String函数进行显式转换。
自动转换为布尔值
JavaScript 遇到预期为布尔值的地方(比如if语句的条件部分),就会将非布尔值的参数自动转换为布尔值。系统内部会自动调用Boolean函数。
自动转换为字符串
JavaScript 遇到预期为字符串的地方,就会将非字符串的值自动转为字符串。具体规则是,先将复合类型的值转为原始类型的值,再将原始类型的值转为字符串。
字符串的自动转换,主要发生在字符串的加法运算时。当一个值为字符串,另一个值为非字符串,则后者转为字符串。
自动转换为数值
JavaScript 遇到预期为数值的地方,就会将参数值自动转换为数值。系统内部会自动调用Number函数。
除了加法运算符(+)有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值。
内存图
一般网页内存分为两块,一边存代码也叫做“代码区”,一边存数据“数据区”。
数据区又分两块,左边Stack(栈内存),右边Heap(堆内存)。
画内存图时,
把值(简单的数据类型)直接放在Stack里;
复杂型的如(object)把Heap ADDR存入Stack里。
深拷贝与浅拷贝(有点类似于指针?)
var a = 1
bar b = a
b = 2
a = ?
//a = 1
上面代码表示b变不影响a,如果能实现这样的,简单类型除对象的赋值就叫做深拷贝!(b变a不变)
var a = {name:'a'}
var b = a
b.name = 'b'
a.name ?
//a.name = 'b'
b变化导致a也跟着变化,这就叫做浅拷贝。(b变a也变)
网友评论