javascript基础学习笔记3

一旦经历了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)),拒绝重复属性和参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值