美文网首页
javascript容易被忽略的细节

javascript容易被忽略的细节

作者: CoderGLM | 来源:发表于2016-04-29 09:50 被阅读40次

    新博客地址:http://gengliming.com

    再读js高级程序设计(第3版),把一些细节记录一下

    未完待续。。。

    第三章 基本概念

    1、null == undefined;// true
    2、typeof null;// 'object' typeof NaN;// 'number'
    3、js中可以保存+0和-0,但是两者相等;
    4、浮点数值需要的内存空间是整数值的两倍;
    5、不要做这样的判断,因为浮点数最高精度是17位,0.1+0.2=0.300000000000000004;

    if (a + b == 0.3) { }
    

    6、任何数除以0返回NaN,涉及NaN的操作都返回NaN;
    7、NaN == NaN;// false
    8、isNaN()适用于对象,先调对象的valueOf(),如果返回的值不能转换为数值,再测试toString()的返回值;
    9、parseInt()的第二个参数可以制定进制,parseFloat只能转化10进制;
    10、String():如果参数有toString()方法,则调用;如果参数是null/undefined则返回"null"/"undefined";
    11、Infinity * 0 = NaN; Infinity *Infinity = Infinity; Infinity/Infinity = NaN;

    第四章:变量、作用域和内存

    1、ECMAScript中所有函数的参数都是按值传递的,文中是这么解释的;参数是引用类型时,只是对地址的值拷贝;

    function setName(obj) {
      obj.name = "Nicholas";
      obj = new Object();
      obj.name = "Greg";
    }
    
    var person = new Object();
    setName(person);
    alert(person.name); //Nicholas
    

    第五章 引用类型

    1、使用字面量定义对象时,实际上不会调用Object构造函数,Array也是这样;

    2、以下方式不推荐,因为会导致解析两次代码(第一次试解析常规ECMAScript代码,第二次是解析传入构造函数中的字符串)

    var sum = new Function('num1', 'num2', 'return num1 + num2 ');
    

    3、jQuery源码中通过索引使用this的:

          this.context = document;
          // 看这里
          this[0] = document.body;
          this.selector = selector;
          this.length = 1;
    
    

    我就去群里问这是什么用法,有人一眼就看出来这是jQ源码
    A:你得从头看,不从头看是看不懂的;
    我:为什么可以this[0]?
    A:为什么数组可以?
    我:数组可以但是为什么对象也能这么用?
    A:所以让你从头看,你都不知道什么时候对象转化成数组的(然后截图jQuery.makeArray)
    其实很简单,js中对象是可以通过key来赋值的,上面的0其实相当于key:

        function Person( name ) {
          this.name = name;
          this["name"] = 'new name';
        }
    
        var p = new Person('glm');
        console.log(p.name); // "new name"
    
    • delete 不会对原型产生影响,而且可以暴露原型属性
      function Person() {
        this.name = 'lmg';
      }
      Person.prototype.name = 'glm';
    
      var p = new Person();
      console.log(p.name); // "lmg"
      delete p.name;
      console.log(p.name); // "glm"
    
    • 如果函数以在前面加上new前缀的方式来调用,且返回值不是一个对象,则返回this(该新对象)
     // function Person() {
     //   this.name = 'lmg';
     //   return 1;
     // }
     // console.log(new Person()); // Person {name: "lmg"}
    
      function Person() {
        this.name = 'lmg';
        return {};
      }
      console.log(new Person()); // Object {}
    

    第十章 DOM

    1、IE中的所有DOM对象都是以COM对象的形式实现的。
    2、每个节点都有childNodes属性,其中保存着一个NodeList对象,这个对象是类数组对象,它实际是基于DOM结构动态执行查询的结果;
    3、以下代码在IE8及以前版本是无效的,因为这些版本中NodeList实现为一个COM对象。

    var arrayofNodes = Array.prototype.slice.call(someNode.childNodes,0)
    

    以下为跨浏览器的方法:

    function convertToArray(nodes) {
      var array = null;
      try {
        array = Array.prototype.slice.call(nodes, 0); // 非IE
      } catch (ex) {
        array = new Array();
        for (var i=0, len = nodes.length; i < len; i++ ) {
          array.push(nodes[i]);
        }
      }
      return array;
    }
    

    4、removeChild()和replaceChild()移除的节点仍然为文档所有,只是文档中已经没有了自己的位置,被移除的节点可以根据返回值的到;

    5、NodeList及其“近亲”NamedNodeMap和HTMLCollection都是动态的,每当文档结构发生变化时,它们都会得到更新;

    相关文章

      网友评论

          本文标题:javascript容易被忽略的细节

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