JS数据类型深入
2018-08-17 本文已影响0人
李不远
![](https://img.haomeiwen.com/i13304449/1e30b5692f7a4687.jpg)
各类型转换
变string方法.
- toString()如表所示
var a = 1
a.toString() //'1'
var b = null
b.toString() //报错
var c = undefined
c.toString() //报错
var d = true
d.toString //'true'
-
需要转义的数据 + ''
,可以变成字符串
1 + '' //'1'
true + '' //'true'
null + '' //'null'
undefined + '' //'undefined'
obj + '' //[object Object]
-
window.String()
.结果与上种方法相同
布尔值
1.Boolean()
Boolean(1) //true
Boolean(0) //false
Boolean('hello') //true
Boolean({}) //true
Boolean(false) //false
- !!
!! null //false
!! undefined //false
!! '' //false
!! ' ' //true
!!NaN //false
- 六个falsy值: falsy是在
Boolean
上下文中认定可转换为false的值.
0
,NaN
,unll
,undefined
,''
,false
数字
Number('1') //1
parseInt('1',10) //1
parseFloat('1.23') //1.23
'1'-0 //1
+'-1.23' //-1.23
关于内存
数字为64位
字符为16位
JS的内存存储分为Stack栈内存和Heap堆内存
-
普通的数据按照顺序存储在Stack栈内存里
-
对象内的数据按照无序存储在Heap堆内存,存在Stack中的是一个地址
-
等于号只做一件事情,把一个数据拷贝到另一个数据
一下是一个示意图。不会的时候,就画图!不会的时候,就画图!!不会的时候,就画图!!!
![](http://91jean.oss-cn-hangzhou.aliyuncs.com/18-8-17/13073631.jpg)
![](http://91jean.oss-cn-hangzhou.aliyuncs.com/18-8-17/2713661.jpg)
关于循环引用
var a = {self:a}
a.self //undefined 由于变量提升不能循环引用
var a ={}
a.self = a
a.self.self //self{self:{...}}
引用类型
var a = {n:1};
var b = a;
a.x = a = {n:2};
alert(a.x); //undefined
alert(b.x); //[object Object]
垃圾回收
如果一个对象没有被引用,它就是垃圾,将被回收
var a = {name:'a'}
var b = {name:'b'}
a = b //{name:a}将会被回收
var fn = function(){}
document.body.onclick = fn
fn = null //此时的function(){}并不是垃圾
内存泄漏:由于IE9之前的浏览器存在的垃圾回收机制的问题。会导致一些元素无法被销毁。
解决办法:将需要回收的元素和数据设置为null
深拷贝与浅拷贝
基本类型在赋值的时候都是深拷贝
深拷贝是更改了Heap里的内容,所以Stack里的其他与之相关的内容会一起改变。
var a = 1
var b = a
b = 2
a = 1 //b变不影响a。此为深拷贝
浅拷贝就是Heap的内容增加了拷贝项,所以不会影响到Stack里与之相关的内容。
var a = {name:a}
var b = a
b.name = 'b'
a.name = 'b' //b变了a也变。此为浅拷贝
总结:深拷贝其实就是要拷贝Heap中的内容
——远方不远