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,没有什么用,而且让人困惑

    附录A 糟粕 

    1. 全局变量(程序越大,它们的变得越难处理)

    2. 作用域(没有块级作用域)

    3. 自动插入分号(可能会掩盖更为严重的错误)

    4.  保留字(大多数没有使用,且不能被用来命名变量或参数)

    5. Unicode(Unicode把一个字符视为一个单一的字符。而javascript认为一对字符是两个不同的字符)

    6. typeof(typeof不能辨别出null与对象,对正则表达式识别上各js实现不一致)

    7. parseInt(建议转换时总是提供基数参数)

    8. +(可能用于加法运算或字符串连接)

    9. 浮点数(0.1 + 0.2 != 0.3)

    10. NaN

    11. 伪数组(JavaScript没有真正的数组,不需设维度永远不越界,但性能可能比真正的数组糟糕的多)

    12. 假值(有一大组假值但互相不能互换)

    13. hasOwnProperty(是一个方法而不是运算符)

    14. 对象(JavaScript没有真正的空对象)



    附录B 鸡肋

    1. ==(判断过程会试图强制转换其值的类型)

    2. with语句(本意是想用来快捷地访问对象的属性,但严重影响处理速度,因为它阻止了变量名的词法作用域绑定)

    3. eval(授予文本过大权力,不安全)

    4. continue语句(用于跳到循环的顶部。但发现通过重构移除continue语句后性能得到改善)

    5. switch贯穿

    6. 缺少块语句

    7. ++ --(代码变得过于紧密、复杂和隐晦)

    8. 位运算符(Java里,位运算符处理的是整数,JavaScript没有整数类型,需转换。因此非但不是硬件处理,而且非常慢)

    9. function语句对比函数表达式

    10. 类型的包装对象(永远不要手动实例化包装类型)

    11. new(构造函数忘记使用new时,this值绑定到全局变量)

    12. void(存在于js里,但没什么用)。

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

  • 相关阅读:
    angular入门学习文档之一
    将SDL程序变成网页(使用emscripten)
    Nim使用OpenGL
    C++移动操作,RVO和NRVO
    从零开始制作一个粒子系统
    cocos2d-x学习之路(一)——安装cocos2d-x
    堆排序
    开发zeroc ice应用入门(java开发ice应用,python开发ice应用,java与python结合开发ice服务)
    eclipse自动提示设置以及问题:去除变量自动提示(图文详解)
    ubuntu安装新版QQ
  • 原文地址:https://www.cnblogs.com/jasonlny/p/3532106.html
Copyright © 2011-2022 走看看