按照ECMA-262的定义,javaScript的变量与其他语言的变量有很大区别。JavaScript变量松散类型的本质(即弱值类型),决定了它只是在特定时间用于保存特定值的一个名字而已。
取自JavaScript高级程序设计(第三版)
基本类型值:Undefined、Null、Boolean、number、String(注意:在其他语言中String一般作为引用类型保存,但是ECMAScript放弃这一传统)
这些类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们通过按值来访问的。
同时 我们不能给基本类型的值添加任何的属性。
引用类型:比较常见的有Array、Object、function、等等
由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址大小的固定的,因此可以将内存地址保存在栈内存中。这样,当查询引用类型的变量时,先从栈中读取内存地址,然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用类型。
当然了这种类型我们可以更改其属性。
相关衍生:
深复制和浅复制
首先我们来看一下数据机构中的4个术语:shallow copy(not shadow copy) 、deep copy、pass by value、pass by reference(or pass by address)。传值和传址我们可以根据上面讲的数据类型进行理解。
然后我们了解一下什么是深复制什么是浅复制呢?
字面上面的:
|
简单来说浅复制其实会相互影响,他们在内存中引用同一块地址。而深复制在内存中有2个地址存放相互之间不影响。