数组

js中的slice方法

String.slice(start,end)

slice()返回一个子片段,对原先的string没有影响,与subString的区别是,还可以用负数当参数,相当于是length+start,length+end.

var s = "abcdefg";
s.slice(0,4)    // Returns "abcd"
s.slice(2,4)    // Returns "cd"
s.slice(4)      // Returns "efg"
s.slice(3,-1)   // Returns "def"
s.slice(3,-2)   // Returns "de"
s.slice(-3,-1)  // Should return "ef"; returns "abcdef" in IE 4

Array.slice(start,end)

返回从start开始到end的子数组,如果end这个参数没有被设置,则返回从start开始到最后的数组元素。

var a = [1,2,3,4,5];
a.slice(0,3);    // Returns [1,2,3]
a.slice(3);      // Returns [4,5]
a.slice(1,-1);   // Returns [2,3,4]
a.slice(-3,-2);  // Returns [3]; buggy in IE 4: returns [1,2,3]

除了正常用法,slice 经常用来将 array-like 对象转换为 true array。在一些框架中会经常有这种用法。

Array.prototype.slice.call(arguments);//将参数转换成真正的数组.

因为arguments不是真正的Array,虽然arguments有length属性,但是没有slice方法,所以呢,Array.prototype.slice()执行的时候,Array.prototype已经被call改成arguments了,因为满足slice执行的条件(有length属性).

涉及到的一道面试题

统计页面上所有的HTML标签,有多少种,每种出现了多少次,按照出现次数进行倒序

let nodeList = document.querySelectorAll("*") || [];
nodeList = Array.prototype.slice.call(nodeList);
nodeList = nodeList.map((e) => e.tagName);

let uniqueArr = [];
let frequenceObj = {};
for (let i = 0; i < nodeList.length; i++) {
  if (uniqueArr.indexOf(nodeList[i]) > -1) {
    frequenceObj[nodeList[i]]++;
  } else {
    let frequenceName = nodeList[i];
    uniqueArr.push(frequenceName);
    frequenceObj[frequenceName] = 1;
  }
}
// 根据得到的去重数组排序
let resultArr = [];
for (i in frequenceObj) {
  let obj = {
    name: i,
    frequence: frequenceObj[i]
  }
  resultArr.push(obj)
}
resultArr.sort((x, y) => y.frequence - x.frequence)
console.log(resultArr);

赞 赏