4.1 基本类型和引用类型的值

            1.基本类型的值是(简单的数据段),引用类型的值是(保存在内存中的对象)。

基本类型的值在内存中占据固定大小的空间,因此被保存在栈中。(lifo)(后进先出的数据结构)

引用类型的值保存在堆(先进先出的数据结构)中。引用存放在栈中。

2.为对象添加属性时,操作的是实际对象;复制保存时操作的 是对象引用。

3.复制变量值:①基本数据类型

var num1 = 5;
var num2 = num1; //num1与num2是完全独立的

②引用类型,复制是实际上是引用。复制结束以后,2个变量引用同一个对象。

4.当在函数内部重写 对象时,对象就变成了一个局部对象。该对象在函数执行完成以后即销毁。

         function setName(obj) {
obj.name = "zds";
obj = new Object(); //重写
obj.name = "hhh";
}
var b = new Object();
setName(b);
console.log(b.name); //zds

ECMAScript 所有函数的参数都是按值传递的。(引用类型也是按值传递。上例中,对象在增加属性,操作的就是实际对象)

5.检测类型:①检测基本数据 ----typeof

②检测引用类型的数据 - instanceof

4.2 执行环境及作用域

1.①每个执行环境(每块土地)都有一个与之关联的变量对象(地主),环境中定义的变量和函数(农民和农具)都保存在这个对象中。

②web浏览器中,全局执行环境被认为是window对象。

③执行环境被销毁,保存在其中的变量和函数也随之销毁(全局环境直到应用程序退出时(例如:关闭网页或者浏览器时)才被销毁)

2.内部环境可以通过作用域链访问所有的外部环境。

3.执行环境分为,全局执行环境和函数执行环境。每进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链;

4.3 垃圾收集

1.js具有自动垃圾收集机制。这种机制的原理是:找出那些不再继续使用的变量,然后释放其占用的内存。为此,垃圾收集器会按照固定的时间间隔周期性地执行这一操作。

2.方法:①标记清除 ②引用计数

“标记清除"是目前主流的垃圾收集算法,这种算法的思想是:给当前不使用的值加上标记,然后再回收其内存

“引用计数”是跟踪记录所有值被引用的次数。目前不推荐这种。

③引用计数会遇到循环引用的问题:

var a = new Object();
var b = new Object();
a.name = b;
b.name = a;

a和b的引用次数永远都是2。

④ie的js引擎(trident)是使用标记清除策略实现的。而非原生js对象是基于计数策略的。

4.分配给web浏览器的内存数量要比分配给桌面应用程序少。是为了安全方面的考虑,目的是为了防止js的网页耗尽全部系统内存而导致系统崩溃。

因此确保占用最少的内存可以让页面获得更好的性能。而优化内存最佳方式,就是为执行中的代码只保存必要的数据,一旦数据不再引用,最好通过将其设置为null来释放其引用。----即”解除引用“

var a = {name:“zds”};

a = null';

解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其收回。

JavaScript高级程序设计(第3版) 第四章(变量、作用域和内存问题)的更多相关文章

  1. javascript高级程序设计第3版——第4章 变量作用域以及内存

  2. 《JavaScript高级程序设计》读书笔记(四)变量、作用域和内存问题

    内容---理解基本类型和引用类型的值---理解执行环境---理解垃圾收集 --JavaScript变量松散类型的本质--决定了它只是在特定时间用于保存特定值的一个名字而已--变量的值及其数据类型可以在 ...

  3. javascript高级程序设计第3版——第10章 DOM

    第十章,DOM DOM是语言中立的API,用于访问和操作HTML 和XML 文档.DOM1 级将HTML 和XML 文档形象地看作一个层次化的节点树,可以使用JavaScript 来操作这个节点树,进 ...

  4. javascript高级程序设计第3版——第6章 面向对象的程序设计

    第六章——面向对象的程序设计 这一章主要讲述了:面向对象的语言由于没有类/接口情况下工作的几种模式以及面向对象语言的继承: 模式:工厂模式,构造函数模式,原型模式 继承:原型式继承,寄生式继承,以及寄 ...

  5. JavaScript高级程序设计学习笔记第十四章--表单

    1.在 HTML 中,表单是由<form>元素来表示的,而在 JavaScript 中,表单对应的则是 HTMLFormElement 类型. HTMLFormElement 继承了 HT ...

  6. 读Javascript高级程序设计第三版第六章面向对象设计--创建对象

    虽然Object构造函数或者对象字面量都可以用来创建单个对象,但是缺点非常明显:使用同一接口创建很多对象,会产生大量重复代码. 工厂模式  1 function CreatePerson(name,a ...

  7. javascript高级程序设计第3版——第12章 DOM2与DOM3

    12章——DOM2与DOM3 为了增强D0M1,DOM级规范定义了一些模块. DOM2核心:为不同的DOM类型引入了一些与XML命名空间有关的方法,还定义了以编程方式创建Document实例的方法: ...

  8. javascript高级程序设计第3版——第1Java章 DOM扩展

    虽然DOM 为与XML 及HTML 文档交互制定了一系列核心API,但仍然有几个规范对标准的DOM进行了扩展.这些扩展中有很多原来是浏览器专有的,但后来成为了事实标准,于是其他浏览器也都提供了相同的实 ...

  9. javascript高级程序设计第3版——第8章 BOM(浏览器对象模型)

    第八章,浏览器对象模型 主要介绍了window的几个对象以及框架,窗口的关系,各个浏览器对象的属性以及方法:

  10. javascript高级程序设计第3版——第7章 函数表达式

    此张内容的难点在于闭包.而闭包又涉及到原型,原型链,执行上下环境,this的取值等知识点.(此章节对于闭包的内容篇幅较少,且写的很是艰涩难懂,推荐一位大牛的博客,对于闭包的前因后果以及作用机制写的很明 ...

随机推荐

  1. 深入浅出Oracle数据读取一致性和事务表

    保证Oracle数据库读取一致性的关键是SCN.每一个数据块头都会记录一个事务提交的SCN.同时每一数据块头都包含一个事务表(ITL),事务必须获得一个ITL事务表才能进行数据修改.该事务表用来确定当 ...

  2. 使用Kafka的一些简单介绍: 1集群 2原理 3 术语

    目录 第一节 Kafka 集群 Kafka 集群搭建 Kafka 集群快速搭建 第二节 集群管理工具 集群管理工具 集群 Issues 第三节 使用命令操纵集群 第四节 Kafka 术语说明 第五节 ...

  3. Flutter 实际开发常用工具类(全局提示,请求封装,token缓存,验证码倒计时、常用窗帘动画及布局)

    介绍: 一星期从入门到实际开发经验分享及总结           代码传送门github Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面.未来App开发 ...

  4. Python之路-变量和基本数据类型详解(变量、数据类型、)

    一.注释 注释的作用: 增加程序的可读性 作为调试用 提高团队的合作效率 注释的分类 1.单行注释 以井号(#)开头,右边的所有内容当做说明 2.多行注释 以三对单引号(’’’注释内容’’’)将注释包 ...

  5. Sql 语句中使用参数

    using System; using System.Data; using System.Data.SqlClient; namespace ConsoleApplication2 { public ...

  6. python基础--内置函数filter,reduce

    movie_people=["sb+_alex","sb_wupeiqi","han"] # def filter_test(array): ...

  7. CSS3选择器 ::selection选择器

    “::selection”伪元素是用来匹配突出显示的文本(用鼠标选择文本时的文本).浏览器默认情况下,用鼠标选择网页文本是以“深蓝的背景,白色的字体”显示的,效果如下图所示: 从上图中可以看出,用鼠标 ...

  8. 四、MyBatis-映射文件

    映射文件指导着MyBatis如何进行数据库增删改查,有着非常重要的意义. <?xml version="1.0" encoding="UTF-8" ?&g ...

  9. bzoj2325 [ZJOI2011]道馆之战 树链剖分+DP+类线段树最大字段和

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2325 题解 可以参考线段树动态维护最大子段和的做法. 对于线段树上每个节点 \(o\),维护 ...

  10. python进阶:装饰器

    1.闭包 简单理解:闭包就是多层函数的嵌套,外层函数的返回值是内层函数的引用. def out_func(n): num = 100 def in_fucn(*args,**kwargs): # no ...