对内存空间的理解
Posted 君寻不惑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对内存空间的理解相关的知识,希望对你有一定的参考价值。
1.w3c中对内存空间的解释:
在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值。
- 原始值
- 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。
- 引用值
- 存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。
为变量赋值时,ECMAScript 的解释程序必须判断该值是原始类型,还是引用类型。要实现这一点,解释程序则需尝试判断该值是否为 ECMAScript 的原始类型之一,即 Undefined、Null、Boolean、Number 和 String 型。由于这些原始类型占据的空间是固定的,所以可将他们存储在较小的内存区域 - 栈中。这样存储便于迅速查寻变量的值。
如果一个值是引用类型的,那么它的存储空间将从堆中分配。由于引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。
2.对于alert(typeof null)被ECMAScript解析为object的说明:(沿用w3c上的解释)
为什么 typeof 运算符对于 null 值会返回 "Object"。这实际上是 javascript 最初实现中的一个错误,然后被 ECMAScript 沿用了。现在,null 被认为是对象的占位符,从而解释了这一矛盾,但从技术上来说,它仍然是原始值。
null:对象的占位符;
undefined:声明了变量但未对其初始化时赋予该变量的值;
且alert(null == undefined);弹出值为true;
3.NaN:
1)NaN == NaN与 NaN === NaN返回的都是false;即NaN不等于它本身;
2)一般不直接使用NaN,而是函数isNaN();
n. 创建内存空间的情况:定义一个对象名(引用类型),指向一片内存空间。
当var a = {n:1};时,a就指向一片内存空间,我们可以把它称为inMemoryObject;
示意图:
a--|
|————>>inMemoryObject {
n:1
}
当发生var b = a;时,b也指向了这片内存空间。
示意图:
a--|
b--|
|————>>inMemoryObject {
n:1
}
此时,若发生var a.x = a = {n:2};
这里涉及到变量的赋值与表达式的解析的顺序问题;
变量的赋值顺序:右>>——>>左; 变量名 = 值;
表达式的解析顺序:左>>——>>右; 变量名1 = 变量名2;
以上是关于对内存空间的理解的主要内容,如果未能解决你的问题,请参考以下文章