1. 程式人生 > >12個非常有用的javascript技巧,必看!

12個非常有用的javascript技巧,必看!

login 他會 有時 throw 代碼 取數 屬性 nbsp 存在

提示:該文章是整理別人別人的文章,作者比較多,很難分辨原創作者是誰。

1)使用!!將變量轉換成布爾類型

  有時,我們需要檢查一些變量是否存在,或者它是否具有有效值,從而將他們的值視為true。對於這樣的檢查,你可以使用!!(雙重否定運算符),他能自動將任何類型的數據轉化為布爾值,只有0、null、“”、undefined或NaN才會返回false,其他的都會返回true。看一個簡單的例子:

function Account(cash){
    this.cash = cash;
    this.hasMoney = !!cash;
}
   var account = new Account(100.50);
   console.log(account.cash);        
//100.50 console.log(account.hasMoney); //true var emptyAccount = new Account(0); console.log(emptyAccount.cash); //0 console.log(emptyAccount.hasMoney); //false

2)使用+將變量轉化成數字

  這個轉化比較簡單,但它只適合數字字符串,不然就會返回NaN(Not a Number)。看例子:

function toNumber(strNumber){
    return +strNumber;
}
console.log(toNumber(
‘342‘)); //342
console.log(toNumber(‘324s‘)); //NaN
//也可以用於轉化Date,返回結果為時間戳
console.log(+new Date());

3)短路條件

  在編寫代碼中經常會遇到這樣的代碼:

  

if(conected){
    login();
}

  可以使用&&(and連接符)來縮短代碼,上面的代碼可以縮減為

  conected&&login();

  也可以使用這種方法來檢查對象中是否存在某些屬性或者方法

  user&&user.login();

4)使用||設置默認值

  在ES6中有默認參數這個功能。為了在舊版瀏覽器中模擬此功能,可使用||(or運算符),並把默認值作為他的第二個參數。如果第一個參數返回false,那麽第二個參數就會被作為默認值返回

 

function user(name,age){
    this.name = name||‘Olive Queen‘;
    this.age = age||27;
}

var user1 = new user();
console.log(user1.name);//Olive Queen
console.log(user1.age);//27

var user2 = new user(‘liming‘,25);
console.log(user2.name);//liming
console.log(user2.age);//25

5)在循環中緩存arr.length

  這個技巧非常簡單,並且在循環處理大數組時能夠避免對性能造成巨大的影響。例如for循環

var arr = [1,2,3,‘a‘,‘ds‘,4];
for(var i = 0;i<arr.length;i++){
    console.log(arr[i]);
}

對於小數組還好,較大數組的話每一次循環都會獲取arr.length,這會產生一定的延遲,為了避免這種情況,在for循環開始之前緩存arr.length

var arr = [1,2,3,‘a‘,‘ds‘,4];
var len = arr.length;
for(var i = 0;i<len;i++){
    console.log(arr[i]);
}

或者

var arr = [1,2,3,‘a‘,‘ds‘,4];
for(var i = 0,len = arr.length;i<len;i++){
    console.log(arr[i]);
}

6)檢查對象中的屬性

  當你需要檢查某些屬性是否存在的時候,避免運行未定義的函數或者屬性時,這個技巧就會非常的有用。解決瀏覽器兼容問題中也可以使用這個技巧。例如通過ID獲取元素的完美方法

if(‘querySelector‘ in document){
    document.querySelector(‘#id‘);
}else{
    document.getElementById(‘id‘);
}

7)獲取數組的最後一個元素

  Array。prototype.slice(begin,end)可以用來裁剪數組。但是如果沒有設置結束參數end的值的話,該函數會自動將end設置為數組長度值。如果將begin的數值設置為復制的話,就會從數組中獲取倒數的元素:

var arr = [1,2,3,4,5];
console.log(arr.slice(-1));//[6]
console.log(arr.slice(-2));//[5,6]
console.log(arr.slice(-3));//[4,5,6]

8)數組截斷

  這個技術可以鎖定數組的大小,這對於要刪除數組中固定數量的元素是非常有用的。

var arr = [1,2,3,4,5,6,7,8,9,10];

arr.length = 5;
console.log(arr);//[1,2,3,4,5]

arr.length = 7;
console.log(arr);//[1,2,3,4,5,undefined,undefined]

如果arr.length設置的數值大於當前數組長度,超過的元素會分配為undefined

9)替換數組元素

var str = ‘john john‘;
console.log(str.replace(/hn/,‘nan‘));//jonan john
console.log(str.replace(/hn/g,‘nan‘));//jonan jonan

這看似是在數組替換元素中增加了正則表達式中的內容,全局匹配g

10)合並數組

  一般需要合並數組,使用Array.concat()方法,字符串也可以看做是數組

var str1 = ‘hello‘;
var str2 = ‘world‘;
console.log(str1.concat(str2));//helloworld
var str3 = [1,2,3];
var str4 = [4,5,6];
console.log(str3.concat(str4));//[1,2,3,4,5,6]

但是該方法對於大數組來說並不合適,因為他會在內部新建一個數組並消耗大量的內存。原作者推薦使用Array.push.apply(arr1,arr2),但是在實踐後發現其返回的結果始終是最後數組的長度,而不是數組的各個元素;而且有博主曾經做過Array.concat與Array.push.apply之間性能的測試實驗。結果顯示Array.concat操作的數組長度沒有顯示,而Array.oush.apply操作的數組因瀏覽器不同而不同,一般不能超過十萬。

腳本之家有位朋友寫過一篇《關於JS數組追加數組采用push.apply的問題》,討論Array.push.apply的問題,最後采用forEach,不僅可以避免數組過大的問題,而且從性能考慮forEach也是最快的。

var arr = [1,2,3,4,5,6,7,8,9];
arr.forEach(function(a){
    console.log(a);
});

但是在IE中該方法不能正常執行,提示Array不支持此屬性或此方法,即IE的Array中沒有forEach方法。但是可以添加原型方法

    //Array.forEach implementation for IE support..  
    //https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach  
    if (!Array.prototype.forEach) {  
        Array.prototype.forEach = function(callback, thisArg) {  
            var T, k;  
            if (this == null) {  
                throw new TypeError(" this is null or not defined");  
            }  
            var O = Object(this);  
            var len = O.length >>> 0; // Hack to convert O.length to a UInt32  
            if ({}.toString.call(callback) != "[object Function]") {  
                throw new TypeError(callback + " is not a function");  
            }  
            if (thisArg) {  
                T = thisArg;  
            }  
            k = 0;  
            while (k < len) {  
                var kValue;  
                if (k in O) {  
                    kValue = O[k];  
                    callback.call(T, kValue, k, O);  
                }  
                k++;  
            }  
        };  
    }  

11)

12個非常有用的javascript技巧,必看!