《javascript高级程序设计(第二版)》学习(3)

学习了第四章和第五章的内容

垃圾收集

JavaScript具有自动垃圾收集机制,局部变量只在函数执行的过程中存在,在此过程中,会为局部变量在栈(或堆)内存上分配相应空间,以便存储他们的值。当函数执行结束后,局部变量就没有存在的必要了,因此就可以释放他们的内存以供将来使用。垃圾收集的策略目前主要有两种:

标记清除:JavaScript中最常用的。垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记,然后,它会去除掉环境中的变量和被环境中其他变量所引用的变量标记。在此之后再被加上标记的变量将被视为是要删除的。最后垃圾收集器完成内存清除工作,销毁那些带标记的值,并回收他们的内存。

引用计数:跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,则这个值引用次数是1,如果同一个值又被赋予了另外一个,则次数加1,。相反,如果包含这个值引用的变量又得到了另外的一个值,则引用次数就减1.当这个值为0的时候,就说明没有办法再访问这个值了,因此就可以将其内存回收过来。(然而当出现循环引用的时候,引用计数就无法进行垃圾回收了)

此外,因为IE中有的对象不是原生的JavaScript对象,如BOM和DOM中的对象时用C++以COM(组件对象模型)对象形式来实现的,而COM就是用引用计数

var element=document.getElementById(‘some_element‘);
var myobject=new Object();

//下面创建了循环引用
myobject.element=element;
element.someObject=myobject;

//为了避免因为循环引用而无法回收内存,在使用它们的时候,手动清除
myobject.element=null;
element.someObject=null;

关于优化内存,因为出于安全的考虑,并不会为浏览器分配太多的内存,因此内存就显得很珍贵。优化内存的最佳方式,就是执行中的代码保存必要的数据。一旦数据不再有用,最好通过将其设置为null来释放其引用,该方法叫解除引用。适用于大多数全局变量和全局对象的属性。

function createPerson(name){
    var locationPerson=new Object();
    locationPerson=name;
    return locationPerson;
}

var globalPerson=createPerson(‘mike‘);
//手工解除
globalPerson=null;

Array中的几种方法

栈方法:后入先出,用到的就是push()和pop()方法,前者是将添加到数组的末尾,而后者是将数组末尾的项移除。

队列方法:先进先出,使用的是push()和shift(),其中shift能够移除数组中的第一项并返回该项,同时数组长度减1.

重排序方法:reverse()和sort(),前者是反转数组,而后者是默认以升序排列数组。sort()有时候并不能得到我们想要的结果,因此它接受一个比较函数,比较函数有两个参数,如果参数1应该位于参数2之前,则为负数;如果应该在之后,则为正数,平则为0;

function compare(obj1,obj2){
    var val1=obj1[propertyName];
    var val2=obj2[propertyName];

    if(val1<val2){
        return -1;
    }else if(val1>val2){
        return 1;
    }else{
        return 0;
    }
}

Arr.sort(compare);

对于数组有一个功能强大的方法 splice(),用法有三种:

删除:只需要制定2个参数,第一个参数为其实位置,第二个参数为删除的个数;如splice(2,1)

插入:接受3个参数,前2个参数意义一样,只需要将第二个参数设置为0,第三个参数为要插入的项,可以再传入第四,第五,任意个。如splice(“2”“0”“blue”“red”)

替换:第二个参数设置要替换的个数,然后第三个参数同上 splice(“3”“1“”blue“”red”);

数组的5个迭代方法:every, filter forEach map some;传入这些方法中的函数都接受三个参数:数组项的值、该项在数组中的位置和数组对象本身。其中every和some很相似,不同是,some只要有一项为true则返回true,而every是要每个都为true。map对数组一项运行指定函数的方法,返回调用结果的数组。filter返回的是true项组成的新数组。这些方法都不会改变原数组。

时间: 2024-10-20 17:48:25

《javascript高级程序设计(第二版)》学习(3)的相关文章

《JavaScript高级程序设计 第二版》理解对象

声明:这类属于学习笔记,主要是摘录书中内容,比较少的整理.内容经常是跳跃的,建议您阅读书本,收益更大. ECMA-262把对象定义为“无序属性的集合,其属性可以包含基本值,对象或者函数” 对象时一组没有特定顺序的值,每个属性或方法都有一个名字,每个名字都映射一个值. 每个对象都是基于一个引用类型创建的,这个引用类型可以是第5章讨论的原生类型,也可以是开发人员定义的类型 常规的创建对象的方法是通过Object这个内置对象来进行创建出一个实例,然后再給其添加属性和方法 var person=new

《JavaScript高级程序设计》的学习总结 二

引言:在学习JavaScript之前,我们要先学习如何在HTML中引用JavaScript,此篇总结将会详细介绍<script>元素的用法及其属性,并分析几种引用方式的优劣,以及延迟脚本和异步脚本的区别. <script>的介绍及其属性: 向HTML中插入JavaScript的只要方法使用<script>元素,这个元素由Netscape (网景公司)创造,并在Netscape Navigator 2中首先实现,后来这个元素被加入到正式的HTML规范中.HTML4.01

Javascript高级程序设计——第二章:在HTML中使用Javascript

第二章:在HTML中使用Javascript <script>元素 向HTML页面中插入Javascript的主要方法,就是使用<script>元素,<script>元素有六个属性: async:可选.表示应该立即下载脚本,但不妨碍页面的其他操作,比如下载其他资源或等待加载其他脚本,只针对外部脚本有效. defer:可选.表示脚本可以延迟到文档完全被解析和显示之后再执行.只针对外部脚本有效. src:可选.表示包含要执行代码的外部文件. type:可选.表示编写代码使用

读书笔记 - javascript 高级程序设计 - 第二章 在Html中使用JavaScript

1 <script>的6个属性 async  立即下载当前script标签的外部脚本 但不能影响别的 charset 没用了 defer  文档显示之后再执行脚本,只对外部脚本有效 language 没用了 src type 描述代码内容Mine类型 默认就是text/javascript 没什么用 2 在解释器对<script>元素内部的所有代码求值完毕以前 页面中的其余内容都不会被浏览器加载或显示 3 有两种script 嵌入式 外部引入式 在解析外部引入式的js文件时,页面的

javascript高级程序设计---第二、三章

在HTML中引用javaScript javascript的几个属性  type async(异步加载 只适用于外部JS且IE8以上 HTML5规范 先于load执行) src defer(延迟加载 只适用于外部加载 先于load执行) 在HTML中使用外部JS代码的优点,1.便于维护 ,2.可缓存.3.适应未来. 在javascript中区分变量的大小写 比如(test 和 Text是?的两个变量) 在ECMA5中新模式,严格模式  'use strict'在js代码中加入这句话即为严格模式

JavaScript高级程序设计(第三版)学习,第一次总结

Array类型 var arr = []; arr.length; //返回数组元素个数 改变length可以动态改变数组大小 检测数组 instanceof可以检测某个对象是否是数组,限制:只能是一个网页或一个全局作用域 Array.isArray(arr); //最终确定某个值到底是不是数组,没有限制 转换方法 arr.toString(); //返回由数组每个值的字符串形式拼接而成的以逗号分隔的字符串 arr.valueOf(); //与toString方法一致 arr.toLocalSt

JavaScript高级程序设计(第三版)学习笔记20、21、23章

第20章,JSON JSON(JavaScript Object Notation,JavaScript对象表示法),是JavaScript的一个严格的子集. JSON可表示一下三种类型值: 简单值:字符串,数值,布尔值,null,不支持js特殊值:undefined 对象:一组无序的键值对 数组:一组有序的值的列表 不支持变量,函数或对象实例 注:JSON的字符串必须使用双引号,这是与JavaScript字符串最大的区别 对象 { "name":"Nicholas"

《JavaScript高级程序设计》(第二版)

这本书的作者是 Nicholas C.Zakas ,博客地址是 http://www.nczonline.net/ ,大家可以去多关注,雅虎的前端工程师,是YUI的代码贡献者,可想而知这本书得含金量,他出的书都广受好评.这本书已经出了第二版,而且与第一版相比内 容更新很大,直接第二版就行.不要被书名的“高级”唬住,只要有JS基础语法知识和DOM基础知识就行,而且本书开始阶段还是介绍JS和DOM的语法知 识. 评论:重点推荐一下第五章(类型),第六章(OOP),第七章(匿名),多看几遍,至少要完全

《JavaScript高级程序设计》学习笔记(5)——面向对象编程

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object-Oriented, OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.前面提到过,ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同. ECMA-262把对象定义为:"无序属性的集合,其属性可以包含基本值.对象或者函数.

JavaScript高级程序设计学习(四)之引用类型

在javascript中也是有引用类型的,java同样如此. javascript常见也比较常用的引用类型就熟Object和Array. 一个对象和一个数组,这个在前后端分离开发中也用的最多.比如ajax传参,有时我不仅仅只是需要一个参数,例如添加方法,传的是一个对象,对象存在属性.在java中对象也可以说类.因为类存在属性,例如人类,他的属性有身高,体重,姓名,年龄,性别等.而js对象,也可以这样,比如车,它可以有品牌,颜色,造型等等. js对象可以做什么呢?同java对象有什么区别呢? 第一