js幾個常被忽略的基礎知識點

array.slice(start, end)

參數start
數組片斷開始處的數組下標。若是是負數,它聲明從數組尾部開始算起的位置。 也就是說,-1指最後一個元素,-2指倒數第二個元素,以此類推。node

參數end
數組片斷結束處的後一個元素的數組下標。若是沒有指定這個參數 包含從start開始到數組結束的全部元素。若是這個參數是負數, 從數組尾部開始算起的元素。數組

返回值
一個新數組,包含從start到end(不包括該元素)指定的array元素。瀏覽器

描述
方法slice()將返回數組的一部分,或者說是一個子數組。返回的數組包含從start 開始到end之間的全部元素,可是不包括end所指的元素。若是沒有指定end,返回的數組包含從start開始到原數組結尾的全部元素。服務器

var a = [1,2,3,4,5];

a.slice(0,3);    // 返回 [1,2,3]

a.slice(3);      // 返回 [4,5]

a.slice(1,-1);   // 返回 [2,3,4]

注意:該方法並不修改數組。若是想刪除數組中的一段元素,應該使用方法Array.splice。app

使用 Array#slice 拷貝數組

var len = items.length;
var itemsCopy = [];
var i;

// bad
for (i = 0; i < len; i++) {
  itemsCopy[i] = items[i];
}

// good
itemsCopy = items.slice();

使用 Array#slice 將類數組對象轉換成數組。

var nodesArr = Array.prototype.slice.call(document.querySelectorAll("div"));
// "true" array of DIVs
// 獲得一個由 div 元素組成的「真正的」數組
 
var argsArr = Array.prototype.slice.call(arguments);
// changes arguments to "true" array
// 把 arguments 轉換成一個「真正的」數組

Array.prototype.sort

不只能夠對簡單類型的數組項進行排序,能夠經過屬性來排序對象。若是哪天服務器端發來一段 JSON 數據,並且其中的對象須要排序prototype

[
    { name: "Robin Van PurseStrings", age: 30 },
    { name: "Theo Walcott", age: 24 },
    { name: "Bacary Sagna", age: 28  }
].sort(function(obj1, obj2) {
    // 實現增序排列:前者的 age 小於後者
    return obj1.age - obj2.age;
});
    // Returns:  
    // [
    //    { name: "Theo Walcott", age: 24 },
    //    { name: "Bacary Sagna", age: 28  },
    //    { name: "Robin Van PurseStrings", age: 30 }
    // ]

用 length 屬性來截斷數組

傳對象只是傳引用,咱們常常會試圖 把一個數組清空,但實際上卻錯誤地建立了一個新數組。code

var myArray = yourArray = [1, 2, 3];

// 囧
myArray = []; // `yourArray` 仍然是 [1, 2, 3]
 
// 正確的方法是保持引用
myArray.length = 0; // `yourArray` 和 `myArray`(以及其它全部對這個數組的引用)都變成 [] 了

使用 push 來合併數組

使用 push 方法來合併數組:對象

var mergeTo = [4,5,6];
var mergeFrom = [7,8,9];
 
Array.prototype.push.apply(mergeTo, mergeFrom);
 
mergeTo; // is: [4, 5, 6, 7, 8, 9]

高效探測功能特性和對象屬性

不少時候咱們會像下面這樣來探測瀏覽器的某個特性:排序

if(navigator.geolocation) {
    // 在這裏乾點事情
}

固然這能夠正常工做,但它並不必定有很好的效率。由於這個對象探測方法會在瀏覽器中初始化資源。在過去,上面的代碼片段可能會在某些瀏覽器下致使內存泄露。更好、更快的方法是檢查對象是否包含某個鍵名:ip

if("geolocation" in navigator) {
    // 在這裏乾點事情
}

鍵名檢查十分簡單,並且能夠避免內存泄露。

數組的 indexOf

let arr = ['orange', '2016', '2016'];

arr.indexOf('orange'); //0
arr.indexOf('o'); //-1

arr.indexOf('2016'); //1
arr.indexOf(2016); //-1

arr.indexOf(‘orange') 輸出 0 由於 ‘orange' 是數組的第 0 個元素,匹配到並返回下標。
arr.indexOf(‘o') 輸出 -1 由於此方法不會在每個元素的基礎上再次執行 indexOf 匹配。
arr.indexOf(‘2016') 輸出 1 由於此方法從頭匹配直到匹配到時返回第一個數組元素的下表,而不是返回所有匹配的下標。
arr.indexOf(2016) 輸出 -1 注意:這裏不會作隱式類型轉換。

MDN上面的說明:

indexOf() compares searchElement to elements of the Array using
strict equality (the same method used by the === or triple-equals operator).

這裏用的是嚴格等於(===)。作相似判斷的時候多留意,數字不會轉成字符串,同理字符串也不會轉換成數字。

相關文章
相關標籤/搜索