let args = Array.from(arguments);
複製代碼
會改變原數組數組
不會改變原數組bash
var newArr = arr1.concat(arr2,arr3...)
返回連接後的新數組//forEach 不會改變原數組 返回undefined 不容許中途break
let arr = [1,2,3,4,5];
arr.forEach(function (val,index) { //若是有第三個參數,此參數爲該數組
console.log(val,index);
})
//
Array.prototype.myForEach = function(func){
for(let i = 0; i < this.length; i++){
func(this[i],i);
// return ;
}
}
複製代碼
var arr = [2,3,4,-1];
var noZero = arr.every(function(val,index,arr){
return val !== 0;
})
複製代碼
var arr = [1,2,3,-1];
var negative = arr.some(function(val,index,arr){
return val < 0;
})
複製代碼
// filter 篩選 返回新的數組
var arr = [1,2,3,4,5];
var newArr = arr.filter(function (val,index) {
return val >= 2;
})
console.log(newArr);
Array.prototype.myFilter = function (func) {
let len = this.length,
newArr = [];
for(let i = 0;i < len; i++){
if(func(this[i],i))
newArr.push(this[i]);
}
return newArr;
}
var myArr = arr.myFilter(function(val,index){
return val > 2;
})
console.log(myArr);
複製代碼
var person = [{
name:'a',
age:17,
},
{
name:'b',
age:18,
},
{
name:'c',
age:19,
}];
var findAdult = person.find(function(val,item){
return val.age >= 18;
});
//findAdult : {name: "b", age: 18}
複製代碼
var person = [{
name:'a',
age:17,
},
{
name:'b',
age:18,
},
{
name:'c',
age:19,
}];
var findAdult = person.findIndex(function(val,item){
return val.age >= 18;
});
//findAdult : 1
複製代碼
//map返回在原數組基礎上修改後的數組
var arr = [1,2,3,4,5];
var newArr = arr.map(function (val,index) {
return val*2;
})
console.log(newArr);
Array.prototype.myMap = function (func) {
let len = this.length,
newArr = [];
for(let i = 0; i < len; i++){
newArr.push(func(this[i],i));//這裏須要deepclone!!!!
}
return newArr;
}
var myArr = arr.myMap(function(val, index){
return val*2;
})
console.log(myArr);
複製代碼
//reduce 從左向右迭代整個數組 作累加器 只會返回最後一個值
var arr = [1,2,3,4,5];
arr.reduce(function (preValue, val, index) { //preVal 上一次執行函數return 的值
console.log(preValue);
console.log(index+":"+val);
return val;
})//初始值,在第一次執行函數時preVal的值,若是不傳默認值,preValue會從數組的第一位開始,val從第二位開始
var sum = arr.reduce(function (preVal, val, index) {
return preVal + val;
})
console.log(sum);
Array.prototype.myReduce = function(func,init){
var preVal = init,k = 0;
if(init === undefined){
preVal = this[0];
k = 1;
}
for(k; k < this.length;k++){
preVal = func(preVal,this[k],k);
}
return preVal;
}
var mySum = arr.myReduce(function(preVal, val, index){
return preVal + val;
});
console.log(mySum);
複製代碼
var arr = [1,2,3,4,5];
var sum = arr.reduceRight(function (preVal, val, index) {
console.log(index);
return preVal + val;
},0);
console.log(sum);
Array.prototype.myReduceRight = function(func,init){
var preVal = init,k = this.length-1;
if(init === undefined){
preVal = this[k];
k--;
}
for(k; k >= 0; k--){
preVal = preVal = func(preVal,this[k],k);
}
return preVal;
}
var mySum = arr.myReduceRight(function(preVal ,val,index) {
console.log(index);
return preVal + val;
},0);
console.log(mySum);
複製代碼
遍歷數組一般使用for循環,ES5的話也可使用forEach,ES5具備遍歷數組功能的還有map、filter、some、every、reduce、reduceRight等,只不過他們的返回結果不同。可是使用foreach遍歷數組的話,使用break不能中斷循環,使用return也不能返回到外層函數。函數
Array.prototype.method=function(){
console.log(this.length);
}
var myArray=[1,2,4,5,6,7]
myArray.name="數組"
for (var index in myArray) {
console.log(myArray[index]);
}
複製代碼
使用for in 也能夠遍歷數組,可是會存在如下問題: 1.index索引爲字符串型數字,不能直接進行幾何運算ui
2.遍歷順序有可能不是按照實際數組的內部順序this
3.使用for in會遍歷數組全部的可枚舉屬性,包括原型。例如上慄的原型方法method和name屬性spa
因此for in更適合遍歷對象,不要使用for in遍歷數組。prototype
那麼除了使用for循環,如何更簡單的正確的遍歷數組達到咱們的指望呢(即不遍歷method和name),ES6中的for of更勝一籌.code
Array.prototype.method=function(){
console.log(this.length);
}
var myArray=[1,2,4,5,6,7]
myArray.name="數組";
for (var value of myArray) {
console.log(value);
}
複製代碼
記住,for in遍歷的是數組的索引(即鍵名),而for of遍歷的是數組元素值。對象
for of遍歷的只是數組內的元素,而不包括數組的原型屬性method和索引name排序
遍歷對象 一般用for in來遍歷對象的鍵名
Object.prototype.method=function(){
console.log(this);
}
var myObject={
a:1,
b:2,
c:3
}
for (var key in myObject) {
console.log(key);
}
複製代碼
for in 能夠遍歷到myObject的原型方法method,若是不想遍歷原型方法和屬性的話,能夠在循環內部判斷一下,hasOwnPropery方法能夠判斷某屬性是不是該對象的實例屬性
for (var key in myObject) {
if(myObject.hasOwnProperty(key)){
console.log(key);
}
}
複製代碼
一樣能夠經過ES5的Object.keys(myObject)獲取對象的實例屬性組成的數組,不包括原型方法和屬性。
Object.prototype.method=function(){
console.log(this);
}
var myObject={
a:1,
b:2,
c:3
}
Object.keys(myObject).forEach(function(key,index){  
console.log(key,myObject[key])
})
複製代碼