1. 程式人生 > 其它 >面試官:陣列的哪些方法有副作用,哪些是沒有副作用的?

面試官:陣列的哪些方法有副作用,哪些是沒有副作用的?

技術標籤:jsjavascriptpythonjava索引

如題,筆者之前在面試去哪時還真被問到過,由於平時只是在用,沒有太注意哪些方法有無副作用,回答的略微有點尷尬,所以今天就來做個詳細的總結。

另外在工作中對陣列的應用也是非常多的,而且es6也新增了很多新的方法,這次也會找一些高頻的整理出來。

有副作用的(改變原陣列)

push()

push() 方法將一個或多個元素新增到陣列的末尾,並返回該陣列的新長度。

constarr=['1','2','3'];
constlength=arr.push('4');
console.log(length);
//4

console.log(arr);
//["1","2","3","4"]

shift()

方法從陣列中刪除第一個元素,並返回該元素。此方法更改陣列的長度。

constarr=[1,2,3];

constfirstElement=arr.shift();

console.log(arr);
//[2,3]

console.log(firstElement);
//1

unshift()

在陣列的首部新增一個或者多個元素,返回的是插入元素後陣列的長度

vararr=[1,2,3,4];
arr.unshift()//4如果沒有插入的值那麼返回的長度是當前陣列的原長度
vara1=[1,2,3,4];
a1.unshift(1,2,3)//7
a1//[1,2,3,1,2,3,4]

splice()

對陣列進行增、刪、改。此方法會改變原陣列。

//增
vararr=[1,2,3,4];
arr.splice(2,0,'插入')//返回的是空陣列[]
arr//[1,2,"插入",3,4]

//刪
vara1=[1,2,3,4];
a1.splice(2,1)//返回被刪除的元素[3]
a1//[1,2,4]//返回的是刪除後剩餘的陣列元素

//改
vara1=[1,2,3,4];
a1.splice(2,1,'改')//返回的是被替換刪除掉的元素[3]
a1//[1,2,"改",4]

pop()

從陣列中刪除最後一個元素,並返回該元素的值。此方法更改陣列的長度。

constarr=[1,2,3];
console.log(arr.pop());
//3

console.log(arr);
//[1,2]

reverse()

方法將陣列中元素的位置顛倒,並返回該陣列。該方法會改變原陣列。

constarr=['1','2','3'];
console.log(arr.reverse());
//["3","2","1"]

console.log(arr)
//["3","2","1"]

sort()

對陣列的元素進行排序,並返回陣列。預設排序順序是將元素轉換為字串,然後比較它們的 Unicode 碼。

constmonths=['March','Jan','Feb','Dec'];
months.sort();
console.log(months);
//["Dec","Feb","Jan","March"]

constarray1=[1,30,4,21,100000];
array1.sort();
console.log(array1);
//[1,100000,21,30,4]

fill()

用一個固定值填充一個數組中從起始索引到終止索引內的全部元素。不包括終止索引。

constarr=[1,2,3,4];

console.log(arr.fill(0,2,4));
//[1,2,0,0]

console.log(arr.fill(5,1));
//[1,5,5,5]

console.log(array1.fill(6));
//[6,6,6,6]//無beigin和end則全部填充

無副作用 (不改變原陣列)

concat()

用於合併兩個或多個數組。此方法不會更改現有陣列,而是返回一個新陣列。

constarray1=['a','b','c'];
constarray2=['d','e','f'];
constarray3=array1.concat(array2);

console.log(array3);
//["a","b","c","d","e","f"]

join()

該方法將一個數組(或一個類陣列物件)的所有元素連線成一個字串並返回這個字串。如果陣列只有一個專案,那麼將返回該專案而不使用分隔符。

constelements=['1','2','3'];

console.log(elements.join());
//"1,2,3"

console.log(elements.join(''));
//"123"

console.log(elements.join('-'));
//"1-2-3"

indexOf() , lastIndexOf()

indexOf 返回在陣列中可以找到一個給定元素的第一個索引,如果不存在,則返回-1。

lastIndexOf 返回指定元素在陣列中的最後一個的索引,如果不存在則返回 -1。從陣列的後面向前查詢。

//indexOf
constarr=['1','2','3'];

console.log(arr.indexOf('2'));
//1

console.log(arr.indexOf('0'));
//-1


//lastIndexOf

constarr=['1','2','3','1'];

console.log(arr.lastIndexOf('1'));
//3

console.log(arr.lastIndexOf('2'));
//1

slice()

返回擷取後的新陣列,擷取陣列中的一部分,從開始到結束,擷取原則是,包括開始索引不包括結束索引值.

第二個引數可選:不寫或大於陣列的 length,取將從開始索引到最後一個引數

leta=[1,2,3,4,5]
letb=a.slice(1,2)
b//2

leta=[1,2,3,4,5]
letb=a.slice(1,1)
b//undefined

leta=[1,2,3,4,5]
letb=a.slice(1)
b//[2,3,4,5]

entries()

返回一個新的Array Iterator物件,該物件包含陣列中每個索引的鍵/值對。

constarray1=['a','b','c'];

constiterator1=array1.entries();

console.log(iterator1.next().value);
//[0,"a"]

console.log(iterator1.next().value);
//[1,"b"]

keys()

返回一個包含陣列中每個索引的Array Iterator物件。

constarr=['a','b','c'];
constiterator=arr.keys();

for(constkeyofiterator){
console.log(key);
}

//0
//1
//2

values()

返回一個新的 Array Iterator 物件,該物件包含陣列每個索引的值

constarray1=['a','b','c'];
constiterator=array1.values();

for(constvalueofiterator){
console.log(value);
}

//"a"
//"b"
//"c"

every()

測試一個數組內的所有元素是否都能通過某個指定函式的測試。它返回一個布林值。

若收到一個空陣列,此方法在一切情況下都會返回 true。

constcheck=(currentValue)=>currentValue<40;

constarr=[1,30,39,29,10,13];

console.log(arr.every(check));

//true陣列元素都<40

filter()

建立一個新陣列, 返回符合條件的元素。

constarr=[1,2,3];

constresult=arr.filter(item=>item>1);//過濾方法,條件值長度>6

console.log(result);
//[2,3]

forEach()

對陣列的每個元素執行一次給定的函式,但傳入的回撥裡是可以更改原陣列的。當然不推薦這樣做。

constarray1=[{a:100}];

array1.forEach(element=>{
element.a=200//不推薦,此處應該是一個純函式
});

console.log(array1)
//[Object{a:200}]

includes()

用來判斷一個數組是否包含一個指定的值,根據情況,如果包含則返回 true,否則返回false。

onstarray1=[1,2,3];

console.log(array1.includes(2));
//true

some()

檢測陣列中是不是至少有1個元素通過了被提供的函式測試。它返回的是一個Boolean。

constarray=[1,2,3,4,5];

consteven=(element)=>element%2===0;//是否能整除2

console.log(array.some(even));
//true

reducer()

相當於一個累加器,第一個引數表示上一次累計的返回值,第二個引數表示當前元素值

constarr=[1,2,3,4];
constreducer=(sum,currentValue)=>sum+currentValue;

console.log(arr.reduce(reducer));
//10

console.log(arr.reduce(reducer,5));
//15

map()

返回一個新陣列,新陣列的結果是舊陣列中的每個元素是呼叫一次提供的函式後的返回值。

leta=[1,2,3,4,5]
letb=a.map(item=>item*2)

a//[1,2,3,3,5]
b//[2,4,6,8,10]

find() , findIndex()

find: 返回陣列中滿足提供的過濾函式的第一個元素的值。否則返回 undefined。

findIndex: 和find方法功能一致,但返回的是元素的索引

//find
constarr=[5,12,8,130,44];

constfound=arr.find(item=>item>10);

console.log(found);
//12


//findIndex
constarr=[5,12,8,130,44];
constfound=arr.findIndex(item=>item>10);
console.log(found);
//1

flat()

返回一個扁平化的新陣列,接收一個數組(這個陣列中的某些item本身也是一個數組),返回一個新的一維陣列(如果沒有特別指定depth引數的話返回一維陣列)。

constarr=["a",["b","c"],["d",["e","f"]]];
//.flat()接收一個可選的深度引數

constreuslt=arr.flat(2);
console.log(reuslt);

//["a","b","c","d","e","f"]

分享到此,希望對大家有所幫助 ^_^

點個『在看』支援下