JavaScript高级程序设计(第三版) 5/25
第三章
基本概念
1.任何语言的核心都必然会描述这门语言最基本的工作原理。而描述的内容通常都要涉及这门语言的语法、操作符、数据类型、内置功能等用于构建复杂解决方案的基本概念。
2.浮点数值,该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。
3.保存浮点数值需要的内存空间是保存整数值的两倍。
4.浮点数值的最高精度是17位小数。经典问题0.1 + 0.2 !== 0.3。
5. Number.MIN_VALUE, 5e-324. Number.MAX_VALUE,1.7976931348623157e+308. 超过被自动转换成Infinity(正无穷),或者-Infinity(负无穷)。
6.isFinite()判断是否有穷
7.任何数除以0会返回NaN,(实际只有0/0是NaN,正数/0是正无穷,负数/0是负无穷)
Object类型
8.Object类型是所有它的实例的基础。Object的每个实例都具有下列属性和方法。
construtor:保存着用于创建当前的对象的函数。
hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。
isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型
propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句
toLocaleString():返回对象的字符串表示。(需要打印不然没输出)
toString():返回对象的字符串表示。
valueOf:返回对象的字符串,数值,布尔值的表示。
第四章
变量、作用域和内存问题
1.只能给引用类型动态的添加属性。
2.值传递 引用传递,基本类型是值传递,引用类型,因为复制的至少一个指针,指针指向存储在堆中的一个对象,所以堆中的对象改变都变。基本类型存储在栈内存中。
3.
function setName(obj) { obj.name = "Nicholas"; obj = new Object(); obj.name = "Greg" } var person = new Object(); setName(person); alert(person.name);
结果alert的是“Nicholas”,实际上,在函数内部重写obj的时候,这个变量引用就是一个局部对象了,而这个局部对象会在函数执行完毕后立即被销毁。
4. result = variable instanceof constructor
5.全局执行环境被认为是window对象(),全局执行环境直到应用程序退出,例如关闭网页或浏览器,时才会被销毁。
6.JavaScript具有自动垃圾收集机制,原理:找出那些不再继续使用的变量,然后释放其占用的内存。为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间),周期性地执行这一操作。
7.JavaScirpt中最常用的垃圾收集方式是标记清除(mark-and-sweep),垃圾收集器在运行时会给存储在内存中的所有变量都加上标记,然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。而在此之后再被加上标记的变量被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾收集器完成内存清除工作,销毁那些带标记的值并回收他们所占用的内存空间。
8.另外一种不太常用的垃圾收集策略叫做引用计数(reference counting),变量赋值给另一个变量,引用次数加1,如果是取得另一个值,那么引用次数减1,当这个值的引用次数为0时,则说明无法再访问这个值,因而可以将其占用的内存空间回收回来。
引用计数的问题,循环引用:对象A包含了指向B的指针,B包含了指向A的指针。
function problem(){ var objectA = new Object(); var objectB = new Object(); objectA.someOhterObject = objectB; objectB.anohterObject = objectA; }; problem();
引用次数永远不为0.
9.一旦数据不再有用,最好通过将其值设为null来释放引用——这个做法叫做解除引用(dereferencing)。这一做法适用于大多数全局变量和全局对象的属性。局部变量会在它们离开执行环境时自动被解除引用。
10.解除一个值的引用并不意味着自动回收该值所占用的内存。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。
第五章
引用类型
1.引用类型是一种数据结构,用于将数据和功能组织在一起。它也常被称为类。
2.Object类型的创建方法,第一种使用new操作符后跟Object构造函数 var person = new Object(); 第二种对象字面量表示法 var person = { name: ''fa"};
3.访问对象的属性时可以用方括号,比如alert(person["name"];等价于alert(person.name);
如果属性名中包含会导致语法错误的字符,或者属性名使用的是关键字或保留字,也可以用方括号表示法。比如person["first name"]="Nicholas";有空格,.不能访问
通常,除非必须使用变量来访问属性,否则建议用点表示法
4.数组也是有上限的,最多4294967295个项
5.instanceof操作符的问题在于,它假定只有一个全局执行环境。
为了解决这个问题ES5新增了Array.isArray()
6.日期,正则表达式
7.Function,没有重载,后面覆盖前面
8.解析器会优先解析函数声明,再解析函数表达式。
9.函数有两个特殊的对象:arguments和this,
递归算法,因为函数体内会调用自身函数,紧密耦合了,所以最好用arguments.callee替代。
10.基本包装类型:Boolean,Number,String。
访问字符串时候的步骤,
var s1 = "some text" var s2 = s1.substring(2); //可以看成 var s1 = new String("some text"); var s2 = s1.substring(2); s1 = null;
(1)创建String类型的一个实例 (2)在实例上调用指定的方法 (3)销毁这个实例。
11.引用类型和基本包装类型的主要区别是对象的生存期,new操作符创建的引用实例在执行流离开当前作用域之前一直保存在内存中。而自动创建的基本包装类型的对象,只存在代码的执行瞬间,然后立即销毁,意味着不能添加属性方法。