类型之间的转换
转换为字符串
Console.log
打印的都是字符串。
string
tostring
x+''
这种方法最方便,1+''
,但是需要注意,{}+''
为0,存在变量里面的空对象可以。
转换数字Number
Number(x)
Number(true)
1
Number(null)
0
Number(false)
0
parseInt(x, 10)
- 如果字符串
string
以"0x"或者"0X"开头, 则基数是16 (16进制). - 如果字符串
string
以"0"开头, 基数是8(八进制)或者10(十进制),那么具体是哪个基数由实现环境决定。ECMAScript 5 规定使用10,但是并不是所有的浏览器都遵循这个规定。因此,永远都要明确给出radix参数的值。 - 如果字符串
string
以其它任何值开头,则基数是10 (十进制)。
parseInt('011')
11
parseInt('011',8)
9
parseInt('011',10)
11
parseInt('s')
NaN
parseInt('1s')
1
parseFloat(x)
x - 0
+x
转换布尔Boolean
Boolean(x)
!!x
更常用
是除了下面六个值被转为
false
,其他值都视为true
。
undefined
null
false
0
NaN
-
""
或''
(空字符串)
js内存图
var a = 1
var b = 2
var c = {
name = 'cuilei'
Age = '24'
}
这些代码对计算机做了什么。
1.变量提升
2.js中64位浮点数存储1
,属于stack数据结构。
3.存储object时,使用heap数据结构更灵活,可以后期修改内容。如果使用stack,后期更改顺序,添加删除内容都要更改顺序,很麻烦。stack数据结构的特点。
4.object在stack中存指定地址,地址引用heap中存储的数据。
- 你买一个 8G 的内存条
- 操作系统开机即占用 512MB
- Chrome 打开即占用 1G 内存
- Chrome 各每个网页分配一定数量的内存
- 这些内存要分给页面渲染器、网络模块、浏览器外壳和 JS 引擎(V8引擎)
- JS 引擎将内存分为代码区和数据区
- 我们只研究数据区
- 数据区分为 Stack(栈内存) 和 Heap(堆内存)
- 简单类型的数据直接存在 Stack 里
- 复杂类型的数据是把 Heap 地址存在 Stack 里
基本类型变量存的是值,复杂类型的变量存的是内存地址。
基本类型在赋值的时候拷贝值,复杂类型在赋值的时候只拷贝地址,不拷贝值。
var a = {}
a.self = a//self里面存了a的地址
a.self.self.self
垃圾回收
如果对象没有被引用,他就会被垃圾回收。
var fn = function(){}
document.body.onclick = fn
fn = null//fn不是垃圾
页面关掉fn变成垃圾
ie有bug,认为fn不是垃圾
深拷贝和浅拷贝
var a = 1
var b = a
b = 2 //这个时候改变 b
a 完全不受 b 的影响
那么我们就说这是一个深复制
对于简单类型的数据来说,赋值就是深拷贝。
对于复杂类型的数据(对象)来说,才要区分浅拷贝和深拷贝。
这是一个浅拷贝的例子
var a = {name: 'frank'}
var b = a
b.name = 'b'
a.name === 'b' // true
因为我们对 b 操作后,a 也变了
什么是深拷贝了,就是对 Heap 内存进行完全的拷贝。
var a = {name: 'frank'}
var b = deepClone(a) // deepClone 还不知道怎么实现
b.name = 'b'
a.name === 'a' // true