1.javascript变量包含两种不同数据类型的值:基本类型和引用类型。
基本类型值指的是简单的数据段,包括es6里面新增的一共是有6种,具体如下:
number
、 string
、 boolean
、 null
、 undefined
、 symbol
引用类型值指那些可能由多个值构成的对象,只有一种如下:
object
而数组Array和对象Object的数据类型都属于引用数据类型 object
在将一个值赋给变量时,解析器必须确定这个值是基本类型值还是引用类型值。基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值。
引用类型的值是保存在内存中的对象。与其他语言不同,JavaScript 不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。 在操作对象时, 实际上是在操作对象的引用而不是实际的对象。
2.Javascript的变量的存储方式--栈(stack)和堆(heap)
- 栈:自动分配内存空间,系统自动释放,里面存放的是基本类型的值和引用类型的地址
堆:动态分配的内存,大小不定,也不会自动释放。里面存放引用类型的值。
3.值传递与址传递
//地址传递 var aa="strs"; var bb=aa; aa="strs2"; console.log(aa); //strs2 console.log(bb); //strs //浅拷贝 地址传递 var aa = { a: 1, b: 2 }; //定义对象 数组同例 var bb = aa; //此时是地址传递,两个变量指向栈上同一个地址 aa.a = 3; //改变堆上地址对应的值 console.log(aa); //{ a: 3, b: 2 }; console.log(bb); //{ a: 3, b: 2 }; //深拷贝 地址传递 var aa = { a: 1, b: 2 }; var bb = JSON.parse(JSON.stringify(aa));//序列化之后反序列化,在栈上开辟了独立空间 aa.a = 3; //改变堆上地址对应的值 console.log(aa); //{ a: 3, b: 2 }; console.log(bb); //{ a: 1, b: 2 };
需要注意的是,如果对象比较大,层级也比较多,深复制会带来性能上的问题。在遇到需要采用深复制的场景时,可以考虑有没有其他替代的方案。在实际的应用场景中,也是浅复制更为常用.
评论 (0)