原始类型:
number、boolean、null、undefined、string、symbol
存放在栈中,占内存小,读取快
引用类型:
object 可以动态分配内存、可以存大数据
原始数据的值存放在栈中
原始类型保存值在栈中,而引用类型保存的是指针。
例1:
var a=1;
var b=false;
var c={
name:‘xp’,
hobies: ['running','listen music']
}
栈:
a | 1 |
---|---|
b | false |
c | 指针1 |
堆:
指针1 | {name:‘xp’,hobies:指针2} |
---|---|
指针2 | [‘running’,‘listen music’] |
如上图,变量c在栈中保存指针1,hobies又是一个引用类型,所以在堆中又创建一个指针2的内存用来存放。
例2:
增加操作:
var d=c;
d.hobies = [1,2,3]//c和d的都被修改
c | 指针1 |
---|---|
d | 指针1 |
例3:
function test(person){
person.age=20;
person={
age:30
}
return person
}
var p1={age:10};//20
var p2=test(p1);//30
执行test函数,把p1的指针赋给了person,然后修改age,两个都被修改。重新给person赋值,给了新的指针,和p1没有关系。
undefined
undefined表示已定义未赋值,not defined表示未定义。
null
null是原始数据类型,但是typeof null是object,是一个源远流长的bug。
赋值的方式:
字面量、String()、new String()
var a='as';
var b=String(a);
var c=new String(a);
a.length = 0;//转为String对象,对象的length被赋值,之后对象被销毁
console.log(a.length);//2
a.split('')//['a','s']同理返回的是string对象操作的返回结果,a不受影响
a//'as'
前两种返回的是基本类型,new出来的是对象。
当基本类型调用方法时,都会由构造函数转为对应的对象去执行,执行完成后对象被销毁。这个对象就是包装对象,number、string、boolean都有对应的包装对象,null和undefined没有,所以他们不具有可以执行的方法。
例4:
2.length 会报错,为何?
数字后面的小数点会被认为是小数。
2…length 或 2.0.length 或 (2).length 或 2 .length