美文网首页
javascript基础学习笔记3

javascript基础学习笔记3

作者: Shinemax | 来源:发表于2018-02-20 17:58 被阅读0次

    一旦经历了var的操作,所得出的属性,window,这种属性叫做不可配置的属性。不可配置的属性无法delete。

    js数据类型

    1.不可改变的原始值(栈数据)
    number,string,boolean,undefined,null

    2.引用值(堆数据)
    array,function,object

    试题

    写一个能够判断所有类型的type方法

    function type(target) {
        var template = {
            "[object Array]": "array",
            "[object Object]": "object",
            "[object Number]": "number",
            "[object Boolean]": "boolean",
            "[object String]": "string"
        }
        var toStr = Object.prototype.toString;
        if (target == null) {
            return "null";
        }
        if (typeof (target) == "object") {
            return template[toStr.call(target)];
        } else {
            return typeof (target);
        }
    }
    

    数组去重

    //数组去重
    var arr = [1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3]
    Array.prototype.unique = function () {
        var obj = {},
            temp = [],
            len = this.length;
        for (var i = 0; i < len; i++) {
            if (!obj[this[i]]) {
                obj[this[i]] = "a";
                temp.push(this[i]);
            }
        }
        return temp;
    }
    

    with的用法

    with语句的作用是将代码的作用域设置到一个特定的作用域中
    缺点:1.性能问题。
               2.语义不明,调试困难。

    第一段不使用with关键字
    function func() {
        console.time("func");
        var obj = {
            a: [1, 2, 3]
        };
        for (var i = 0; i < 100000; i++) {
            var v = obj.a[0];
        }
        console.timeEnd("func");//0.847ms
    }
    func();
    
    第二段使用with关键字
    function funcWith() {
        console.time("funcWith");
        var obj = {
            a: [1, 2, 3]
        };
        with (obj) {
            for (var i = 0; i < 100000; i++) {
                var v = a[0];
            }
        }
        console.timeEnd("funcWith");//88.260ms
    }
    funcWith();
    

    原因是:使用了with关键字后,JS引擎无法对这段代码进行优化
    JS引擎在代码执行之前有一个编译阶段,在不使用with关键字的时候,js引擎知道a是obj上的一个属性,它就可以静态分析代码来增强标识符的解析,从而优化了代码,因此代码执行的效率就提高了。使用了with关键字后,js引擎无法分辨出a变量是局部变量还是obj的一个属性,因此,js引擎在遇到with关键字后,它就会对这段代码放弃优化,所以执行效率就降低了。
    使用with关键字对性能的影响还有一点就是js压缩工具,它无法对这段代码进行压缩,这也是影响性能的一个因素。

    语义不明,调试困难。

    前面说到除了性能的问题,with还存在的一个缺点语义不明,难以调试,就是造成代码的不易阅读,而且可能造成潜在的bug。

    function foo(obj) {
        with (obj) {
            a = 2;
        }
    }
    
    var o1 = {
        a: 3
    };
    var o2 = {
        b: 3
    };
    
    foo(o1);
    console.log(o1.a); // 2
    
    foo(o2);
    console.log( o2.a ); // undefined
    console.log( a ); // 2
    

    这段代码很容易理解了,在foo函数内,使用了with关键字来访问传进来的obj对象,然后修改a属性。当传入o1对象时,因为o1对象存在着a属性,所以这样没有问题。传入o2对象时,在修改a属性时,由于o2对象没有a这个属性,所以被修改的a属性则变成了全局变量。这就造成了潜在的bug。

    try..catch

    try中的代码体出错不会运行下去,会抛异常到catch中。

    1.EvalError:eval()的使用与定义不一致。
    2.RangeError:数值越界。
    3.ReferenceError:非法或不能识别的引用数值。
    4.SyntaxError:发生语法解析错误。
    5.TypeError:操作数类型错误。
    6.URIError:URI处理函数使用不当

    es 5.0的严格模式

    "use strict";(写在页面逻辑最顶端)

    1.不再兼容es3的一些不规则语法,使用全新es5的规范。
    2.两种语法
       1.全局严格模式
       2.局部函数内严格模式(推荐)
    3.就是一行字符串,不会对不兼容严格模式的浏览器产生影响。
    4.不支持with,arguments,callee,caller,func,变量赋值前必须声明,局部this必须被赋值(person,call(null/undefined)),拒绝重复属性和参数。

    相关文章

      网友评论

          本文标题:javascript基础学习笔记3

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