在JavaScript中是沒有整數的,所有數字都是雙精度浮點數。
盡管JavaScript中缺少明顯的整數類型,但是可以進行整數運算。
位算術運算符不會将操作數作為浮點數進行運算,而是會将其隐匿轉換為32位整數後進行運算。
盡可能的采用整數值運算,因為整數在表示時不需要舍入。
上述代碼最好用如下代碼替換
也許你會想當然的認為結果是17,可是結果卻如下圖所示,是不是讓你大失所望。原因是對象通過valueOf方法強制轉換為數字,通過toString方法強制轉換為字元串。

像寫如下代碼,你本來的原意是想如果使用者沒有傳入x,y,則設定預設值為320,240,結果當你x,y分别傳入0,0的時候,函數也将x,y設定為了320,240
因為在JavaScript中有7個假值:false 、0、-0、""、 NaN、 null、 undefined,是以當你傳入0的時候就自動轉換為false了......
再來看一個例子。
這也就是為什麼在JS裡面盡量使用全等運算符===而不要使用==,除非你了解如下規則。
JavaScript有5個原始值類型:布爾值、數字、字元串、null和undefined
String對象是一個真正的對象,它不同于原始的字元串
由于String對象都是一個單獨的對象,其總是隻等于自身,對于非嚴格相等運算結果同樣如此。
當做相等比較時,原始類型的封裝對象與其原始值行為不一樣。
上述代碼在ie6執行,彈出17,而在谷歌下則直接報錯。這是因為JavaScript環境把f和g這兩個函數作為不同的對象,進而導緻不必要的記憶體配置設定。
是以上述代碼在ie6下面最好寫成如下所示
看一下下面代碼
也許這樣的代碼你一眼就能看出答案,那下面的代碼呢,你試着猜下結果。
ES5建議将非标準環境的函數聲明轉變成警告或錯誤,編寫可移植的函數的最好方式是始終避免将函數聲明置于局部塊或子語句中。
eval最令人吐血的地方就是幹擾作用域。也就是說eval函數具有通路調用它那時的整個作用域的能力。
那怎樣保證eval函數不影響外部作用域呢,那就是匿名函數立即執行。如下所示
事實上,我們可以綁定eval函數到另一個變量名,通過該變量名調用函數會使代碼失去對所有局部作用域的通路能力。
這個答案undefined我想應該是你想不到的吧。
将eval函數同一個字面量包裹在序清單達式中以達到強制使用間接調用eval函數的目的。其實我們最常用的間接調用eval的方式是如下所示
像上面代碼,我們要實作将數組中每個項都強制轉換成大寫,有什麼更好的方面嗎?
這個代碼是否比上面要簡單很多,事實上ES5提供了很多類似map的函數,如every,some,forEach等等
像上面三個方面的邏輯當中都有類似的部分,大家都知道程式的壞味道就是重複相同的代碼,那怎樣讓代碼更加簡單。将相似的邏輯封裝成方法,然後。。。
是不是簡單了很多。
先從例子說起吧,下面的方法原意是想得到兩數相加的結果,可是卻報錯了
那麼我們應該如何修改才能達到相加的效果呢?事實上很簡單
這個例子說明了什麼呢,也就是說我們不要随意修改arguments的值。[].slice.call(arguments)将arguments對象複制到一個真正的數組中再進行修改。
使用事實上在嚴格模式下,函數參數不支援對arguments修改。
再看一個相關的例子
本來我們期望是得到1,3,4,5,結果卻發現每個值都是undefined,原因在next函數中的arguments和values函數中的arguments不是一個對象,是以一定要當心函數嵌套層級問題,
那我們應該如何改正問題呢
也就是說我們最好使用臨時變量來儲存中間值。
事實上這個問題就是this導緻的,也就是說在提取一個方法的時候不會将方法的接收者綁定到該方法的對象上。那如何解決呢,有好些方法呢,看看吧!
上面的代碼就是實作計時的功能。你或許不知道我在說什麼,但是你接着往下看。
上述代碼報錯了,你知道為什麼我僅僅移動了一下位置,隻是把代碼移動到一個函數中就導緻報錯的原因了嗎?因為這時的start隻是benchmark函數内的局部變量,而eval執行時是調用的全局變量start.
那怎麼樣讓代碼正常執行不報錯而又能起到封裝效果呢?用下面的代碼試試吧!