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

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

相关文章
相关标签/搜索