网摘读书笔记----javascript语言精粹

原文链接:http://www.cnblogs.com/Cohlint/archive/2012/11/26/2788790.html

1.6种值会为假(==false),分别是false,null,undefined,‘ ‘,0,NaN

2.typeof有6种值,分别是‘number‘,‘string‘,‘boolean‘,‘undefined‘,‘function‘,‘object‘;其中typeof(null),结果是‘object‘

3.number类型总是64位浮点数,两个整数相除也可能出现非整数结果

4.如果第一个运算数的值为假,那么运算符&&产生它的第一个运算数的值.否则,它产生第二个运算数的值.如,可利用&&运算符避免检索undefined引起的异常

flight.equipment                                             //undefined

flight.equipment.model                                   //throw"TypeError"

flight.equipment && flight.equipment.model     //undefined

5.如果第一个运算数的值为真,那么运算符||产生它的第一个运算数的值.否则,它产生第二个运算数的值.如,可利用||运算符来填充默认值

var status = flight.status || "unkonwn"

6.对象通过引用来传递,永远不会被拷贝

7.当我们对某个对象的属性做出改变时,不会触及到该对象的原型.原型链只有在检索值得时候,才会自下至上,直到object.prototype中去寻找,找到就用,然后停止寻找,都没有就返回undefined,这个过程称为委托.hasOwnProperty方法可以检测对象拥有的独特属性.

8.通过for in语句迭代出的对象属性包含其原型链上的属性,且无序;而通过for语句根据对象的length循环出的属性,只包含独有属性,且顺序

9.delete可以删除对象的属性,不会触及对象原型上的属性

10.函数也是对象,对象字面量产生的对象拥有到Object.prototype的隐藏链接,函数对象拥有到Function.prototype(该原型对象本身链接到Object.prototype)的隐藏链接.每个函数对象在创建时也随带一个prototype属性,它的值是一个拥有constructor属性且值即为该函数的对象

11.每个函数在创建时附有两个附加的隐藏属性:函数的上下文(可调用)和实现函数行为的代码;调用一个函数将暂停当前执行,传递控制权和参数给新函数.除了声明时定义的形参,每个函数接收两个附加的参数:this和arguments,arguments.callee代表函数自身,通常用于递归

12.参数this的值取决于调用的模式,javascript中一共有四种调用模式:

方法调用模式:当一个函数被保存为对象的一个属性时,我们称它为一个方法,一个方法被调用时,this绑定到该对象(只要函数被调用的时候用一个.点或者[subscript]下标方式调用,那么它被当做一个方法来调用)

函数调用模式:当一个函数并非一个对象的属性时,那么它被当做一个函数来调用,this被绑定到全局对象;解决内部函数的this被指向全局的设计缺陷时,可以在外部var that=this;如在浏览器中,this = window;在node中,this = globe

 构造器调用模式:如果在一个函数前面带上new来调用,那么将创建一个隐藏链接到该函数的prototype成员的新对象,同时this将会被绑定到那个新对象上.

apply调用模式:this绑定到第一个参数,即传入对象

13.函数的实参(arguments)和型参(parameters)的个数不匹配时不会报错;如果实参多了,超出的将被忽略.如果实参过少,缺少的会被传入undefined.

14.arguments并不是一个真正的数组,它只是一个类似数组的对象,除了length属性,它缺少其它数组方法.

14.5 一个函数总会返回一个值,没有指定返回值,则返回undefined.如果函数以new方式调用,且返回值不是一个对象,则返回this(该新对象)

15.javascript缺少块级作用域,所以,最好的做法是在函数体的顶部声明函数中可能用到的变量

16.利用闭包来返回外部函数变量的方式,可以避免一个函数被加上new来使用

闭包:var quo = function (status){

return {

get_status : function () {

return status ;

}

};

};

var myQuo = quo ("amazed");

构造函数:

var Quo = function (status){

this.status =status;

};

var myQuo = new Quo("amazed");

17. 一个闭包的坑

var add_the_handles = function (nodes ) {

var i;

for(i = 0;i < nodes.length ; i+= 1) {

nodes[i].onclick = function (e){

alert(i);

}

}

};

add_the_handles 函数目的是给每个时间处理器一个唯一值(i).它未能达到目的是因为事件处理器函数绑定了变量i,而不是函数在构造时的变量i的值.

改正为以下写法可达到目的:

var add_the_handles = function (nodes ) {

var i;

for(i = 0;i < nodes.length ; i+= 1) {

nodes[i].onclick = function (tempI){

return function(e){

alert(tempI);

};

}(i);

}

};

18.回调

模拟异步请求,避免客户端被阻塞

request = prepare_the_request();

send_request_asynchronously(request,function(response){

display(response);

};

19.模块(module)通过函数和闭包来创建,只暴露可用的public方法,其它似有方法全部隐藏,如果你不需要传参数或者没有一些特殊苛刻的要求的话,我们可以在最后一个}后面加上一个括号,来达到自执行的目的,这样该实例在内存中只会存在一份copy.可通过模块模式来实现单例模式

var theModule = (function(){

var i = 10;

return {

result :function(x) {

return x*i;

}

};

}());

调用:theModule.result(5);

20.通用递归记忆函数,加入一个记忆参数,可以减少递归函数的调用次数,显著提高效率

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);

});

console.log(fibonacci(10));

21.当一个函数对象被创建时,Function构造器产生的函数对象会运行类似代码: this.prototype = {constructor : this};所有的构造器函数都约定命名成为字母大写的形式,但更好的备选方案是不适用new

22.构造器函数要接受一大串参数的写法:

不建议写法: var myObject = maker(f,l,m,c,s);

建议写法: var myObject = maker({

first : f,

last: l,

state:s,

city:c

});

好处是多个参数可以任意排序,如果有默认值,可以忽略到一些参数,且代码更易读

23.在一个纯粹的原型模式中,我们会摒弃类,转而专注于对象,一个新对象可以继承一个就对象的属性

24.在伪类模式与模块模式中,尽量选择后者,函数化构造器伪代码模板

var constructor = function (spec ,my) {

var that,其他的私有实例变量;

my = my || {};

把共享的变量和函数添加到my中

that = 一个新对象

添加给that的特权方法

return that;

}

25.javascript的数组是一种拥有一些类数组特性的对象.它把数组的下标转变成字符串,用其作为属性,比普通属性多了一个可以用整数作为属性名的特性.且继承自Array.prototype,多了一个length属性;javascript同一个数组的元素可以是混合类型,且没有上界.

26.  var numbers = [‘zero‘,‘one‘,‘two‘];

numbers[numbers.length] = ‘three‘;  等价于

numbers.push(‘three‘);

27.是否数组检测

var is_array = function (value) {

return value &&

typeof value === ‘object‘ &&

typeof value.length === ‘number‘ &&

typeof value.splice === ‘function‘ &&

!(value.propertyIsEnumerable(‘length‘));

};

28.javascript中的糟粕

全局变量        :越少越好

作用域           :无块级作用域,在每个函数开头部分声明所有变量

自动插入分号  :因此大括号风格需使用埃及括号

Unicode        :javascript字符是16位的,只能覆盖65535个字符

parseInt        :增加第二个参数,明确进制,parseInt("08",10)

浮点数           :二进制浮点数不能正确的处理十进制小数,0.1+0.2不等于0.3,不过整数部分是精确的

NaN              : typeof NaN === ‘number‘  //true;  NaN === NaN //false;

对象              :因为原型链的存在,javascript对象永远不会有真的空对象

29.javascript中的鸡肋

运算符 ==和!= :会试图强制转化判断值的类型,规则复杂

with语句          :可能出现歧义,并影响处理器速度

eval                :降低安全性,增加阅读复杂性

continue          :重构移出continue后,性能得到改善

++ --              :使代码变得更隐晦

位运算符           :javascript没有整数类型,位操作符将它们的运算数先转换成整数,接着执行运算,然后再转化回去,非常慢

function           :不在if语句中使用function,尽量用var func = function... 的形式声明

new                 :更好的应对策略是根本不去使用new

void                 :将返回undefined,没有什么用,而且让人困惑

总结: 这本书只有100多页,定价高达49,开始第一感觉是比较贵;看完后领略到了物有所值,浓缩的都是精华,几乎全部是干货,连附录都是干货.在看过一门javascript的入门书后,再看此书,非常有利于知识的沉淀.

时间: 05-19

网摘读书笔记----javascript语言精粹的相关文章

JavaScript语言精粹读书笔记- JavaScript对象

JavaScript 对象 除了数字.字符串.布尔值.null.undefined(都不可变)这5种简单类型,其他都是对象. JavaScript中的对象是可变的键控集合(keyed collections). 对象是属性的容器,其中每个属性都拥有名字和值. JavaScript中的对象是无类别的(class-free)的.它对新属性的名字和值没有约束. JavaScript包括一个原型链特性,允许对象继承另一对象的属性. 对象的检索: stooge[“first-name”]或者stooge.

《JavaScript语言精粹》读书笔记——给类型增加方法一节的疑问

最近,在学习<JavaScript语言精粹>这本书,发现译者虽然有很好地翻译文章,却没有对文中有疑问的地方进行改正或加以注释.我接触JavaScript只有一年左右,可能无法很好的理解这门语言,而今天,读到第四章中4.7节——给类型增加方法时遇到了疑问之处: 文中给出了对类型增加方法的示例: Function.prototype.method = function (name, func) { this.prototype[name] = func; return this; }; 这里的示例

javascript 语言精粹 笔记推荐。。

http://www.cnblogs.com/Cohlint/archive/2012/11/26/2788790.html 这篇javascript 语言精粹 学习笔记不错..不过看上去就是读书笔记,没有深入研究某个点..比如闭包..我还是不懂噢.. 比如17条:“add_the_handles 函数目的是给每个时间处理器一个唯一值(i).它未能达到目的是因为事件处理器函数绑定了变量i,而不是函数在构造时的变量i的值.” 这是原书的翻译过来的理解,但是感觉还是很艰涩,不太理解. 闭包这个变量作

javascript语言精粹----笔记【转载】

javascript语言精粹----笔记 1.6种值会为假(==false),分别是false,null,undefined,' ',0,NaN 2.typeof有6种值,分别是'number','string','boolean','undefined','function','object';其中typeof(null),结果是'object' 3.number类型总是64位浮点数,两个整数相除也可能出现非整数结果 4.如果第一个运算数的值为假,那么运算符&&产生它的第一个运算数的值.

JavaScript语言精粹笔记

JavaScript语言精粹笔记 掌握语言的每个特性可以让你出风头,但是并不推荐,因为一部分的特性带来的麻烦可能远超本身的价值.正如书中所言,坏的材料并不能雕刻出好的作品,要成为一名更好的程序员,要取其精华去其糟粕.当你知道要做什么的时候,它还能表现的更好,编程时一件相对困难的事情,绝不应该在懵懂的状态下开始编程之旅. JS中的注意为//或者/*content*/,注释一定要精确地描述代码,不然没有用的注释比没有注释更糟糕. JS中的代码块不会创建新的作用域,因此变量应该被定义在函数的头部,而不

JavaScript语言精粹 笔记01

内容比较简单,只是从头梳理一下JS的知识 语法空白标识符数字字符串语句 对象对象字面量检索更新引用原型反射枚举删除减少全局变量污染  语法 1 空白 空白可能表现为格式化字符或注释的形式.空白通常没有意义,但是偶尔必须用它来分割字符序列,否则它们就会被合并成一个单一的符号.例如: var that = this; var 和that之间的空格是不能去掉的,其他的空格都可以被移除. JS提供两种注释: /* */ // 建议使用//,因为/* */中要注释的内容可能包括字符 */ 而报错,例如:

JavaScript语言精粹 笔记03

继承伪类对象说明符原型函数化部件 继承 JS不是基于类的,而是基于原型的,这意味着对象直接从其他对象继承. 1 伪类 JS提供了一套丰富的代码重用模式,它可以模拟那些基于类的模式,因为JS实际上没有类,所以把模拟的类称为伪类.我们可以定义一个构造器并扩充它的原型: var Mammal = function (name) { this.name = name; }; Mammal.prototype.get_name = function ( ) { return this.name; }; M

JavaScript语言精粹 笔记02

函数函数对象函数字面量调用参数返回异常给类型增加方法递归作用域闭包回调模块级联套用记忆   函数 1 函数对象 在JS中函数就是对象.对象是“名/值”对的集合并拥有一个连接到原型对象的隐藏连接.对象字面量产生的对象连接到Object.prototype.函数对象连接到Function.prototype(该原型本身连接到Object.prototype).每个函数在创建时附有两个附加的隐藏属性:函数上下文和实现函数行为的代码. 因为函数是对象,所以它可以像任何其他的值一样被使用.函数可以存放在变

JavaScript语言精粹 笔记06 方法

JS包含了少量可用在标准类型上的标准方法. ArrayFunctionNumberObjectRegExpString Array array.concat(item...) concat方法返回一个新数组,它包含array的浅复制并将1个或多个参数item附加在其后.如果参数item是一个数组,那么他的每个元素会被本别添加. var a = ['a', 'b', 'c']; var b = ['x', 'y', 'z']; var c = a.concat(b, true); // c 是 [