JavaScript语言精粹--笔记
JavaScript语言精粹
章一 精华
Web浏览器语言;极强表达能力的语言;既轻量级又富有表现力;函数式编程(一等公民)。。。。。。
章二 语法
空白:可能表现为被格式化的字符或注释的形式,可以用来分隔字符序列;如var that=this;var和that之间的空白是必须的。
注释://(推荐)、/* */
标识符:由一个字母开头,后面可以选择性地加上一个或多个字母、下划线、数字等;标识符不能使用关键字和保留字;标识符可用于语句、变量、参数、属性名、运算符和标记。
数字:JavaScript只有一个数字类型,在内部被表示为64位的浮点数。NaN是一个数值,表示一个不能产生正常结果的运算结果。数字拥有方法。JavaScript有一个对象Math,它包含一套作用于数字的方法,如Math.floor(number);
字符串:字符串字面量被包含在一对单引号或双引号中,它可能包含0个或多个字符。\表示转义字符。JavaScript没有字符类型,要表示一个字符,只需创建包含一个字符的字符串。转义字符表示那些正常情况下不被允许的字符插入到字符串中。
Ps:字符串是不可变的。一旦字符串被创建,就无法改变它。但可以通过字符串连接运算+连接其他字符来创建一个新字符串。两个包含着完全相同的字符且字符顺序也相同的字符串被认为是相同的字符串。
语句:语句通常从上到下被执行。JavaScript可以通过条件语句、循环语句、强制跳转语句和函数调用来改变执行序列。当var语句被用在函数内部时,它定义的是这个函数的私有变量。代码块是包在一对花括号中的一组语句。JavaScript中的代码块不会创建新的作用域,因此变量应该定义在函数的头部。
字面量:按指定规格创建新数组的表示法。
函数:函数字面量定义了函数值,可以有可选的名字,当然也可以匿名,用于递归的调用自己;可以指定参数列表,这些参数就像变量一样,在调用时由传递的实际参数初始化。函数的主体包括变量定义和语句。
章三 对象
JavaScript的简单数据类型:数字、字符串、布尔值、null、undefined;引用类型:对象。
Ps:数字、字符串、布尔值都是不可变的,拥有自己的方法,类似于对象。JavaScript中的对象是可变的键控集合。数组、函数、对象、正则表达式都是对象。对象是属性的容器,每个属性都拥有自己的名字和值。JavaScript中对象是无类型的,对新属性的名字和值没有限制。对象可以包含其他对象。
JavaScript包含一种原型链的特性,允许对象继承另一个对象的属性。正确地使用它可以减少对象初始化时消耗的时间和内存。
对象字面量:包围在一对花括号中的零或多个名/值对。对象是可以嵌套的。
检索:要检索对象里包含的值,可以采用在[]后缀中括住一个字符串表达式的方式。如果字符串表达式是一个字符串字面量,且是合法的JavaScript标识符,可以优先使用 . 表示法。
Ps:|| 可以用来填充默认值。
更新:对象里的值可以通过赋值语句来更新。
引用:对象通过引用来传递。
原型:每个对象都连接到一个原型对象,可以从中继承属性。所有通过对象字面量创建的对象都连接到Object.prototype。
Ps:当你创建对象时,可以选择某个对象作为它的原型。原型连接在更新时是不起作用的,当我们队某个对象做出改变时,不会触及该对象的原型。
Ps:原型连接只有在检索值的时候才被用到。如果我们尝试去获取对象的某个属性值,但该对象没有此属性名,那么JavaScript会试着从原型对象中获取对象的属性值。如果那个原型对象也没有,再从该原型对象的原型中寻找,直到找到该对象的属性值则停止,或者到达终点object.prototype。如果想要的属性不存在于原型链中,结果为undefined值。这个过程称为委托。
Ps:原型关系是一种动态的关系。如果添加一个新的属性到原型中,则该属性会立即对所有基于该原型创建的对象可见。
反射:检查对象,并确定对象有什么属性,然后检索该属性并验证取得的值。有两种方法可以处理掉这些不需要的属性。第一个是让你的程序做检查并丢弃值为函数的属性。另一个是使用hasOwnProperty方法,如果对象拥有独有的属性,将返回true。hasOwnProperty方法不会检查原型链。
枚举:for in用来遍历一个对象中的所有属性名。
Ps:常用的过滤器有hasOwnProperty方法,以及typeof排除函数。
删除:delete可以用来删除对象的属性。如果对象删除该属性,那么该属性就会删除。它会触及原型链中的任何对象。删除对象的属性可能会让来自原型链中的属性透现出来。
减少全局变量的污染:将全局性的资源都纳入一个名称空间之下,你的程序与其他应用程序、组件或库之间发生的可能性就会明显降低。
章四 函数
函数包含一组语句,它们是JavaScript的基础模块单元,用于代码复用、信息隐藏和组合调用。函数用于指定对象的行为。
函数对象:对象是名/值对的集合并拥有一个连接到原型对象的隐藏连接。对象字面量产生的对象连接到object.prototype。函数对象连接到Function.prototype。每个函数在创建时会附加两个隐藏属性:函数的上下文和实现函数行为的代码。
每个函数在创建时都有一个prorotype属性。它的值是一个拥有constructor属性且值为该函数的对象。
函数可以保存在变量、对象和数组中。函数可以被当作参数传递给其他函数,函数也可以返回函数。因为函数是对象,所以函数也拥有方法。
函数字面量:包括四部分:保留字function;函数名;包围在圆括号里的一组参数;包围在花括号里的一组语句。
函数字面量可以出现在任何允许表达式出现的地方。函数也可以被定义在其他函数中。一个内部函数除了可以访问自己的参数和变量,也能访问其父函数的参数和变量。通过函数字面量创建的函数对象包含一个连到外部上下文的连接,这就是闭包。
调用:调用一个函数会暂停当前函数的执行,传递控制权和参数给新函数。除了函数声明时定义的形参,每个函数还接收两个附加的参数:this和arguments。This值取决于调用它的模式。JavaScript中有4种调用模式:方法调用模式、函数调用模式、构造器调用模式和apply调用模式。
调用运算符是跟在任何一个函数值的表达式之后的一对圆括号。圆括号内可以包含零个或多个逗号隔开的表达式。每个表达式产生一个参数值。每个参数值被赋予赋予函数声明时定义的形式参数名。当实际参数的个数与形式参数个数不匹配时,不会导致运行错误。
方法调用模式:当一个函数被保存为对象的一个属性时,将这个函数称之为方法。当一个方法被调用时,this被绑定到该对象上。如果调用包含一个提取属性的动作(点表达式或者下标表达式),即被当作一个方法来调用。
eg. Var myObject={
value:0,
increment:function(inc){
this.value+=typeof inc===’number’?:1;
}
};
myObject.increment();
document.writeln(myObject.value);
方法可以使用this访问自己所属的对象。所以能够从对象中取值或者对对象进行修改。this到对象的绑定发生在调用的时候。通过this可以取得它们所属对象的上下文的方法称为公共方法。
函数调用模式:当一个函数不是一个对象的属性时,则该函数被当作一个函数来调用的。Var sum=add(3,4); 以函数模式调用函数时,this被绑定到全局对象。
eg. myObject.double=function(){
var that=this; //解决内部函数调用时this仍指向绑定外部函数的this变量问题。
var helper=function(){
that.value=add(that.value,that.value);
};
Helper();
};
myObject.double();
document.writeln(myObject.value);
构造器调用模式:如果一个函数前面加上new来调用,那么背地里将会创建一个连接到该函数的prototype成员的新对象,同时,this会绑定到那个新对象上。new前缀会改变return语句的行为。一个函数,如果创建的目的是希望结合new前缀来调用,则它称为构造器函数。
eg. var Quo= function(){
this.status=string;
};
Quo.prototype.get_status=function(){
return this.status;
}
Var myQuo=new Quo(“confused”);
Apply调用模式:apply方法可以将数组参数传递给调用函数,接收两个参数,第一个是要绑定给this的值,第二个为一个参数数组。
Eg.
var array=[3,4];
Var sum=add.apply(null,array);
参数:当函数被调用时,会得到一个默认参数,即arguments数组。函数可以通过这个参数访问所有它调用时传递给它的参数列表,包括那些没有被分配给函数声明时定义的形式参数的多余参数。
Var sum=function(){
var i,sum=0;
for(i=0;i<arguments.length;i++){
Sum+=arguments[i];
}
return sum;
};
document.writeln(sum(4,8,15,16,32,68));
返回:return 语句用来使函数提前返回。当return被执行时,函数立即返回而不再执行余下的语句。一个函数总是会返回一个值,如果没有指定返回值,则返回undefined。如果在函数调用时在前面加上new前缀,且返回值不是一个对象,则返回this。
异常:throw、try{}catch{}
扩充类型的功能:给基本类型添加方法
递归:直接或间接地调用自身的函数。
作用域:控制着变量与参数的可见性及生命周期。
闭包:内部函数可以访问定义它们的外部函数的参数和变量。
回调:提供一个当服务器的响应到达时随即处理的回调函数,用于处理异步请求。
模块:模块是一个提供接口却隐藏状态与实现的函数或对象。通过使用函数产生模块,可以减少全局变量的使用。可以使用函数和闭包来构造模块。
Ps:模块模式的一般形式:一个定义了私有变量和函数的函数;利用闭包创建可以访问私有变量和函数的特权函数;最后返回这个特权函数,或者把它们保存到一个可访问到的地方。
章五 继承
继承:代码重用;引入了一套类型系统的规范。
章六 数组
数组是一段线性分配的内存,通过整数计算偏移并访问其中的元素。
数组字面量:在一个方括号里包围零个或多个用逗号分隔的值的表达式。数组字面量允许出现在任何表达式可以出现的地方。
长度:数组的length属性,没有上界。如果元素个数大于数组长度,将会促使length增大以容纳新元素,不会发生数组越界。
删除:delete运算符可以从数组中移除元素。Splice()方法可以删除一些元素并将他们替换为其他的元素,第一个参数为数组中的序列号,第二个参数是要删除的元素个数。
枚举:for in语句可以用来遍历一个数组的所有属性。for in无法保证属性的顺序。而for可以解决这个问题。
Ps:当属性名是小而连续的整数时,应该使用数组。否则,使用对象。
方法:JavaScript提供了一套数组可用的方法,存储在Array.prototype中的函数。(章八)
章七 正则表达式
正则表达式方法:regexp.exec()、regexp.test()、string.match、string.replace、string.search、string.split、
^表示此字符串的开始 ?表示0次或1次 (..)表示一个捕获数组,一个捕获数组会复制它所匹配的文本,并把其结果放到result数组里。 […]表示一个字符类
a-Za-Z表示这个字符类包含26个大写字母和26个小写字母 -表示范围
+表示这个字符类会被匹配一次到多次 \d表示[0-9] \D表示[^0-9]
\s表示Unicode空白字符的一个不完全子集 \S表示与前面相反的
\w表示[0-9A-Z_a-z] \W表示与前面相反的
\1表示指向分组1所捕获的文本的一个引用
创建正则表达式两种方法:
Var myregexp=/”(?:\\.|[^\\\”])*”/g;或
Var myregexp=new RegExp(“\”(?:\\\\.|[^\\\\\\\”\])*\””,’g’);
章八 方法
数组:
Concat()连接两个或更多的数组,并返回结果;
join()把数组的所有元素放入一个字符串,元素通过指定的分隔符进行分隔。
Pop()删除并返回数组的最后一个元素。
Push()向数组末尾添加添加一个或更多元素,并返回新的长度。
Reverse()颠倒数组中元素的顺序。
Shift()删除并返回数组的第一个元素。
Slice()从某个已有的数组返回指定的元素。
Sort()对数组的元素进行排序。
Splice()删除元素,并向数组添加新元素。
toSource()返回该对象的源代码。
toString()把数组转化为字符串,并返回结果。
toLocaleString()把数组转换为本地数组,并返回结果。
Unshift()向数组的开头添加一个或更多元素,并返回新的长度。
valueOf()返回数组对象的原始值。
函数:
Function.apply(thisArg,argArray) 表示apply方法调用function,传递一个会被绑定到this上的对象和一个可选的数组作为参数。
数值:
number.toExponential(fractionDigits); fractionDigits控制小数点位数,转化为指数形式的字符串
number.toFixed(fractionDigits);转化成十进制形式的字符串,fractionDigits控制小数点位数
number.toPrecision(precision);转化成一个十进制形式的字符串,可选参数控制数字的精度
number.toString(radix);转化成一个字符串,radix控制基数
对象:
Object.hasOwnProperty(name);判断对象是否具有某个属性
正则:
regexp.exec(string); 匹配模式.exec(待匹配字符串)
regexp.test(string);
字符串:
string.charAt(pos); 以整数形式表示的string中的pos位置处的字符的字符码位
string.concat(string…); 字符串连接
string.indexOf(searchString,position);
string.lastIndexOf(searchString,position);
string.localeCompare(that);
string.match(regexp);让字符串和一个正则表达式进行匹配
string.replace(searchValue,replaceValue);
string.search(regexp);
string.slice(start,end);复制string方法的一部分来构造一个新的字符串
string.split(separator,limit);将string分割成片段来创建一个字符串数组,limit限制被分割的片段数量。
string.substring(start,end);和slice方法一样,只是它不能处理负数参数
string.toLocaleLowerCase();所有小写字母换成大写
string. toLocaleCase ();所有大写字母换成小写
string.UpperCase();所有字母都换成大写格式
string.fromCharCode(char…);根据一串数字编码转化返回一个字符串