类型转换
number string boolean null undefined symbol object
转换成字符串
number:toString
boolean:toString
null:toString 报错
undefined:toString 报错
object:toString [object Object]老司机转成字符串
1.+'' 加一个空字符串
例如:1+'' true+'' obj+''
2.调用全局方法
window.String(obj)
转换成布尔值
利用Boolean()函数
注意:Boolean({})true
老司机转换成布尔值: !! 两个!
!!{} !!null
五个特殊值 falsy值:
1.0 false NaN false
2.'' false
3.null false
4.undefined false
数组函数都是true
如何转为number
'1' => 1 :
- Number('1') ===1
2.parseInt('1',10) === 1
3.parseFLoat('1.23') === 1.23
4.'1'-0 ===1
5.+'1' === 1
parse: 解析
eval() 函数会将传入的字符串当做 JavaScript 代码进行执行。
内存图:
内存一旦断电,数据丢失,速度快
ssd固态硬盘
js分为两块区域
代码区、数据区
数据区又分为stack栈内存和Heap堆内存
image.png先变量提升:
js数字都是以64位浮点数的形式储存的,每一个字符是16位,一行可以存4个字符
对象数据存在栈里面,要是突然要临时加一个数据,会让原来对象下面的数据都往下排,这就会导致速度非常的慢,所以在栈里面存的是地址,指向堆里面的内存
image.png image.png变量和对象之间的关系:引用
四个内存题目:
var a = 1
var b = a
b = 2
请问 a 显示是几? a=1
var a = {name: 'a'}
var b = a
b = {name: 'b'}
请问现在 a.name 是多少?a.name = 'a'
var a = {name: 'a'}
var b = a
b.name = 'b'
请问现在 a.name 是多少?a.name = 'b'
var a = {name: 'a'}
var b = a
b = null
请问现在 a 是什么?a={name:'a'}
记住画内存图,只改变栈里面的东西,不覆盖堆内存里面的东西,最多增加一条或多条属性
var a = {self:a} 结果为什么是undefined
image.png
首先变量声明var a, 然后开辟一块内存存储{self:a},此时a没有值undefined,然后把这块内存的地址赋给a
面试题
image.pnga此时地址为55,没有x,所以是undefined
b指向54,b.x是ADDR54指向的是一个对象,调用toString方法,结果是
[object Object]
垃圾回收
如果一个对象没有被引用,他就是垃圾 将被回收
image.png image.pngfn=null 此时,function并不是垃圾,虽然断了一根链接,但是还有其他的链接
image.png
浅拷贝和深拷贝
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
网友评论