JS数据类型转换

241 阅读3分钟

不同类型数据之间的转换:

转换成字符串String:

方法1:toString(obj)方法,除了null,undefined使用该方法会报错,其他几种类型使用toString均可以将数据转换成字符串形式,只不过对象的返回值是[object Object]这样的形式。

方法2:''(空字符串)+obj,使用+会自动将加号两端的数据转换成同一类型再相加,这种方法下null和undefined可以正常返回一个字符串。

方法3:window.String(obj)方法,和使用加号功能一样。

转换成布尔值Boolean:

方法1:Boolean(obj),该方法有五个特殊情况返回false,就是当obj是0,NaN,''(空字符串),null,undefined时,其他情况均返回true。

方法2:给obj取反两次,即!!obj。

转换成数字Number:

方法1:Number()方法

方法2:parseInt(),将对象转为整数

方法3:parseFloat(),转换成浮点数

方法4:obj-0

方法5:给obj取真,即+obj


内存存储数据原理

加载页面的过程中内存变化:

开机后将内存分给浏览器,打开浏览器浏览器将内存分给每个页面,每个页面再将内存分给不同资源。浏览器解析页面里的js时,先将所有变量进行变量提升,然后开始逐行运行代码,会将得到的内存分为两大区域,代码区(存储代码)和数据区(存储数据),数据区又分为Stack栈内存和Heap堆内存。

var a=2;
var b=a;
b=1;

上面代码存储过程是:
解析代码把a存入代码区,然后在栈内存存入2对应的二进制64位浮点数;

b=a,将b存入代码区,把a的栈内存中的数值复制到b对应的栈内存中,此时b=2,a=2;

重新给b赋值,b对应的栈内存内的值变为1,此时b=1,a=2;

如果要存的是简单数据类型,就直接存在栈内存,如果是复杂数据类型,因为不确定长度,还有可能追加内容,就要用到堆内存。

var a={name:hello,age:18};
var b=a;
b={name:world}
a['height']='233';

上面代码存储过程是:

把a存入代码区,把内容存在堆内存,栈内存中存入一个地址指向堆内存中数据的位置;

b=a,将b存入代码区,把a的栈内存中的地址复制到b对应的栈内存中,指向同一个堆内存内容;

在堆内存创建一个位置,存入name:world,然后将地址存入b对应的栈内存中,此时b={name:world},a={name:hello,age:18};

给a追加内容,先去栈内存里找堆内存的地址,然后直接将新内容追加到原来的堆内存里面,此时a={name:hello,age:18,height:223};

垃圾回收

如果一个对象没有被引用,不管是直接引用还是间接引用,那么这个对象就会被当做网络垃圾被浏览器回收,释放内存给其他对象用。

内存泄露

因为浏览器bug导致该被回收的内容没有被回收,一直占用着内存,导致无法分配内存给新内容。

深拷贝

对于基本数据类型来说,等号赋值就是一个深拷贝,即一个变化不影响另一个的值

var a=2;
var b=a;
b=1;

浅拷贝

对于对象,即复杂数据类型来说,简单的等号赋值是浅拷贝,即一个变了,另一个也跟着变

var a={name:hello,age:18};
var b=a;
b['name']='233';