推荐阅读《JavaScript 语言精粹》

来源:互联网 发布:suse yast 安装软件 编辑:程序博客网 时间:2024/05/18 05:18


一、推荐:
   1. 这本书的篇幅少,内容精简。
   2. 针对的不是初学者。
   3. 语法图明了,舒服。
废话少说,以下给自己观后总结:
   读书需要反反复复的读,深层次的理解最终离不开实操。领略书本的内容才算是真正的将书读了。

二、观后总结:
●精华:认识JavaScript:以下简称js
1.js是一门弱类型的语言(意味着js编译不检测类型错误),在Web浏览器上使用;
2.js的函数是(主要)基于词法作用域lexical scoping的顶级对象;
3.js拥有非常强大的对象字面量表示法(eg:JSON);
4.js拥有一个无类型的class-free对象系统(即:原型继承);
5.js依赖于全局变量来进行连接(但全局变量时魔鬼)。
6.js简单数据类型包括数据、字符串、布尔值、null值和undefined;
注意:JavaScript采用块语法,没有提供块级作用域,预编译:function(){}内定义变量将会置顶;

语法:
1.空白通常没有意义,但必要时作分隔字符序列用
2.避免/* */注释,并用//注释代替;
3.标识符被用于语句、变量、参数、属性名、运算符和标记,但不能用保留字;
注意:当保留字被用作对象字面量的键值时用法如:object={'case':value};object['case']=value;
4.js只有一个数字类型,所以1和1.0值相同;
注意:浮点数:0.1+0.2不等于0.3;parseInt把字符串转为整数遇到非数字时停止:parseInt('12aa')//12
      Unicode把一对字符视为一个单一的字符,而js认为一对字符是两个不同的字符。
5.NaN是一个数值,NaN不等于任何值,包括它本身;isNaN(number)方法用于检测NaN;
eg:isNaN(NaN)//true
   isNaN(1)//fale
    isNaN('oops')//true
    isNaN('1')//false
6.字符串字面量可以被包括在一对单/双引号中,反斜杠\一般用作转义字符;js没有字符类型,要表示一个字符,只需创建仅包含一个字符串即可。
字符串是不可变的,一旦被创建,就无法改变,但可以通过+运算符连接其他字符串来创建一个新字符串。
7.语句/运算符:
     a、定义变量:var name,nextname...=expression;
     b、少使用for in 语句;
     c、表达式:三元运算 expression?value:value;
     d、===、!===与==、!=区别前两者判断时会转型;
          eg:var result=('11'==11); //true      var result=('11'!=11); //false
              var result=('11'===11); //false    var result=('11'!==11); //true
     e、&& 逻辑与,||逻辑或;

对象:可变的键控集合:‘名/值’对,用逗号分隔
  字面量:对象字面量是一种可以方便地按指定规格创建新对象的表示法;
      eg:{ name1 : expression,name2 : expression...}
a.用[]后缀来检索 AA[name];
b.通过赋值来更新AA[name]='newname',如果对象之前没该属性名则会扩充AA.newatt='attr';
c.通过引用来传递,永远不会被复制
d.原型:原型连接1.在更新时不起作用,修改当前对象不会触及对象的原型;
                2.只有在检索值得时候才被用到。
Function。prototype。method=function(name,func){
this.prototype[name]=func;
return this;
};
注意:可以利用原型链method去定义新方法,扩充function类型的功能。
e、反射:typeof AA.name //‘string’
   在原型链中任何属性都会产生值,处理不需要的属性方法两种:
      1.可用自己的程序检测丢弃;
      2.用hasOwnProperty检测对象拥有独有属性,不去检测原型连;
注意:typeof null 返回 ‘object’而不是null。
f、枚举:要想确保属性以特定的顺序出现,避免使用for in 语句
g、删除:Delete对象属性可能会让来自原型链中的属性透现出来;
h、减少全局变量污染,纳入同一名称空间之下。
注意:javascript的对象永远不会是一个真的空对象。

函数:
function (){...};匿名函数
(function(){...});匿名函数函数表达式
var Add=function Add(){...};函数声明
function Name(){};//可以递归调用自己
1.匿名函数作用域具有全局性,this代表window;
2.函数是对象:与其他一样被使用,可以保持在变量、对象和数组中,可当作参数来传递,也可以再返回函数;
3.并且可以用于方法。与众不同在于它们可以被调用。

函数字面量包括4个部分:
1.保留关键字 function;
2.函数名可以被省略(函数可以用其名字来递归调用);
3.包围在圆括号中的一组参数,逗号分隔;
4.包围在花括号中的一组语句(函数的主体),在函数被调用时执行。
调用包括4种模式:
1.方法调用:myfunc.method();
2.函数调用:this被绑定到全局
3.构造器调用:原型继承,this指向新对象;(不推荐使用)
4.apply调用:构建一个参数数组传递给调用函数,参数1:this,参数2:参数数组
参数:'免费配送'的arguments数组,伪数组
递归:能够非常高效地操作树状结构;eg:‘汉诺塔’
注意:尾递归一种在函数的最后执行递归调用语句的特殊形式的递归。
闭包:函数可以访问它被创建时所处的上下文环境;
    a、内部函数可以访问定义它们的外部函数的参数和变量;
    b、内部函数拥有比它的外部函数更长的生命周期。
注意:避免在循环中创建函数,它可能只会带来无谓的计算,还会引起混淆。
回调:异步函数返回,客户端就不会被阻塞。
模板:使用函数和闭包来构造模块,模块是一个提供接口却隐藏状态与实现的函数或对象。就几乎可以完全摒弃全局变量的使用。
注:
  cascade级联:级联技术可以产生极富表现力的接口。
  curry柯里化:函数也是值,柯里化允许我们把函数与传递给它的参数相结合,产生新函数。
  memoization记忆:将操作结果记录在某个对象里,避免无谓的重复运算(如:阶乘)。

继承:
伪类:不直接让对象从其他对象继承,反而插入了一个多余的间接层:通过构造器函数产生对象。
对象说明:把对象传给构造器
原型:差异化继承
函数化:提供了一个处理父类方法的方法superior方法。定义对象的属性私有运用到函数化模块。
部件:从一套部件中把对象组装出来:它会给对象添加一个on方法,一个fire方法和一个私有的事件注册表对象。

数组:是一段线性分配的内存,通过整个计算偏移并访问其中的元素。是一种性能出色的数据结构。
   JS中没有像此类一样的数据结构。而js提供了一种拥有一些类数组(array-like)特征的对象。
数组字面量:js允许数组包含任意混合类型的值。
长度:设置更大的length不会给数组分配更多的空间,而设小将导致所有下标大于等于新length的属性被删除。
删除:delete numbers[2]就会留下空洞其值指向初始值undefined 。
枚举:for in语句无法确保属性的顺序,常规的for语句可以避免这些问题。
方法:js提供了一套数组可用的方法,这些方法是被储存在Array.prototype中的函数。(Array.prototype也可以扩充)
注:数组是对象,可以直接改单独的数组添加方法,如果添加的是xx字符串则增加名为xx字符串属性,不会改变length。当属性名是整数时,数组才是最有用的,但它们依旧是对象,并且对象可以接受任何字符串作为属性名。
指定初始值:var aa=[];得到一个新的空数组,访问一个不存在的元素则得到值为undefined。

正则表达式:/^ $/i忽略大小写 g全局 m多行  
    ^开始 $结束 ?可选  [...]一个字符类 [A-Za-z]任意一个从a到z的大小写字母 
    {0,3}被匹配次数0次或1-3次  .会匹配除行结束符以外的所有字符  +至少一个
    \f换页符 \n换行符 \r回车符 \t制表(tab)符 \u Unicode  
    \d 等同[0-9]的一个数字 \D取反[^0-9]  \w[0-9A-Z_a-z] \W[^0-9A-Z_a-z]
正则表达式分组4种:
 1.(?:...)非捕获型分组:仅作简单匹配,捕获捕获所匹配的文本;
 2.(...)捕获型分组:任何匹配这个分组的字符都会被捕获;
不推荐:3.(?=前缀 向前正向匹配 和 4.(?!前缀 向前负向匹配

方法:js包含了一套小型的可用在标准类型上的标准方法集。
array.Concat(item...)连接,包含一份array浅复制。
array.join(separator)无间隔的连接
array.pop()尾部移除
array.push(item...)尾部增加
array.reverse()反转元素顺序
array.shift()从头部开始去掉
array.slice(start,end)浅复制
array.sort(comparenfn)排序,但是sort方法是不稳定的
array.splice(star,deleteCount,item...)绞接,那些item插入到被移除元素的位置上。
array.unshift(item...)头部开始插入

function.apply(thisArg,argArray)传递一个会被绑定到this上的对象和一个可选的数组作为参数。

number.toExponential(fractionDigits)转成一个指数形式的字符串,可选参数值必须在0-20
number.toFixed(fractionDigits)转为一个十进制数形式的字符串,可选参数,值必须在0-20,默认为0。
number.toPrecision(precision)转为一个十进制数形式的字符串,可选参数值必须在0-21;
number.toString(radix)转成一个字符串。可选参数radix控制基数,值必须2-36,默认以10为基数。

object.hasOwnProperty(name)包含name属性返回true原型链中的同名属性是不是被检测的。

regesp.exec(String)成功匹配则返回一个数组
regesp.text(String)最简单(最快)的方法,匹配则回true。不要对这个方法使用g标识。

string.charAt(pos)返回string中pos位置处的字符。如果pos小于0或大于字符串长度则返回空字符。
string.charCodeAt(pos)返回string中pos位置处的字符位码。如果pos小于0或大于字符串长度则返回NaN。
string.Concat(string)连接,一般用+运算符
string.indexOf(searchString,position)匹配则返回第一个匹配字符的位置,否则返回-1.
string.lastIndexOf(searchString,position)从末尾开始查找
string.localeCompare(that)比较字符串
string.match(regexp)与正则表达式进行匹配
string.replace(searchString,replaceValue)替换
string.search(regexp)匹配则返回第一个匹配首字符的位置,否则返回-1.忽略g标识。
string.slice(start,end)复制一部分构造新字符串,start为负数则与length相加
string.split(separator,limit)分割成片段来创建一个字符串数组.limit限制数量。
string.substring(start,end)与slice一样,用slice代替他.
string.toLocaleLowerCase()返回一个新字符串,使用本地化规则转换小写格式
string.toLocaleUpperCase()返回一个新字符串,使用本地化规则转换大写格式
string.toLowerCase()所有字母转换为小写格式
string.toUpperCase()所有字母转换为大写格式
String.fromCharCode(char...)根据字符串编码返回字符串

毒瘤:
全局变量:定义a. var foo=value; b.window.foo=value;c. foo=value;
作用域:
自动插入分号: return              最好写法是 return{
              {                                 status:true
               status:true                              };
                };
保留字当保留字被用作对象字面量的键值时用法如:object={'case':value};object['case']=value;
UincodeUnicode把一对字符视为一个单一的字符,而js认为一对字符是两个不同的字符。
typeoftypeof null 返回 ‘object’而不是null。
parseIntparseInt把字符串转为整数遇到非数字时停止:parseInt('12aa')//12
+运算+运算符可以用于加法运算或字符串连接。
浮点数浮点数:0.1+0.2不等于0.3;
NaNNaN是一个数值,NaN不等于任何值,包括它本身;isNaN(number)方法用于检测NaN
伪数组:js没有真正的数组,arguments数组不是一个数组,它只是有着一个length成员属性的对象。
假值
              
hasOwnProperty(它是方法,不是运算符)用hasOwnProperty检测对象拥有独有属性,不去检测原型连
对象:javascript的对象永远不会是一个真的空对象。

糟粕:
==
with语句:避免使用它。
eval:避免使用,与with执行的方式一样降低了语言的性能。
continue语句:跳到循环的顶部,影响性能。
switch穿越:忘记break会导致穿越。
缺少块的语句 
       eg:  if(ok)是这样工作的:  if(ok)        而不是if(ok){  t=true;advance();   }
             t=true;            {t=true;}
             advance();         advance();
++ --递增、递减:不够谨慎的编码风格。
位运算符:对于浮点数js转换整数再运算最后转换回去;而且js中&容易误写成&&。
function语句对比function表达式:
类型的包装对象:new Boolean(false)会返回一个对象----这完全是没必要的。
new:最后不去使用new。
void:js中是一种运算符,它接受一个运算数并返回undefined。

JSLint:是一个js的代码质量工具。可在这里http://www.jslint.com/中找到。
     
语法图:
                                

JSON是一种轻量级的数据交换格式(javascript object notation)js对象表示法。
6种类型的值:对象、数组、字符串、数字、布尔值(true、false)和特殊值null:
     a、JSON对象:是一个容纳‘名/值’对的无序集合;
     b、JSON数组:是一个值得有序序列;
     c、JSON字符串被包围在一对双引号之间;
     d、JSON数字与js数字相似,整数的首位不允许为0,因为一些语言用它来表示八进制数;
安全地使用JSON
1、使用eval函数可以把一段JSON文本转化成一个有用的数据结构:
    eg:var myData= eval('('+ myJSONText +')');
eval函数有着骇人的安全问题---通过使用JSON.parse方法代替eval避免危险。
2、外部数据与innerHTML进行交互时存在另一种危险:
一种常见的Ajax模式是把服务器端发送过来的html文本片段赋值给某个HTML元素的innerHtML属性
如果这个HTML中包含一个<script>标签或其他等价物(会带来恶意脚本被执行)……

 




0 0