《Effective Javascript》筆記

1.了解你使用的javascript版本。

  • "use strict"只有在腳本或函數(shù)的頂部才能生效缤削。
  • 應對代碼連接,編寫健壯代碼的兩個方案:
    1. 不要將進行嚴格模式檢查和不進行嚴格模式檢查的文件連接起來
    • 連接多個文件時寞酿,將自身包裹在立即調(diào)用的函數(shù)表達式中
// 最外層不進行嚴格模式檢查
(function(){
        // file1.js
        "use strict"
        function(){
            // ...
        }
        // ...
})()
(function(){
        // file2.js沒有進行嚴格模式檢查
        function(){
            var arguments = [];
            // ...
        }
})()
  • 要獲得最大兼容性祟敛,最簡單的方法是在嚴格模式下編寫代碼,并顯式的將代碼包裹在本地啟用了嚴格模式的函數(shù)中佣蓉。
(function(){
        'use strict';
        function f(){
             //...
        }
        //...
})()

2.理解Javascript浮點數(shù)

  • JavaScript中所有的數(shù)字都是雙精度浮點數(shù)
  • 位運算符將數(shù)字視為32位的有符號整數(shù)
  • 浮點運算只能四舍五入到最接近的可表示的實數(shù)披摄,盡可能采用整數(shù)值運算
(0.1 + 0.2) + 0.3; // 0.6000000000000001
0.1 + (0.2 + 0.3); // 0.6

3.當心隱式的強制轉(zhuǎn)換

  • JavaScript將值強制轉(zhuǎn)換為期望的類型。
3 + true; // 4
"2" + 3; // "23"
(1 + 2) + "3"; // "33"
"17" * 3; // 51
"8" | "1"; // 9
  • 一個未定義的變量將被轉(zhuǎn)換為特殊的浮點數(shù)值NaN勇凭,NaN是唯一一個不等于其自身的值疚膊。
isNaN(Nan); //true
isNaN("foo"); // true
isNaN(undefined); // true
isNaN({}); // true
isNaN({valueof: "foo"}); // true
function isReallyNaN(x){
    return x !== x;
}
  • 對象可以被強制轉(zhuǎn)換為原始值。最常見的用法是轉(zhuǎn)換為字符串(通過隱式調(diào)用自身的toString方法)虾标。
"the Math object: " + Math; // "the Math object: [object Math]"
  • 對象通過valueOf方法強制轉(zhuǎn)換為數(shù)字寓盗,通過toString()方法強制轉(zhuǎn)換為字符串。
  • 具有valueOf方法的對象應該實現(xiàn)一個toString方法璧函,返回一個valueOf方法產(chǎn)生的數(shù)字的字符串表示傀蚌。
  • 測試一個值是否為未定義的值,應該使用typeOf或者與undefined比較而不是使用真值運算蘸吓。JavaScript中有7個假值: false喳张、0、-0美澳、""、NaN摸航、null制跟、undefined。
function point(x, y){
    if( !x ){
        x = 320;
    }
    if( !y ){
        y = 240;
    }
    return { x: x, y: y }
}
point(0,0); // 忽略任何假值參數(shù)酱虎,包括0雨膨,結(jié)果為{ x: 320, y: 240 } 

對比下面的typeof檢查方式

function point(x, y){
    if(typeof x === "undefined"){
        x = 320;
    }
    if(typeof y === "undefined"){
        y = 240;
    }
    return { x: x, y: y }
}
point(); // { x: 320, y: 240 }
point(0,0); // { x: 0, y: 0 }

4.原始類型優(yōu)于封裝

JavaScript除了布爾、數(shù)字读串、字符串聊记、null、undefined是原始值類型外恢暖,其余的全是對象排监。但是typeof(null)得到的結(jié)果卻是'object',ECMAScript標準描述這是一個獨特類型杰捂。標準庫提供了構(gòu)造函數(shù)來封裝布爾值舆床、數(shù)字、字符串作為對象。

var s = "hello"
var so = new String("hello");//封裝字符串的String對象
typeof s // "string"
typeof so; // object

不能使用內(nèi)置操作符比較兩個String對象挨队,因為每個String對象都只等于自身:

"hello"==="hello"; //true

var s1 = new String("hello")
var s2 = new String("hello")
s1===s2; // false
s1==s2; //false

對原始值提取屬性和進行方法調(diào)用時谷暮,它表現(xiàn)的像使用了對應對象類型封裝了該值一樣。例如盛垦,String對象的方法湿弦,對原始字符串也可以調(diào)用那個。

"hello".toUpperCase(); // "HELLO"
// 對比下面的調(diào)用
"hello".someProperty =17; // 封裝成對象A
"hello".someProperty; // 封裝成對象B腾夯,undefined

5.避免對混合類型使用==運算符

下面是一個隱式強制轉(zhuǎn)換的例子颊埃,運算符兩邊都被強制轉(zhuǎn)換為數(shù)字1。

"1.0e0" == { valueOf: function(){ return true; } }; // true

當兩個參數(shù)屬于同一類型時俯在,==和===運算符可以互換竟秫,但最好嚴格使用相等運算符。對比下面三個版本的代碼:
bad

var today = new Date();
if(form.month.value == (today.getMonth() + 1) && form.day.value == today.getDate()){}

better: 顯示使用Number函數(shù)或一元運算符+將值轉(zhuǎn)換為數(shù)字

var today = new Date();
if(+form.month.value == (today.getMonth() + 1) && +form.day.value == today.getDate()){}

best: 使用嚴格相等運算符

var today = new Date();
if(form.month.value === (today.getMonth() + 1) && form.day.value === today.getDate()){}

6.了解分號插入的局限

  • 分號僅在}標記之前跷乐、一個或多個換行之后程序輸入的結(jié)尾被插入肥败。
  • 分號僅在隨后的輸入標記不能解析時插入。

你可能會想愕提,只要不省略分號就沒事了馒稍。事實上不是這樣。接下來是個JavaScript語法限制產(chǎn)生式(restricted production)浅侨,它不允許兩個字符之間出現(xiàn)換行纽谒。最危險的是return語句,在return關鍵字和其可選參數(shù)之間不能包含換行符如输。

return {}; // 返回新對象
//
return
{}; // 出現(xiàn)換行符被解析為3條語句 return, {}, ;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鼓黔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子不见,更是在濱河造成了極大的恐慌澳化,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稳吮,死亡現(xiàn)場離奇詭異缎谷,居然都是意外死亡,警方通過查閱死者的電腦和手機灶似,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門列林,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酪惭,你說我怎么就攤上這事希痴。” “怎么了撞蚕?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵润梯,是天一觀的道長。 經(jīng)常有香客問我,道長纺铭,這世上最難降的妖魔是什么寇钉? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮舶赔,結(jié)果婚禮上扫倡,老公的妹妹穿的比我還像新娘。我一直安慰自己竟纳,他們只是感情好撵溃,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锥累,像睡著了一般缘挑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桶略,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天语淘,我揣著相機與錄音,去河邊找鬼际歼。 笑死惶翻,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的鹅心。 我是一名探鬼主播吕粗,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旭愧!你這毒婦竟也來了颅筋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤输枯,失蹤者是張志新(化名)和其女友劉穎垃沦,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體用押,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年靶剑,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜻拨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡桩引,死狀恐怖缎讼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坑匠,我是刑警寧澤血崭,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響夹纫,放射性物質(zhì)發(fā)生泄漏咽瓷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一舰讹、第九天 我趴在偏房一處隱蔽的房頂上張望茅姜。 院中可真熱鬧,春花似錦月匣、人聲如沸钻洒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽素标。三九已至,卻和暖如春萍悴,著一層夾襖步出監(jiān)牢的瞬間头遭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工退腥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留任岸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓狡刘,卻偏偏與公主長得像享潜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嗅蔬,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容