这是我目前度过最好的js方面的书,小而精,没有一句废话全是精华。想要全面理解javascript,这本书必读。
P6 避免使用 /* */注释 建议使用//
P17 对象字面量是一种方便指定新对象的表示方法。属性名可以是标识符或者字符串。这些名字被当做字面量名而不是变量名来对待,所以对象的属性名在编译时才能知道。属性的值就是表达式。
P20 简单类型: 数字,字符串,布尔值,null值和undefined值 对象类型:数组,函数,正则表达式,对象。 对象是可变的键控集合,对象是属性的容器,每个属性都拥有名字和值。 属性的名字可以是包括空字符串在内的任意字符串,属性值可以是除undefined值之外的任何值。
P21 || 运算符可以用来填充默认值 var a=objecta.somenotexist || "unknowa";
P22 对象通过引用来传递 var a=b=c={}; a,b,c都引用同一个空对象
每个对象都连接到一个原型对象,并且它可以从中继承属性。 所有通过对象字面量创建的对象都连接到Object.prototype这个javascript中标准的对象。 当你创建一个新对象时,你可以选择某个对象作为它的原型。
我们这里给Object增加一个beget方法,这个方法创建一个使用原对象作为其原型的新对象。
if(typeof Object.beget!='function'){
Object.beget=function(o){
var F=function(){};
F.prototype=o;
return new F();
};
}
当我们对某个对象做出改变时,不会触及该对象的原型。相反我们添加一个新的属性到原型中,该属性会立即对所有基于该原型创建的对象可见。
P23 委托 如果我们尝试去获取对象的某个属性,且该对象没有此属性名,那么javascript会尝试着从原型对象中获取属性值,如果那个原型对象也没有改属性,那么再从它的原型中寻找,依次类推,直到过程最后到达终点Object.prototype. 如果想要的属性完全不存在于原型链中,那么结果就是undefined值。这个过程称为委托。
P24 for in语句可以用来遍历一个对象中的所有属性名,属性名出线的顺序是不确定的。如果需要按照一定的顺序显示属性可以用for 数组遍历。 delete 运算符可以删除对象属性。但是不会触及原型链中的任何对象。删除对象属性可能让来自原型链中的属性浮现出来。
P25 减少全局变量污染
方法1 在你的应用中只创建唯一一个全局变量:var MYAPP={};
方法2 闭包
P26 所谓编程就是将一组需求分解成一组函数与数组结构的技能。 对象字面量产生的对象连接到Object.prototype.函数对象连接到Function.prototype(该原型对象本身连接到Object.prototype).每个函数在创建时附有两个附加隐藏属性:函数的上下文和实现函数行为的代码。 每个函数对象在创建时也随带有一个prototype属性。它的值是一个拥有constructor属性且值为该函数的对象。
var functiona=function(){var b;};
var a=functiona.prototype;
alert( a.constructor);
P27 函数可以用它的名字来递归地调用自己。
通过函数的字面量创建的函数对象包含一个连接到外部上下文的连接。这被称为闭包。
调用函数时,每个函数接收到两个附加的参数:this和arguments.this的值取决于调用模式。
在JavaScript中一共有四中调用模式:方法调用模式,函数调用模式,构造器调用模式和apply调用模式。
P28 实际参数arguments 形式参数parameters 当一个函数被保存为对象的一个属性时,我们称它为一个方法。 当一个方法被调用时,this被绑定到该对象。
超级迟绑定 very late binding
方法调用模式: 通过this可取得它们所属对象上下文的方法称为公共方法。
P29 JavaScript是一门基于原型继承的语言。 构造器调用模式: 如果在一个函数前面带上new来调用,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将会被绑定到哪个新对象上。 结合new前缀调用的函数被称为构造函数。
P30 JavaScript是一门函数式的面向对象编程语言,所以函数可以拥有方法。 apply方法接受两个参数。第一个是将被绑定给this的值,第二个就是一个参数数组。 apply方法的调用形式可以调用函数也可以调用公共方法。 P31 当函数被调用时,会得到一个免费奉送的参数,arguments数组。 arguments并不是一个真正的数组。它只是一个类似数组(array-like)的对象。
一个函数总是会返回一个值。如果没有指定返回值,则返回undefined。
如果函数以在前面加上new前缀的方式来调用,且返回值不是一个对象,则返回this(该新对象)。
P32
通过给Object.prototype添加方法或者属性使得该方法或者属性对所有对象可用。
通过给Function.prototype增加方法使得该方法对所有函数可用。
Function.prototype.method1=function(name,func){
this.prototype[name]=func;
return this;
};
Number.method1('interger1',function(){
return Math[this < 0 ? 'ceil':'floor'](this);
});
document.writeln((-10/3).interger1());
document.writeln((10/3).interger1());
P33
基本类型的原型是公共的结构 P36 作用域
作用域控制着变量与参数的可见性及生命周期,并提供了自动内存管理。 P38 闭包 函数可以访问它被创建时所处的上下文环境,这被称为闭包。
var quo=function(status){
return {
get_status:function(){
return status;
}
};
};
var myQuo=quo("amazed");
document.writeln(myQuo.get_status());
//myQuo的函数get_status()被创建后还可以访问参数status ,就称为闭包。
P40 模块
我们可以使用函数和闭包来构造模块。模块是一个提供接口却隐藏状态与实现的函数或对象。
P41
模块模式的一般形式是:一个定义了私有变量和函数的函数;利用闭包创建可以访问私有变量和函数的特权函数;最后返回这个特权函数,或者把他们保存到一个可以访问的地方。
Function.prototype.method1=function(name,func){
if(!this.prototype[name])
{
this.prototype[name]=func;
return this;
}
};
String.method1('deentityify',function(){
var entity={
quot:'"',
lt:'<',
gt:'>'
};
return function(){
return this.replace(/&([^&;]+);/g,function(a,b){
var r=entity[b];
return typeof r==='string'?r:a;
});
};
}());
document.writeln('<">'.deentityify());
模块模式通常结合单例模式(Singleton Pattern)使用。JavaScript的单例就是用对象字面量表示法创建的对象,对象的属性值可以是数值或函数,并且属性值在该对象的生命周期中不会发生变化。
P43 级联
没有返回值的方法会返回undefined, 如果我们让方法返回this而不是undefined,就可以启用级联。
在一个级联中,我们可以在单独一条的语句中依次调用同一个对象的很多方法。
套用 套用允许我们将函数与传递给它的参数相结合去产生出一个新的函数。
P44 记忆 函数可以用对象记住先前操作的结果,从而能避免无谓的运算。这种优化被称为记忆(memoization).
var memoizer=function(memo,fundamental){
var shell=function(n){
var result=memo[n];
if(typeof result !=='number'){
result=fundamental(shell,n);
memo[n]=result;
}
return result;
};
return shell;
};
var fibonacci=memoizer([0,1],function(shell,n){
return shell(n-1)+shell(n-2);
});
for(var i=0;i<=10;i+=1){
document.writeln("//"+i+":"+fibonacci(i));
}
//以上代码我还没有理解清楚,需要日后再琢磨
第五章 继承
继承这章挺难理解的,还需要仔细再琢磨琢磨
P46 在基于类的语言中,对象是类的实例,并且类可以从另一个类继承。JavasCript是一门基于原型的语言,这意味着对象直接从其他对象继承。
P50
基于原型的继承相比基于类的继承在概念上更为简单:一个新对象可以继承一个旧对象的属性。
第六章 数组
P59 JavaScript允许数组包含任意混合类型的值。 length属性的值是这个数组的最大整数属性名加上1。它不等于数组里的属性的个数。 第七章 正则表达式 P65 正则表达式是一门简单语言的语法规范。可处理正则表达式的方式有regexp.exec,regexp.test,string.match,string.replace,string.search,string.split