js数据类型(二)

类型转换

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 :

  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.png

a此时地址为55,没有x,所以是undefined
b指向54,b.x是ADDR54指向的是一个对象,调用toString方法,结果是
[object Object]

垃圾回收

如果一个对象没有被引用,他就是垃圾 将被回收

image.png
image.png

fn=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

你可能感兴趣的:(js数据类型(二))