JavaScript语言精粹,读书笔记

第一章 精华

1,JavaScript的函数(主要)基于词法作用域(lexical scoping)的顶级对象。强类型语言允许编译器在编译时检测错误,但弱类型很自由,无需建立复杂的类层次,不用做强制造型。JavaScript拥有强大的对象字面量表示法,这种表示法是JSON的灵感来源。

2,JavaScript有一个无类型的(class-free)对象系统,在这个系统中,对象可以直接从其他对象继承属性。

3,JavaScript依赖于全局变量来进行连接,所有编译单元的所有顶级变量被撮合到一个全局对象(the global object)的公共命名空间中【糟糕】。

第二章 语法

1,两种注释形式:/* */块注释(来自于一种PL/I的语言)有些字符也可能出现在正则里,//行注释(推荐使用)。

2,标识符由字母下划线或$开头,不能使用保留字作为对象的属性名。

3,JavaScript只有一种数字类型,它在内部被表示为64位的浮点数,没分离出整数类型,所以避免了短整形的溢出问题,你只需要它是一种数字。

4,JavaScript在创建时,Unicode是一个16位的字符集,所以所有字符都是16位的,它没有字符类型,用字符串表示字符。\'F\'+\'u\'+\'n\'===\'Fun\',\'Fun\'.toUpperCase()===\'FUN\'。

5,下列值都为假:false null undefined \'\' 0 NaN;其余为真(包括true,\'false\')。for in语句会枚举一个对象的所有属性名(或键名),该枚举过程会列出所有的属性,属性名出现的顺序是不确定的,通常用Object.hasOwnProperty(variable)确定这个属性名是该对象的成员还是来自原型链。try{执行一个代码块并捕获代码块抛出的任何异常(throw通常在这里)}catch{接收异常error.message}。

6,运算符. [] ()优先级最高,typeof运算符产生的值有number string boolean undefined function object,但是typeof(数组或null)都是object。

第三章 对象

1,JavaScript中的对象是可变的键控集合(keyed collections),是无类型的,对象是属性的容器。正确使用原型链能减少对象初始化时消耗的时间和内存。

2,检索对象里的值,可以用[]或. ,若果不存在返回undefined,||可用来填充默认值,尝试从undefined的成员属性中取值会导致TypeError异常,可以用&&避免错误如下:

x.a //undefined

x.a.b //TypeError

x.a && x.a.b //undefined

3,对象里的值可通过赋值语句来更新,如果属性名已存在,则属性值被替换;如果之前没有,则扩充到对象中。

4,对象通过引用来传递,它们永远不会被复制。

5,所有通过对象字面量创建的对象都连接到Object.prototype,create方法创建一个使用原对象作为作为其原型的新对象。原型连接在更新时是不起作用的。原型连接只有在检索值时才被用到,顺着原型链忘上找称为委托。

6,有两种方法处理掉不需要的属性,第一个然你的程序做检查并丢弃typeof值为函数的属性,另一个是hasOwnProperty(不会检查原型链)如x.hasOwnProperty(\'constroctor\') //false。

7,delete用来删除对象的属性,不会触及原型链,删除对象的属性可能会让原型链中的属性透现出来。

8,最小化使用全局变量的方法之一是为你的应用只创建一个唯一的全局变量:var x={};x.a={...};x.b={...} 。

第四章 函数 *

1,对象字面量产生的对象连接到Object.prototype,函数对象连接到Function.prototype,prototype的值是一个拥有constructor属性且值为该函数的对象。每个函数创建时会附加两个隐藏属性:函数的上下文和实现函数行为的代码。

2,函数字面量var add=function(a,b){},参数不会初始化为undefined而是在函数被调用时初始化为实际提供的参数的值。

3,调用函数会接受附加的参数:this和arguments,this的值取决于调用的模式,四种调用模式:方法调用 函数调用 构造器调用 apply调用。

4,内部函数能访问外部函数的实际变量而无需复制。

第五章 继承 *

1,继承模式的一个弱点是没法保护隐私,可以用模块模式。

第六章 数组

1,数组是一段线性分配的内存,它通过整数计算偏移并访问其中的元素,不过JavaScript并无类似的数据结构,但拥有一些类数组(array-like)特性的对象,他把数组下标变成字符串,用其作为属性。

2,设置更大的length值不会给数组分配更多的空间,而把length设小导致下标大于等于length的删除;附加新元素到尾部:arr[arr.length],也可以用push。

3,delete数组的元素会留下空洞,因为排在后面的元素保留着它们最初的属性;可以用splice(数组中的一个序号,要删除的元素个数),因为被删除属性后的每个属性必须被移除,并且以一个新的键值重新插入,这样对于大型数组效率不高。

4,当属姓名是小而连续的整数时,应使用数组,否则,使用对象。判断一个对象否为数组:

var is_array=function(value){

return Object.prototype.toString.apply(value)===\'[object Array]\'

}

第七章 正则表达式

1,两种方法创建一个RegExp对象,优先考虑正则表达式字面量(包围在一对斜杠里), 另一个是使用RegExp构造器,这个构造器接收一个字符串并编译成一个RegExp对象。

2,一个正则表达式分支包含一个或多个正则表达式序列,这些序列用|分开,一个正则表达式序列包含一个或多个正则表达式因子。

第八章 方法

1,array.concat(item...) 产生一个新数组,它包含一份array的浅复制(shallow copy)并把item附在其后,array不变;

array.join(separator) 构造成一个字符串,分隔符默认为, ;

array.pop() 移除最后一个并返回该元素,array.push(item...)会修改array尾部,且如果item有数组,会作为一项加入;

array.reverse() 反转元素且改变array;

array.shift() 移除第一个元素并返回该元素,比pop慢;

array.slice(start,end) 浅复制从start到end,end可选,若参数有负数和array.length相加;

array.sort(comparefn) 按大小排如:n.sort(function(a,b){

return a-b

} )

array.splice(start,deleteCount,item...) 用item替换删除的元素;

array.unshift(item...) 把item插入到array的开始部分,array变。

2,function.apply(thisArg,argArray)。

3,number.toExponential(fractionDigits) 转换成一个指数形式的字符串,fractionDigits控制小数点后的数字位数(0-20);

number.toFixed(fractionDigits) 转换成一个十进制的字符串;

number.toPricision(pricision) 转换成一个十进制数形式的字符串 ,precision控制数字的精度(0-21);

number.toString(radix)转换成字符串,radix控制基数(2-36)。

4,object.hasOwnProperty(name) ,原型链中的同名属性是不会被检查的;

如:var a={name:\'aaa\'};

var b=Object.create(a);

a.hasOwnProperty(\'name\'); //true

b.hasOwnProperty(\'name\'); //false

b.name; //\'aaa\'

5,regexp.exep(string) 正则表达式最强大(和最慢)的方法,它会返回一个数组;

regexp.test(string) 正则表达式最简单(和最快)的方法。

6,string.charAt(pos) 返回string中pos位置处的字符,不存在返回空;

string.charCodeAt(pos) 以整数形式返回字符编码,不存在返回NaN;

string.concat(string...) 连接字符串,也可以用+ ;

string.indexOf(searchString,position) stirng是从某个位置开始查,不存在返回-1;

string.lastIndexOf(searchString,position) 从末尾查找;

string.localeCompare(that) 若string比that小,结果为负数,若相等为0;

string.match(regexp) 如果没有g标识,则与调用regexp.exec(string)的结果相同;

stirng.replace(searchValue,replaceValue) searchValue可以是字符串或正则,若是字符串只会改第一处;

string.search(regexp) 返回第一个匹配的首字符位置,不存在返回-1;

string.slice(start,end);

string.split(separator,limit) 把string分割成片段来创建一个字符串数组,limit限制被分割的片段数量(可选);

string.substring(start,end) 和slice一样,但不能处理负数,用slice;

string.toLocaleLowerCase() 本地化规则转小写;

string.toLocaleUpperCase() 本地化规则转大写;

string.toLowerCase() 转小写;

string.toUpperCase() 转大写;

string.fromCharCode(char...) 根据一串数字编码返回一个字符串。

第九章 代码风格

1,JavaScript的弱类型和过度的容错性导致程序质量无法在编译时获得保障。

2,把 { 放在一行的结尾而不是下一行的开头,因为它会避免JavaScript的return语句中的一个设计错误。JavaScript有函数作用域没有块级作用域。K&R代码风格是最普遍的C语言代码风格

3,对一个脚本应用或工具库,只用一个全局变量。每个对象都有它自己的命名空间,多以很容易用对象去管理代码。使用闭包能提供近一步的信息隐藏,增强模块的健壮性。

第十章 优美的特性

。。。

附录A 毒瘤

1,全局变量 2,作用域 3,自动插入分号

4,保留字:当保留字被用作对象字面量的键值时,他们必须被用括号括起来,且不能用点表示法,用括号表示法。

5,Unicode 6,typeof null===\'object\' 7,parseInt 8,+ 9,浮点数 10,0.1+0.2!=0.3 11,NaN !== NaN

12,伪数组 13,假值:0 NaN \'\' false null undefined 14,hasOwnProperty 15,对象

附录B 糟粕

1,== 2,with语句 3,eval 4,continue语句 5,switch穿越

6,缺少块的语句 7,++ -- 8,位运算符 9,function语句与表达式

10,类型的包装对象 11,new 12,void

附录C JSLint

附录D JSON语法