zoukankan      html  css  js  c++  java
  • JavaScript秘密花园

    译文地址 bonsaiden.github.io/JavaScript-Garden/zh/#intro.authors

    之前被人问到JS一些概念性的东西,感觉很模糊,可能层次比较浅,偏理论的东西实践得较少,发现一处花园, 采点小蜜。




    1 数字不是对象的误解
        2.toString();报语法错误的原因是因为试图将 点号解析为浮点数的一部分。
        (2).toString()可行的。

    2 hasOwnProrotype方法继承自Object.prototype
        是JS中唯一一个处理属性但是不查找原型链的函数。

    3 函数名在函数内总是可见的
        var a = function b (){b();}//见9

    4 'use strict'
        严格模式下,arguments的 getter 和 setter 方法不会被创建
        function f(a) {
            "use strict";
            a = 42;//setter没有被创建, arguments[0] 不会变
            return [a, arguments[0]];
        }

    5 ??? 然而,的确有一种情况会显著的影响现代 JavaScript 引擎的性能。这就是使用 arguments.callee。

    function foo() {
        arguments.callee; // do something with this function object
        arguments.callee.caller; // and the calling function object
    }

    function bigLoop() {
        for(var i = 0; i < 100000; i++) {
            foo(); // Would normally be inlined...
        }
    }

    上面代码中,foo 不再是一个单纯的内联函数 inlining(译者注:这里指的是解析器可以做内联处理), 因为它需要知道它自己和它的调用者。 这不仅抵消了内联函数带来的性

    能提升,而且破坏了封装,因此现在函数可能要依赖于特定的上下文。
    因此强烈建议大家不要使用 arguments.callee 和它的属性。

    6 构造函数
        构造函数内部this指向新创建的对象;
        新创建的对象prototype被指向构造函数的的prototype;
        如果 函数内部没有显示的return表达式,就会隐式的返回新建的对象;
        如果return 的不是对象,那么将返回新建的对象;
        
    7 JS函数中只有通过两种方式声明局部变量 参数 和 var

    8 变量提升(hoist)
        变量声明会被提升,但是缺省值是undefined
        函数式声明也会被提升,而且可以立即使用

    9 JS函数内部变量查找顺序
        1 查找var声明
        2 查找是否存在以该名称命名的函数
        3 查找函数自身
        function sss(){
            var sss = 1;
            function sss(){}
        }

    10 遍历数组的时候, 使用in 会遍历出原型链上的属性
        在使用for(var i=0; L=arr.length; i<L; i++) 缓存数组长度会提高效率

    11 相等和比较
        JavaScript 是弱类型语言,这就意味着,等于操作符会为了比较两个值而进行强制类型转换。
        不像普通的等于操作符,严格等于操作符不会进行强制类型转换。
        虽然 == 和 === 操作符都是等于操作符,但是当其中有一个操作数为对象时,行为就不同了。这里等于操作符比较的不是值是否相等,只有对象的同一个实例才被认为是

    相等的。 这有点像 Python 中的 is 和 C 中的指针比较。

    12 typeof/instanceof 操作符
        typeof操作符 是JS设计的缺陷之一,大多数情况会返回Object。而且总是返回字符串。
        要想精确地得到变量类型,Object.prototype.toString.call('test').slice(8,-1)
        
        instanceof是用来检测对象的构造函数(会有多个)

    13 eval
        eval()会执行一段JS字符串,只有被直接调用的时候,才会在当前作用域中执行。
        var a = eval; a('xxx'); 和 eval('xxx')执行环境会有所不同。
        setTimeout/setInterval也接受字符串作为第一个参数,并且执行。但是总是在全局作用域中执行,其中的'eval'不是被直接调用。

    14 undefined
        ???全局环境中有个变量叫做undefined, 保存的是undefined类型实际值的副本,因此对它赋新值不会改变undefined类型的值。

    15 JS是有分号的语言,需要分号解析源代码,因此在解析的时候会自动插入分号,会产生隐患。

    16
    function Foo() {
        this.value = 42;
        this.method = function() {
            console.log(this,3333); //执行函数的时候this指向了window,延迟
        };
        setTimeout(this.method, 500);//this执行新建的Foo对象,决定使用哪个方法,立即决定。
    }
    new Foo();











  • 相关阅读:
    mysql重复数据下,删除一条重复数据
    Mysql常用函数
    鼠标滑至某位置,在鼠标旁边出现详情弹窗div
    限制文本框只能输入正数,负数,小数
    JAVA中split对空串的影响。
    《JAVA与模式》之简单工厂模式 (转)
    linux 常用命令汇总
    《JAVA与模式》之责任链模式
    《JAVA与模式》之模板方法模式 (转)
    java 异常汇总
  • 原文地址:https://www.cnblogs.com/cy056/p/3197153.html
Copyright © 2011-2022 走看看