1

array.slice(start, end)

参数start
数组片段开始处的数组下标。如果是负数,它声明从数组尾部开始算起的位置。 也就是说,-1指最后一个元素,-2指倒数第二个元素,以此类推。

参数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。

使用 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 数据,而且其中的对象需要排序

[
    { 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 属性来截断数组

传对象只是传引用,我们经常会试图 把一个数组清空,但实际上却错误地创建了一个新数组。

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) {
    // 在这里干点事情
}

当然这可以正常工作,但它并不一定有很好的效率。因为这个对象探测方法会在浏览器中初始化资源。在过去,上面的代码片断可能会在某些浏览器下导致内存泄露。更好、更快的方法是检查对象是否包含某个键名:

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).

这里用的是严格等于(===)。做类似判断的时候多留意,数字不会转成字符串,同理字符串也不会转换成数字。


mydef
129 声望9 粉丝

路漫漫,好好学习,天天向上