博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对内存空间的理解
阅读量:5025 次
发布时间:2019-06-12

本文共 1999 字,大约阅读时间需要 6 分钟。

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};

  在程序开始执行赋值语句前,对于a指向的inMemoryObject这片内存空间中,先定义了一个属性名x(占位符),其值为undifined;然后开始解析赋值语句,程序执行到最后,a的指向从原来的inMemoryObject 改变为secondObj,inMemoryObject.x同样指向secondObj。这里比较难理解的是a的指向改变了,而a.x的中a的指向没有改变!!

  示意图:

    b--|

    a--|

       |————>>inMemoryObject{

              n:1,

              x:undefined--|

            }         |

    a--|————>>————————— |————>>secondObj{

                             n:2   

                           }

  这里涉及到变量的赋值与表达式的解析的顺序问题;

  变量的赋值顺序:右>>——>>左;  变量名 = 值;

  表达式的解析顺序:左>>——>>右;  变量名1 = 变量名2;

n+1

  Object对象中create方法解析

Object.create = function(obj) {

//Object.create方法自己实现

    function name(){
    }
    name.prototype = obj;
    return new name();
}
var obj = {
    a: 34;
}
obj.a = 67;
function name(){
}
name.prototype = obj;
var newObj = new name();
newObj.a ---> 34;
newObj.a ---> 67;

转载于:https://www.cnblogs.com/foxNike/p/5598498.html

你可能感兴趣的文章
ASP.NET MVC一次删除多笔记录
查看>>
使用HashSet<>去除重复元素的集合
查看>>
JSON 小记
查看>>
《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---06
查看>>
[1-4] 把时间当做朋友(李笑来)Chapter 4 【开拓我们的心智】 摘录
查看>>
redis数据过期策略【转】
查看>>
ASP.net MVC4 View设置Html代码显示为文本字符问题
查看>>
go语言之进阶篇关闭channel
查看>>
《那些年啊,那些事——一个程序员的奋斗史》——65
查看>>
opencv 内存溢出问题
查看>>
简单的静态网页(宠物网)
查看>>
HDU 5410(2015多校10)-CRB and His Birthday(全然背包)
查看>>
hdu 2874 Connections between cities(st&rmq LCA)
查看>>
【Linux基础学习之五】Linux管理命令的基础学习(df、du、free、kill、tar等)
查看>>
20171115
查看>>
求最长公共子串
查看>>
根据百度API获得经纬度,然后根据经纬度在获得城市信息
查看>>
强制客户端更新Silverlight XAP文件方法汇总(转)
查看>>
Android tabLayout+recyclerView实现锚点定位
查看>>
numpy.squeeze()的用法
查看>>