数据转换,以及内存图的几个概念

2019-02-21  本文已影响0人  吴一晏

1.类型转换
1.1转成string
①:toString
语法:a.toString() a可以是数字,可以是对象,但是不能是null和undefined。这里说一下对象
用这种方法转的字符串显示是如下图


1550738683(1).jpg

②:全局函数 String
语法 String(a) a在这也可以是null和undefined


2.jpg
③:a + ''
这方法和String 功能相同,但是写起来更方便。

1.2.转成Boolean
①:全局函数Boolean
语法:Boolean()
②:在引用前面加!!
比如!!1
转成Boolean时候:数字里只有0和NaN结果是false;字符串里只有空字符串是false;null和
undefined是false;对象全是true。
所以0,NaN,null,undefined,空字符串这五个被称为falsy值。

1.3转成Number
①:全局函数Number
语法:Number('1')
②:parseInt
语法:parseInt('1',10) 这表明是转换成十进制的数字,还可以是八进制,十六进制。
这方法会把能转的数字都转过来,比如parseInt('1t') 结果显示为1
③:parseFloat
讲给定的值转换成浮点数,转换不了则返回一个NaN。
④:-0
'1'-0 结果为1, '1.23'-0 结果为1.23
⑤:取正
注意取正不是取绝对值。如图:


3.jpg

2.内存图
数据在存入内存的时候,简单数据是直接存放在stack(栈)里面(数字是64位,字符是16
位),复杂数据是以地址的形式存放在Heap(堆)里,stack只是做一个引用。如图:


4.jpg

那么画内存图有啥用呢?举个例子:一道面试题


1.jpg
第一句和第二句,只是简单的赋值,会在Heap里生成一个地址比如100,里面有{n:2}。a和b
在stack存储的分别指向这个地址adds100.
2.jpg
第三句a.x = a = {n:2}相当于 var a = {n:2}; a.x = a; 指定了个新的key-value{x:a}\(a={n:2})

加入到a里面。并且生成一个新的地址101,内容是{n:2}存放在heap里,并且将它赋值给a。
内存图变成:


3.jpg
所以alert(a.x)为undefined。alert(b.x)为[object,Object]。

3.垃圾回收
如果一个对象没有被引用,那么它就是垃圾,将被回收。比如地址100和地址101,a和b全引
用的地址101,地址100就是垃圾。

4.深拷贝和浅拷贝
基本类型里,赋值全都是深拷贝。
对象中,假如改变b导致a改变,那么就叫浅拷贝。
假如赋值b,使b指向另一块内存,但是b和a的内容又是一模一样,就叫深拷贝。

上一篇下一篇

猜你喜欢

热点阅读