`
hijk123456789
  • 浏览: 1650 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

javascript语言精髓读书笔记总结.doc

阅读更多
1:javascript的简单类型包括数字、字符串,布尔值(true和false)、null值和undefin值。其他对象所有的值都是对象。数字、字符串和布尔值“貌似”对象,因为他们拥有方法,但他们是不可变的。在javascript中,数组时对象,函数是对象,正则表达式是对象,当然,对象自然也是对象。

2:下面列出的值被当作假:
   False,null,undefined,空字符串‘‘,数字0,数字NaN,其他的所有值都被当作真,包括true,字符串“false”,以及所有的对象。

3:JavaScript只是一个单一的数字类型。它在内部被表示为64位的浮点数,和java的double一样。不像大多数其他的编程语言,它没有分离出整数类型,所以1和1.0是相同的值。所以就是知道数字的一切都是一种数字,这样就避免了一大类因为数字类型导致的错误。

4:for in 循环语句会枚举一个对象的所有属性名(或键名)。在每次循环中,对象的另一个属性名字符串被赋值给for和in之间的变量。通常你须通过检测obje。hasOwnProperty(variable)来确定这个这个属性名就是该对象的成员,还是从其原型链里找到的。

5:都语句就像while语句,唯一的区别是它在代码块执行之后面而不是之前检测表达式的值。这就意味着代码块将总是要执行至少一次。

6:优先考虑使用.表示法,因为它更紧凑且可读性更好。

7:如果你尝试检索一个不存在的成员元素的值,将返回一个undefined值。
||运算符可以用来填充默认值,例如:var middle = stooges【“middle-name”】|| “none”尝试检索一个undefined值将会导致TypeError异常。这可以通过&&运算符来避免错误。var middle = stooges.status && stooges.status.model

8:typeof和hasOwnProperty能够过滤一些不必要的属性和方法。
  Typeof 能够排除函数:
  Typeof another_stooge【name】 !== ‘function’
  If(another_stooge..hasOwnProperty(name))

9:最小化使用全局变量的一个方法是在你的应用中只创建唯一一个全局变量。
  另一种方法就是使用闭包来进行信息隐藏的方式,它是另一个有效减少全局污染的方法。

10:每个函数对象在创建的时候也附带一个prototype属性。它的值是是一个拥有constructor属性且值即为该函数的对象。因为函数就是对象,所以他们可以像其他的值一样被使用。函数可以存放在变量,对象和数组中,函数可以被当作参数传递给其他函数,函数也可以再返回函数。而且,因为函数是对象,所以函数可以拥有方法。

11:当实际参数的个数与形式参数个数不匹配时,不会导致运行时错误。如果实际参数值过多了,超出的参数值将被忽略。如果实际参数值过少,缺失的值将会被替换为undefined。对参数值不会进行类型检查,任何类型的值都可以被传递给参数。

12:在JavaScript中一共有四种调用模式:方法调用模式,函数调用模式,构造器调用模式和apply调用模式。这些模式在如何初始化关键参数this存在差异。

13:当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。

14:采用更为简短的写法,不仅可以减少输入的字符数,还可以减少文件大小。大部分采用简短写法的代码,执行效率都有轻微提高。使用 var obj = {};代替var obj = new Object();
使用 var arr = 【】 ;var arr = new array();

15:三元操作符可以有效精简只涉及赋值传值操作的if语句。三月操作符也可以支持嵌套,但是嵌套的层次不可以太多,太多可能会影响程序的可读性,这方面需要

16:json是一种轻量级的数据格式,轻量级首先体现在他的结果var obj = {};
  obj.p1 = ‘a’,obj.p2 = ‘b’,obj.p3 = ‘c’,
  可精简为:var obj = {p1 : ‘a’,p2 : ‘b’,p3 : ‘c‘};

17:使用高效率的代码function addEvent(elems, eventName, handler) {

  var i = -1, len = elems.length;

  if (window.attachEvent) {

      eventName = “on” + eventName;

   while (++i < len) {

       elems[i].attachEvent(eventName, handler);

}
} else if (window.addEventListener) {

  while (++i < len) {

      elems[i].addEventListener(eventName, handler, false);

  }

}

  

18:这个方法可以从某个数组返回选定的元素,且不影响原来的数组。如果参数留空,返回的就是全部元素。Array.prototype.slice还可以对某些不是数组而又能通过数字索引访问的类型进行操作,比如arguments:

  function test() {

  alert(Array.prototype.slice.call(arguments));

  }

test(1, 2, 3); // output “1,2,3″

19:数组去重复,总体思路是把数组元素逐个搬运到另一个数组,搬运的过程中检查这个元素是否有重复,如果有就直接丢掉。从嵌套循环就可以看出,这种方法效率极低。我们可以用一个hashtable的结构记录已有的元素,这样就可以避免内层循环。恰好,在Javascript中实现hashtable是极为简单的,改进如下:
  function unique(arr) {
        var result = [], hash = {};
  for (var i = 0, elem; (elem = arr[i]) != null; i++) {
             if (!hash[elem]) {
             result.push(elem);
             hash[elem] = true;
             }
       }
return result;
}
20:在大多数语言中,一个数组的所有元素要求是相同的类型。JavaScript允许数组包含任意混合类型的值。

21:length属性的值是这个数组的最大整数属性名加上1,它不一定等于数组的属性个数。可以设置length的值,设置更大的length无须给数组分配更多的空间。而把length设小将导致所有下标等于新length的属性被删除,通过把下标指定为一个数组的当前length,可以附加一个新元素到该数组的尾部,有时候可以用数组的push方法。

22:在删除数组的元素时,可以用delete方法 和 splice方法等,但是一般用splice方法,因为那样会给数组留下一个空洞。这是因为排在被删除元素之手的元素保留了最初的名字(下标)。

23:for in循环无法保证就是对象中的属性,而是用for循环则可以解决这样的问题。并且速度也是比较可以。

24:当属性名小而连续的整数时,你可以是用数组,否则,是用对象。

25:JavaScript本身对于数组和对象的区别是混乱的。Typeof运算符报告数组的类型‘object’,这没有什么意义。

26:定义的成员属性和方法能够被任何实例访问,对任何的实例都是公开的,成为成员。在JavaScript中,一般的属性和方法的定义都是公有的,请看下面的例子。
Function class(){this。Prop = 1;this。showProw();}
Var obj = new class();
Obj。prototype。showPorw(){alert(this。Prop);}以上的属性和方法都是公有的,属于任何实例对象。

27:私有成员即是内部实现中可以共享的成员,但是并不对外公开。JavaScript中并没有特殊的机制来实现私有成员,但是可以用一些技巧来实现这个功能。这个技巧主要是通过变量的作用域性质来实现的,在JavaScript中,一个函数内部定义的变量称为局部变量,该变量不是被函数外的程序访问,却可以被函数内部定义嵌套函数访问,在实现私有成员的过程中,正是利用了这一性质。在类的构造函数中可以为类添加成员,通过这种方式来定义类的成员,实际上共享了构造函数内部定义的局部变量,这些变量就可以看作为类的私有成员。
Function class(){
Var pp = ‘this is a private property’;
Function pm(){alert(pp);}
This.method = function(){pp = ‘the pp has been changed’;}
This.method2 = function(){pm();}
}
Var obj = new class();
Obj.method();
Obj.method2();
这样,就实现了私有属性pp和私有方法pm。运行class以后,尽管看上去pp和pm这些局部变量应该随即消失,但是实际上因为class是通过new来运行的,它所属的对象还没有消失,所以仍然可以通过公开成员来对他们进行操作。要使用私有成员,是以牺牲代码的可读性为代价的。而且这种实现更多的是JavaScript技巧,看上去比较勉强,因为它不是语言本身具有的机制。但是利用变量作用域性质的技巧,却是可以值得借鉴的。

27:和私有成员的面前相比,静态成员显得‘正统’的多,静态成员属于一个类的成员,它可以通过“类名。静态成员名”的方式访问。在JavaScript中,可以给一个函数对象直接添加成员实现静态成员,因为函数也是一个对象,所以对象的相关操作,对函数同样适用。

28:全局变量就是在所有作用域中都可见的变量。全局变量在很小的程序中可能会带来方便,但随着程序变得越来越大,它们很快变得难以处理。因为一个全局变量可以被程序的任何部分在任意时间改变,他们会使得程序的行为被极大地复杂化。在程序中使用全局变量降低了程序的可读性。

29:全局的变量定义有三种,第一种是脱离任何函数安排一个var语句
     第二种是直接添加一个属性到全局对象上。全局对象是所有全局变量的容器。在web浏览器里,全局对象名为window
第三种是直接使用未声明的变量,这被称为隐式的全局变量,这本来是方便初学者而有意让变量在使用前无须声明,不幸的是,忘记声明变量成了一个非常普遍的错误。JavaScript的策略是让那些忘记预先声明的变量成为全局变量,这导致查找bug非常困难。

30:在所有其他类似C语言风格的语言里,一个代码块(扩在一对花括号中的一组语句)会创建一个作用域。代码块中声明的变量在其他外部是不可见的。JavaScript采用了这样的块语法,但是没有提供块级作用域
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics