美文网首页
《JavaScript语言精髓》读书笔记(1)

《JavaScript语言精髓》读书笔记(1)

作者: 几一 | 来源:发表于2016-06-16 18:01 被阅读0次

    第二章 语法

    • 空白
      多行注释的字符可能会出现在正则表达式里,不太安全,例如:
      *
      var rm_a = /a*/.match(a);
      */

    • 标识符
      以字符、下划线(_)和美元符($)开头。

    • 数字
      无整数类型,1和1.0的值相等。
      Infinity表示所有大于1.79769313486231570e+308的值。

    • 字符串
      字符串是不可变的。
      ‘c’ + 'a' + 't' === 'cat'

    • 语句
      1.下面的值被当作

      • false
      • null
      • undefined
      • 空字符串' '
      • 数字 0
      • 数字 NaN

      其他所有值都被当作真。

      2.for in
      检测是否来自对象成员,或是原型链:
      for (myvar in obj) {
      if (obj.hasOwnProperty(myvar)){
      ···
      }
      }

    • 表达式
      typeof 运算符产生的值有'number'、'string'、'boolean'、'undefined'、'function'和'object'

    • 字面量

    • 函数

    第三章 对象

    • 对象字面量
    • 检索
    • 更新
    • 引用
      对象通过引用来传递。它们永远不会被复制。
    • 原型
      如果尝试去获取对象的某个属性值,但该对象没有此属性名,那么js会试着从原型对象中获取属性值,直到object.prototype。这个过程叫委托。
    • 反射
    • 枚举
      通过for 而不是for in ,不用担心可能发掘出原型链中的属性。
    • 删除
      删除对象的属性可能会让来自原型链中的属性透视出来。
    • 减少全局变量污染
      只创建一个唯一的全局变量。
      var MYAPP = {};

    第四章 函数

    • 函数对象
      js中函数就是对象。函数对象连接到Function.prototype。函数可以拥有方法。

    • 函数字面量

    • 调用

    • 方法调用模式
      当一个函数被保存为对象的一个属性时,我们称它为一个方法。方法可以使用this访问自己所属的对象,所以它能从对象中取值或对对象进行修改,这种方法称为公共方法。

    • 函数调用模式
      当一个函数并非一个对象的属性时,它就是被当作一个函数来使用的,this被绑定到全局对象。

    • 构造器调用模式
      一个函数如果创建的目的就是希望结合new前缀来调用的,那么它被称为构造器函数。按照约定,以大写格式命名。

    • Apply调用模式
      apply方法让我们构建一个参数数组传递给调用函数,也允许指定this的值。

    • 参数
      arguments并不是一个真正的数组,是个拥有length属性的array-like对象,没有任何数组方法。

    • 返回
      一个函数总是会返回一个值。如果没有指定返回值,则返回undefined。

    • 异常
      一个try语句只会有一个捕获所有异常的catch代码块。

    • 扩充类型的功能
      通过给Function.prototype增加一个method方法,下次给对象增加方法时就不必输入prototype。
      Function.prototype.method = function (name, func) {
      this.prototype[name] = func;
      return this;
      };
      取整方法
      Number.method('integer', function(){
      return Math[this < 0 ? 'cell' : 'floor'] (this);
      });
      移除字符串首尾空白
      String.method('trim', function () {
      return this.replace(/^\s+|\s+$/g. '');
      });

    • 递归

    • 作用域
      最好在函数体的顶部声明函数中的可能用到的所有变量。

    • 闭包
      避免在循环中创建函数。
      var add_the_handlers = function (node) {
      var helper = function (i) {
      return function (e) {
      alert(i);
      };
      };
      var i;
      for (i = 0; i < node.length; i += 1) {
      nodes[i].onclick = helper(i);
      }
      };

    • 回调

    • 模块
      模块是一个提供接口却隐藏状态与实现的函数或对象。
      var serial_maker = function () {
      var prefix = '';
      var seq = 0;
      return {
      set_prefix: function (p) {
      prefix = String(p);
      },
      set_seq: function (s) {
      seq = s;
      },
      gensym: function () {
      var result = prefix + seq;
      seq += 1;
      return result;
      }
      };
      };

      var seqer = serial_maker();
      seqer.set_prefix('Q');
      seqer.set_seq(1000);
      var unique = seqer.gensym();  //Q1000
      
    • 级联
      如果让方法返回this就可以使用级联。

    • 柯里化
      柯里化允许我们把函数与传递给它的参数相结合,产成一个新的函数。
      var add1 = add.curry(1);
      add1(6); //7

      Function.method('curry',function () {
        var slice = Array.prototype.slice,
            args = slice.apply(arguments),
            that = this;
        return function () {
          return that.apply(null, args.concat(slice.apply(arguments)));
        };
      });
      
    • 记忆
      函数可以将先前的操作结果记录在某个对象里,从而避免无谓的重复计算。
      var memoizer = function (memo, formula) {
      var recur = function (n) {
      var result = memo[n];
      if (typeof result !== 'number') {
      result = formula(recur, n);
      memo[n] = result;
      }
      return result;
      };
      return recur;
      };

      var fibonacci = memoizer([0, 1],function (recur, n) {
        return recur (n - 1) + recur (n - 2);
      });
      
      var factorial = memoizer([1,1], function (recur, n) {
        return n * recur (n - 1);
      });

    相关文章

      网友评论

          本文标题:《JavaScript语言精髓》读书笔记(1)

          本文链接:https://www.haomeiwen.com/subject/jkwmdttx.html