zoukankan      html  css  js  c++  java
  • 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.如果第一个运算数的值为假,那么运算符&&产生它的第一个运算数的值.否则,它产生第二个运算数的值.如,可利用&&运算符避免检索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的入门书后,再看此书,非常有利于知识的沉淀.

  • 相关阅读:
    PAT B1027 打印沙漏 (20 分)
    PAT B1025 反转链表 (25 分)
    PAT B1022 D进制的A+B (20 分)
    PAT B1018 锤子剪刀布 (20 分)
    PAT B1017 A除以B (20 分)
    PAT B1015 德才论 (25 分)
    PAT B1013 数素数 (20 分)
    PAT B1010 一元多项式求导 (25 分)
    HDU 1405 The Last Practice
    HDU 1165 Eddy's research II
  • 原文地址:https://www.cnblogs.com/dingyuanxin/p/3998960.html
Copyright © 2011-2022 走看看