1 类型转换
1.1 转换为字符串
- toString()
- '' +
- string()
var n = 1;
n.toString() // "1"
1 + '' || '' + 1
string(1) // 和 '' + 1 功能一样
var n = true;
n.toString() // "true"
true + '' || '' + true // 老司机写法
string(true)
var n = null
n.toString() // 报错 Cannot read property 'toString' of null
'' + null // "null"
string(null) // "null"
var n = undefined
n.toString() // 报错 Cannot read property 'toString' of undefined
'' + undefined // "undefined"
string(undefined) // "undefined"
var object = {name: "aaa"}
object.toString() // "[object Object]"
object + '' || '' + object // "[object Object]"
string(object) // "[object Object]"
1.2 转换为布尔
-
Boolean()
五个falsy(假的)值: 0 NaN ''(空字符串) null undefined
Boolean(0) Boolean(NaN) Boolean('')空字符串 Boolean(null) Boolean(undefined) 都是false
-
!!
更简洁的转换为布尔的方法
1.3 转换为Number
-
Number()
Number()可以把任意值转换成数值,如果要转换的字符串中有一个不是数值的字符,返回NaN
Number('1') // 1
- parseInt()
parseInt('1', 10) // 1 第二个参数表示进制
var num1 = parseInt("12.3abc"); // 返回12,如果第一个字符是数字会解析知道遇到非数字结束
var num2 = parseInt("abc123"); // 返回NaN,如果第一个字符不是数字或者符号就返回NaN
- parseFloat()
parseFloat('1.23') // 1.23
parseFloat()把字符串转换成浮点数
parseFloat()和parseInt非常相似,不同之处在与
parseFloat会解析第一个. 遇到第二个.或者非数字结束
如果解析的内容里只有整数,解析成整数
parse 解析
- ‘1’ - 0
'1' - 0 // 1
'1.23' - 0 // 1.23
- **+ ** -
+ '1' // 1
+ '1.23' // 1.23
+ '.1' // 0.1
+ '-1' // -1
- '-1' // 1
- (- '-1') // -1
2 内存图(重点)
你买一个 8G 的内存条
操作系统开机即占用 512MB
Chrome 打开即占用 1G 内存
Chrome 各每个网页分配一定数量的内存
这些内存要分给页面渲染器、网络模块、浏览器外壳和 JS 引擎(V8引擎)
-
JS 引擎将内存分为代码区和数据区
代码区存代码,数据区存数据
var a = 1 a在代码区 1在数据区
我们只研究数据区
数据区分为 Stack(栈内存) 和 Heap(堆内存)
简单类型的数据直接存在 Stack 里
复杂类型的数据是把 Heap 地址存在 Stack 里
数字 64位 字符 16位
object是对象的引用
垃圾回收
如果一个对象没有被引用,它就是垃圾,将被回收
var a = {name: 'a'}
var b = {name: 'b'}
b = a
// {name: 'a'}就是垃圾,将被回收
3 深拷贝
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 === 'frank' // true
4 简单类型和复杂类型的区别
基本类型又叫做值类型,复杂类型又叫做引用类型
值类型:简单数据类型,基本数据类型,在存储时,变量中存储的是值本身,因此叫做值类型。
引用类型:复杂数据类型,在存储是,变量中存储的仅仅是地址(引用),因此叫做引用数据类型。