不同类型数据之间的转换:
转换成字符串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';