javascript基礎(chǔ)學(xué)習(xí)筆記3

一旦經(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ù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容