JavaScript糟粕和雞肋

jopen 9年前發布 | 24K 次閱讀 JavaScript開發 JavaScript

糟粕

全局變量

眾所周知,全局變量在很小的程序中可能會帶來方便,但隨著程序變得越來大,全局變量將難以處理,全局變量將降低程序的可靠性。

在js中有3種方式定義全局變量

脫離任何函數安排一個var語句 //var foo=value;

直接添加一個屬性到全局對象上 //window.foo=value;

直接使用未經聲明的變更(其實這叫隱匿全局變量) //foo=value;

作用域

眾所周知,在JavaScript中沒有塊級作用域,而且在JavaScript有提升變量聲明的功能,所以最好的方式是在每個函數的開頭部分聲明所有變量。

自動插入分號

JavaScript會試圖通過自動插入分號來修正有缺損的程序。

return
{
     status:true
};

上面的代碼大家自然的會想到會返回一個包含status成員元素的對象。但是由于JavaScript自動插入讓它變成了一個返回undefined。

所以把{放在上一行的尾部而不是下一行的頭部可避免上述問題

保留字

當保留字被用作對象字面量的鍵值時,它們必須被引號括起來。它們不能被用在點表示法中,所以有時必須使用括號表示法。

 JavaScript糟粕和雞肋

最好不要用保留字做標識符 JavaScript保留字如下圖片所列

 JavaScript糟粕和雞肋

Unicode

在阮一峰的一篇博文Unicode與JavaScript詳解 中特別清楚說明了JavaScript的編碼。

簡述一點的說就是JavaScript的字符是16位的,所以在編碼方面很多字符表示出來都是很有困難的。

typeof

typeof null返回的卻是object

typeof /a/ 有一些會返回為object而其它的卻返回function

parseInt

將一個字符串轉換為整數,但是在遇到非數字時停止解析。

如果該字符串第一個字符是0,那么該字符串將會被基于八進制而不是十進制來求值。(但關鍵是在ie8以下的瀏覽器卻還是當成十進制來求值)

建議使用parseInt時最好提供基數參數,即使轉換的是十進制。

+

+主要用于加法運算或字符串連接。但是只要其中一個運行符為字符串,則返回字符串

所以在你打算用+做加法運算時,請確保兩個運算數都是整數。

浮點數

在JavaScript中,0.1+0.2卻不等于0.3

浮點數中的整數運算是精確的,所以小數表現出來的錯誤可以通過指定精度來避免。

NAN

typeof不能辨別數字和NAN,并且事實證明NAN不等同于它自己

function isNumber(value) {
    return typeof value === 'number' && isFinite(value);
}

偽數組

在JavaScript是沒有真正的數組的!在其它編程語言中,數組都是按照數字進行索引的,但是JavaScript中事實上并沒有數組,數組和對象事實上并沒有多大的區別,JavaScript提供了一種類數組特性的對象,它把數組下標轉換為字符串,用其作為屬性,屬性的檢查和更新的方式與對象一模一樣,除了有一個可以用整數作為屬性名的特性外。

//判斷是否為數組
function isArray(value) {
      return value &&
      typeof value === 'object' &&
      typeof value.length === 'number' &&
      typeof value.splice === 'function' &&
      !(value.propertyIsEnumerable('length'));
};

假值

在JavaScript中擁有一大堆假值,如下圖所示。undefined和NAN并不是常量,它們是全局變量,而且你可以改變它們的值

 JavaScript糟粕和雞肋

hasOwnProperty

大家都知道,hasOwnProperty方法被用途一個過濾器去避開for in語句,因為它只是一個方法,所以在任何對象中,它可能會被一個不同的函數甚至一個非函數的值所替換。

var another = {};
        var name;
        another.hasOwnProperty = null; //這里修改了hasOwnProperty方法為一個非函數值
        for (name in another) {
            if (another.hasOwnProperty(name)) {
                console.log(another[name]); //這里使用hasOwnProperty結果就報錯  TypeError: object is not a function
            }
        }

雞肋

==

詳情見我的另一篇文章 JS == 的轉換規則

with

大家都知道with改變作用域,在有些情況下是相當方便的,但帶來的性能問題卻是相當沉重的。建議最好不要使用with

eval

eval帶來的問題總結如下:

  • 使得代碼更加難以閱讀
  • 性能顯著降低
  • 不利于JSLint工具檢測問題
  • 降低了應用的安全性
  • </ul>

    類似于eval的還有1)Function構造器2)在setTimeout或setInterval函數中傳遞字符串參數

    像這樣的都盡量避免

    continue語句

    通過重構移除continue語句性能方面能得到顯著改善

    switch貫穿

    大家都知道在js的switch語句中在一個case條件可以貫穿到另一個case中,雖然這種特性是在某些場景下是非常有用的,但是它們也是非常危險的。

    缺少塊的語句

    建議即使只有一條語句,在if、while、do或for中還是用花括號把它們括起來

    ++ –

    當用++和–時,代碼往往變得過于緊密和隱晦,所以作為一條原則建議不要使用它們

    位操作符

    JavaScript沒有整數類型,只有雙精度的浮點數,因此位操作符將它們的數字運算先轉換成整數,接著執行運算然后再轉換回去,所以在JavaScript中,位操作符運算效率并不高,所以建議少使用它。

    類型的包裝對象

    JavaScript有一套類型的包裝對象。不要使用new Boolean、new Number或new String

    此外也請避免使用new Object和new Array,可使用{}和[]來代替

    new

    使用new時應謹慎,避免因為它而造成this的污染全局對象。

    void

    在JavaScript中,void是一個運算符,它接受一個運算數并返回undefined。 避免使用它。

    JavaScript中是沒有整型概念的,但利用好位操作符可以輕松處理,同時獲得效率上的提升。

    |0和~~是很好的一個例子,使用這兩者可以將浮點轉成整型且效率方面要比同類的parseInt,Math.round 要快。在處理像素及動畫位移等效果的時候會很有用。

    原文出處: YouYaInsist 的博客

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!