《JavaScript语言精粹》读书笔记

280 阅读5分钟

第三章 对象

特性

JavaScript包含一种原型链的特性,允许对象继承另一个对象的属性。正确的使用它能减少对象初始化时消耗的时间和内存。

检索属性

检索JavaScript对象属性的时候,能够使用”||“运算符来填充默认值;当参试从undefined值中获取值时会导致TypeError异常,可以使用“&&”运算符来避免错误。

var name = person.name || "vivo"
person.address // undefined
person.address.city // throw "TypeError"
person.address && person.address.city // undefined

原型关系

原型关系是一种动态关系,如果我们添加一个新的属性到原型中,该属性会立即对所有基于该原型创建的对象可见。

hasOwnProperty()

如果对象拥有独有的属性,将返回true。hasOwnProperty方法不会检查原型链上的属性。

person.hasOwnProperty('name') // true
person.hasOwnProperty('constructor') // false

delete

delete运算符可以用来删除对象的属性,它不会触及原型链中的任何对象。删除对象的属性可能会让来自原型链中的属性透视出来。

第四章 函数

函数对象

JavaScript中的函数就是对象。对象是“名/值”对的集合并拥有一个连到原型对象的隐藏连接。对象字面量产生的对象连接到Object.prototype。函数对象连接到Function.prototype(该原型对象本身连接到Object.prototype)。
每个函数对象在创建时也随配有一个prototype属性。它的值是一个拥有constructor属性且值即为该函数对象。

调用模式

每个函数会接受到2个额外附件的参数,this与arguments。 arguments数组保存的是函数被调用时传递的参数列表。
this的值取决与调用模式:

  • 方法调用模式:当一个函数被保存为对象的一个属性时,称它为一个方法;方法被调用时,this被绑定到该对象。
  • 函数调用模式:当一个函数并非一个对象的属性,它被当作一个函数调用,this被绑定到全局对象。
  • 构造器调用模式:一个函数前面带上new来调用,就会创建一个连接到该函数的prototypr成员的新对象,this被绑定到这个新对象上。
  • apply调用模式:apply方法接受两个参数,第一个为绑定给this的值,第二个为参数数组。
myObject.double = function () {
  var that = this
	var helper = function () {
		that.value = add(that.value,that.value)
	}
	helper() // 函数形式调用
}
myObject.double() // 方法形式调用

作用域

在一个代码块中(括在一对花括号中的一组语句)定义的所有变量在代码块的外部是不可见的。定义在代码块中的变量在代码块执行结束后会被释放掉。
在函数中的参数和变量在函数外部是不可见的,而在一个函数内部任何位置定义的变量,在该函数内部任何地方都可见。

模块

使用函数和闭包来构造模块。模块是一个提供接口却隐藏状态和实现的函数或对象。
模块模式的一般形式是:一个定义了私有变量和函数的函数;利用闭包创建可以访问私有变量和函数的特权函数;最后返回这个特权函数,或者把它们保存到一个可访问到的地方。

String.method('deentityify',function () {
	// 字符实体表,它映射字符实体的名字到对应的字符
	var entity = {
		quot:'"',
		lt:'<',
		gt:'>'
	}
	// 返回deentityify方法
	return function () {
	// 这个才是deentityify方法所执行的程序
		return this.replace(/&([^&;]+);/g), function (a,b) {
			var r = entity[b]
			return typeof r === 'string'? r : a;
		}) 
	}
}())

级联

对于没有返回值的方法,我们可以让这些方法返回this而不是undefined,这样就是能够使用级联。我们可以在一条语句中依次调用同一个对象的很多方法。

getEle('div').move(200,300).width(100).height(100)

记忆

函数可以将先前操作的结果记录在某个对象里,从而避免无谓的重复计算。

var fibonacci = function () {
	var memo = [0,1]
	var fid = function (n) {
		var result = memo[n]
		if (typeof result !== 'number') {
			result = fib(n-1) + fib(n-2)
			memo[n] = result
		}
		return result
	}
	return fid
}()

第五章 继承

继承

var Cat = function (name) {
	this.name = name
}
Cat.prototype = new Animal()

第六章 数组

数组

在大多数语言中,一个数组的所有元素都要求是相同的类型。JavaScript允许数组包含任意混合类型的值。

长度

length属性的值是这个数组的最大整数属性名加上1.它不一定等一数组中属性的个数。

var demo = []
demo.length //0
demo[100] = 1
demo.length //101 

删除

使用delete关键字删除数组元素,会在数组在原先的位置上留下一个undefined。使用数组方法splice能够避免这个问题

var demo = [1,2,3,4,5]
delete demo[2] // [1,2,undefined,4,5]
demo = [1,2,3,4,5]
demo.splice(2,1) // [1,2,4,5]

第七章 正则表达式

正则表达式

1、可以直接通过字面量创建正则表达式.

var regexp = ‘/^\d+&/i’
标示含义:
g:全局的(匹配多次;不同的方法对g标示的处理各不相同)
i:大小写不敏感(忽略字符大小写)
m:多行(^和&能匹配行结束符)

2、使用RegExp构造器。第一个参数为正则表达式,第二个参数为指定的标示。

第八章 方法

本章主要介绍了JS中Array、Function、Number、Object、RegExp、String类型扩展的方法介绍和部分方法的内部实现方式。

第九章 代码风格

本章主要介绍了提醒我们要注意代码风格,一个好的代码规范能够有效的提升程序的可扩展性与健壮性。