一旦經(jīng)歷了var的操作,所得出的屬性,window,這種屬性叫做不可配置的屬性。不可配置的屬性無(wú)法delete。
js數(shù)據(jù)類(lèi)型
1.不可改變的原始值(棧數(shù)據(jù))
number,string,boolean,undefined,null
2.引用值(堆數(shù)據(jù))
array,function,object
試題
寫(xiě)一個(gè)能夠判斷所有類(lèi)型的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);
}
}
數(shù)組去重
//數(shù)組去重
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語(yǔ)句的作用是將代碼的作用域設(shè)置到一個(gè)特定的作用域中
缺點(diǎn):1.性能問(wèn)題。
? ? ? ? ? ?2.語(yǔ)義不明,調(diào)試?yán)щy。
第一段不使用with關(guān)鍵字
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關(guān)鍵字
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關(guān)鍵字后,JS引擎無(wú)法對(duì)這段代碼進(jìn)行優(yōu)化。
JS引擎在代碼執(zhí)行之前有一個(gè)編譯階段,在不使用with關(guān)鍵字的時(shí)候,js引擎知道a是obj上的一個(gè)屬性,它就可以靜態(tài)分析代碼來(lái)增強(qiáng)標(biāo)識(shí)符的解析,從而優(yōu)化了代碼,因此代碼執(zhí)行的效率就提高了。使用了with關(guān)鍵字后,js引擎無(wú)法分辨出a變量是局部變量還是obj的一個(gè)屬性,因此,js引擎在遇到with關(guān)鍵字后,它就會(huì)對(duì)這段代碼放棄優(yōu)化,所以執(zhí)行效率就降低了。
使用with關(guān)鍵字對(duì)性能的影響還有一點(diǎn)就是js壓縮工具,它無(wú)法對(duì)這段代碼進(jìn)行壓縮,這也是影響性能的一個(gè)因素。
語(yǔ)義不明,調(diào)試?yán)щy。
前面說(shuō)到除了性能的問(wèn)題,with還存在的一個(gè)缺點(diǎn)語(yǔ)義不明,難以調(diào)試,就是造成代碼的不易閱讀,而且可能造成潛在的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函數(shù)內(nèi),使用了with關(guān)鍵字來(lái)訪問(wèn)傳進(jìn)來(lái)的obj對(duì)象,然后修改a屬性。當(dāng)傳入o1對(duì)象時(shí),因?yàn)閛1對(duì)象存在著a屬性,所以這樣沒(méi)有問(wèn)題。傳入o2對(duì)象時(shí),在修改a屬性時(shí),由于o2對(duì)象沒(méi)有a這個(gè)屬性,所以被修改的a屬性則變成了全局變量。這就造成了潛在的bug。
try..catch
try中的代碼體出錯(cuò)不會(huì)運(yùn)行下去,會(huì)拋異常到catch中。
1.EvalError:eval()的使用與定義不一致。
2.RangeError:數(shù)值越界。
3.ReferenceError:非法或不能識(shí)別的引用數(shù)值。
4.SyntaxError:發(fā)生語(yǔ)法解析錯(cuò)誤。
5.TypeError:操作數(shù)類(lèi)型錯(cuò)誤。
6.URIError:URI處理函數(shù)使用不當(dāng)
es 5.0的嚴(yán)格模式
"use strict";(寫(xiě)在頁(yè)面邏輯最頂端)
1.不再兼容es3的一些不規(guī)則語(yǔ)法,使用全新es5的規(guī)范。
2.兩種語(yǔ)法
???1.全局嚴(yán)格模式
???2.局部函數(shù)內(nèi)嚴(yán)格模式(推薦)
3.就是一行字符串,不會(huì)對(duì)不兼容嚴(yán)格模式的瀏覽器產(chǎn)生影響。
4.不支持with,arguments,callee,caller,func,變量賦值前必須聲明,局部this必須被賦值(person,call(null/undefined)),拒絕重復(fù)屬性和參數(shù)。