js里运算时会进行判断,自动进行数据类型的转换。也有手动方法进行转换。
类型转换
任意类型转字符串
String(x)
x.toString
x + ''
任意类型转数字
Number()仅用于纯数字字符串转为数字,有其它字符时会报错
Number(x)
parseInt(x,10)
parseFloat(x)
x - 0
+ x
任意类型转为布尔值
Boolean()
五个falsy值
0,NaN,' ',null,undefined这5个值在判断中,被转换为布尔值时,会被转换为false
if (null)
if (undefined)
if (0)
if (NaN)
if ('')
if ("")
内存&深浅拷贝
内存分为堆内存,栈内存。
- Stack栈内存优点是速度快,但是空间小。
- Heap堆内存空间大,且是多线程共享的,但是速度慢一点。
- 对于简单数据,放在stack里,复杂数据类型(如对象)放在heap里。下面是两个例子,涉及深浅拷贝。
var a = 1
var b = a
b = 2
console.log(b) //2
console.log(a) //1
上面b = a时,可以理解为在栈里新建了一块地方,并把a的值复制过来。现在stack中有a的位置,值为1,也有b的位置,值为1。a,b各是两座房子。这是深拷贝
var a = {name: 'hello'}
var b = a
b.name = 'b'
console.log(a.name) //b
上面对b的属性操作时,发现a的属性也变了。
原因:这里的对象是一个复杂的类型,它里面的数据比较多,增加属性时要占更多的内存,要放一个别墅中。所以这座房子并没有直接存在stack中。stack中有a,但a中只是记录了别墅在heap的位置。
这里b = a时,栈中新建了地方,放了b,b中记录了数据在heap中的位置。但是数据在heap中并没有新建一块地方并存放。b中记录的位置和a中的相同。也就是说,a,b都指向heap中的同一个位置。对a, b进行操作时,都会使这一个值发生改变。这也是浅拷贝的例子。
区分数据是存在stack中还是heap中!
网友评论