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