标签:保存 位置 存储 需要 strong 堆内存、栈内存 相互 例子 也会
ECMAScirpt 变量有两种不同的数据类型:** 基本类型,引用类型 **。
也有其他的叫法,比如 ** 原始类型 ** 和 ** 对象类型 ,拥有方法的类型和不能拥有方法的类型,
还可以分为 可变类型 ** 和 ** 不可变类型 **。
1. 基本类型
基本的数据类型有:undefined,boolean,number,string,null。
基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值。
基本类型有以下几个特点:
** 基本类型的值是不可变的 **:
任何方法都无法改变一个基本类型的值,比如一个字符串:
** 注意:** 所以,要改变基本类型的值。只能采取重新复制的办法,将一个新的值整个赋值给该变量!!。(要记住)
对于下面的例子:
lang 的值(指向的内存区块的值)并没有被改变,而是重新开辟一个内存用来储存 lang + ‘java‘,再将 这个内存地址重新复制给 lang。
** 注意:** 原先存储‘java‘的内存还在。系统的内存自动清理检测到该内存没有被引用时,会将其清空。
** 基本类型的比较是值的比较:**
即:他们的值相等,就可相等。
在用 == 比较两个不同类型的变量时会进行一些类型转换。上面的比较先把 true 转换为数字 1 再和数字 1 进行比较,结果就是 true 了。 基本类型中,当两个值的类型相同的时候,== 就相当于 ===。
** 基本类型的变量是存放在栈区的 **
栈区是指内存里的栈内存。内存地址从高往低,因为栈内存较小,空间有限,高到低的地址易于知道剩余内存。
栈区存储了变量符和变量的值。
? javascript 和其他语言不同,其不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。所以引用类型的值是按引用访问的,是操作对象的引用。准确地说,引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,
也可以说是该对象在堆内存的地址。
假如有以下几个对象:
引用类型时按引用访问的,换句话说就是比较两个对象的堆内存中的地址是否相同,那很明显,person1 和 person2 在堆内存中地址是不同的.
** 所以:** 引用类型的比较中,== 和 === 没区别,都是指向同一个地址,即同一个对象是,才能相等。
4. 对象赋值
当从一个变量向另一个变量赋值引用类型的值时,同样也会将存储在变量中的对象的值复制一份放到为新变量分配的空间中。前面讲引用类型的时候提到,保存在变量中的是对象在堆内存中的地址,所以,与简单赋值不同,这个值的副本实际上是一个指针,而这个指针指向存储在堆内存的一个对象。那么赋值操作后,变其中任何一个变量,都会相互影响:
** 因此,引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响。**
标签:保存 位置 存储 需要 strong 堆内存、栈内存 相互 例子 也会
原文地址:https://www.cnblogs.com/hongyong/p/11609412.html