一文講清JS中for循環(huán)的所有用法
講一下for…of
for...of
是 JavaScript 的一種循環(huán)語法,用于遍歷可迭代對象 (如數(shù)組、字符串、Set、Map 等) 中的元素。它提供了一種簡潔的方式來遍歷集合中的元素,而無需使用傳統(tǒng)的索引迭代方式。
以下是 for...of
循環(huán)的基本語法:
for (variable of iterable) { // 在每次迭代中執(zhí)行的代碼 // 學(xué)習(xí)一下單詞 statement 語句 // outline 提綱;目錄 }
variable
:變量,用于存儲當(dāng)前迭代的值。在每次循環(huán)迭代時,將會自動賦值為可迭代對象中的當(dāng)前元素。iterable
:可迭代對象,即要遍歷的集合。它可以是數(shù)組、字符串、Set、Map 等實現(xiàn)了迭代器接口的對象。
在每次迭代時,for...of
語句會將 iterable
中的下一個元素賦值給 variable
,直到遍歷完所有元素為止。
以下是使用 for...of
循環(huán)遍歷數(shù)組的示例:
var colors = ['red', 'green', 'blue']; for (var color of colors) { console.log(color); }
在上述示例中,for...of
循環(huán)會依次遍歷數(shù)組 colors
中的每個元素,并將當(dāng)前元素賦值給變量 color
。然后,在循環(huán)體中,可以對 color
進行操作,比如打印它的值。
for...of
循環(huán)的優(yōu)點包括:
- 簡潔:無需處理索引或使用額外的計數(shù)器變量。
- 自動迭代:根據(jù)迭代對象的特性,它會自動迭代元素并賦值給變量。
- 適用于可迭代對象:可以用于遍歷各種可迭代對象,而不僅限于數(shù)組。
需要注意的是,for...of
循環(huán)不適用于普通對象(Plain Object),因為普通對象不是可迭代對象。若需要遍歷普通對象的屬性,可以使用 for...in
循環(huán)。
總結(jié):
for...of
是 JavaScript 中一種用于遍歷可迭代對象的循環(huán)語法。它提供了一種簡潔、直觀的方式來遍歷集合中的元素,而無需使用索引。它適用于數(shù)組、字符串、Set、Map 等實現(xiàn)了迭代器接口的對象。
可迭代是什么意思
可迭代對象(iterable)是指實現(xiàn)了迭代器協(xié)議的對象,即實現(xiàn)了 Symbol.iterator
方法的對象。迭代器協(xié)議定義了一種標準的方式,使得對象可以被迭代,也就是說可以用 for...of
循環(huán)遍歷。
一些內(nèi)置對象,例如 Array
、String
、Map
和 Set
等都是可迭代對象,因為它們都實現(xiàn)了 Symbol.iterator
方法。同時,我們也可以自己實現(xiàn)一個可迭代對象,只需要在對象上定義一個 Symbol.iterator
方法,該方法返回一個迭代器(iterator)對象,該對象必須實現(xiàn)一個 next()
方法,以便迭代器可以按順序訪問該對象的所有元素。
講一下for…in
for...in
是 JavaScript 的一種循環(huán)語法,用于遍歷對象的可枚舉屬性 (Enumerable===true)。它提供了一種遍歷對象屬性的簡潔方式,可以用于遍歷普通對象和數(shù)組等。
以下是 for...in
循環(huán)的基本語法:
for (variable in object) { // 在每次迭代中執(zhí)行的代碼 }
variable
:變量,用于存儲當(dāng)前迭代的屬性名。在每次循環(huán)迭代時,將會自動賦值為對象的一個可枚舉屬性名。object
:對象,即要遍歷的對象。
以下是使用 for...in
循環(huán)遍歷對象的示例:
var person = { name: 'Alice', age: 30, profession: 'Engineer' }; for (var key in person) { console.log(key + ': ' + person[key]); }
在上述示例中,for...in
循環(huán)會遍歷對象 person
中的每個可枚舉屬性,并將當(dāng)前屬性名賦值給變量 key
。然后,在循環(huán)體中,可以通過 person[key]
來訪問該屬性的值。
需要注意的是,for...in
循環(huán)遍歷的是對象的可枚舉屬性,包括對象自身的屬性以及從原型鏈繼承的屬性。若只需遍歷對象自身的屬性而不包括繼承的屬性,可以使用 hasOwnProperty()
方法進行過濾:
var person = new Object({ name: "Alice", age: 30, profession: "Engineer", }); Object.prototype.height = 185; // 定義在原型鏈上 for (var key in person) { if (person.hasOwnProperty(key)) { // 這里如果沒有hasOwnProperty判斷,會打印height鍵值 console.log(key + ": " + person[key]); } }
此外,for...in
循環(huán)也可用于遍歷數(shù)組的索引或?qū)ο髮傩缘膭討B(tài)訪問。
總結(jié):
for...in
是 JavaScript 中一種用于遍歷對象可枚舉屬性的循環(huán)語法。它提供了一種簡潔的方式來遍歷對象的屬性,可以用于遍歷普通對象和數(shù)組等。需要注意的是,它會遍歷對象自身的屬性以及從原型鏈繼承的屬性。
for...of和for...in的區(qū)別
for...of
循環(huán):遍歷的是可迭代對象(iterable),例如數(shù)組、字符串、Set、Map 等。
迭代的是對象的值而不是鍵。
遍歷順序是按照對象的迭代順序進行的,如數(shù)組的索引順序或字符串的字符順序。
不支持遍歷普通對象(plain objects),因為普通對象不是可迭代對象。
var arr = [1, 2, 3]; for (var value of arr) { console.log(value); } //輸出結(jié)果: 1 2 3
for...in
循環(huán):
遍歷的是對象的可枚舉屬性。
迭代的是對象的鍵而不是值。
遍歷順序是不確定的,可能不會按照對象屬性的順序進行遍歷。
可以遍歷普通對象的可枚舉屬性,也可以遍歷數(shù)組等對象的非索引屬性。
var obj = { a: 1, b: 2, c: 3 }; for (var key in obj) { console.log(key + ': ' + obj[key]); } //輸出結(jié)果: a: 1 b: 2 c: 3
講一下forEach
forEach()
是 JavaScript 數(shù)組對象的一個內(nèi)置方法,用于遍歷數(shù)組中的每個元素,并對每個元素執(zhí)行回調(diào)函數(shù)。(在原數(shù)組上進行操作且沒有返回值)
正常情況下,應(yīng)該避免在 forEach()
方法中修改原始數(shù)組的元素,因為它的主要目的是遍歷數(shù)組而不是修改數(shù)組。如果需要對每個元素進行轉(zhuǎn)換或操作,并生成一個新的數(shù)組,可以使用 map()
方法。
forEach()
方法接受一個回調(diào)函數(shù)作為參數(shù),該回調(diào)函數(shù)會在數(shù)組的每個元素上被調(diào)用?;卣{(diào)函數(shù)會接收三個參數(shù):當(dāng)前元素的值、當(dāng)前元素的索引和被遍歷的數(shù)組本身。
以下是 forEach()
方法的基本語法:
array.forEach(callback(currentValue, index, array), thisArg)
- callback:回調(diào)函數(shù),用于對數(shù)組的每個元素進行操作。它可以接受三個參數(shù):
currentValue
:當(dāng)前遍歷到的元素的值。index
:當(dāng)前遍歷到的元素的索引。array
(可選):原始數(shù)組。
thisArg
(可選):回調(diào)函數(shù)中的this
值。
下面是一個示例,展示了如何使用 forEach()
方法對數(shù)組中的每個元素進行打印操作:
var numbers = [1, 2, 3, 4, 5]; numbers.forEach(function(element, index) { console.log(`當(dāng)前元素是 ${element},索引是 ${index}`); }); // 盡管回調(diào)函數(shù)在代碼中定義了三個參數(shù),但只使用了前兩個參數(shù)。第三個參數(shù) arr 是可選的,可以選擇在回調(diào)函數(shù)的實現(xiàn)中忽略它。
在上述示例中,回調(diào)函數(shù)會在數(shù)組 numbers
的每個元素上被調(diào)用。它會打印出當(dāng)前元素的值和索引。循環(huán)會依次遍歷數(shù)組中的每個元素,對每個元素執(zhí)行回調(diào)函數(shù)。
forEach()
方法遍歷數(shù)組時,會自動跳過稀疏數(shù)組中的空位(undefined)。它會按照數(shù)組元素的順序依次執(zhí)行回調(diào)函數(shù),直到遍歷完所有元素為止。
需要注意的是,forEach()
方法沒有返回值,它只是對每個元素執(zhí)行回調(diào)函數(shù)。如果需要生成一個新的數(shù)組,可以使用 map()
方法。
總結(jié):
forEach()
方法用于遍歷數(shù)組中的每個元素,并對每個元素執(zhí)行回調(diào)函數(shù)。它沒有返回值,只是對原數(shù)組元素進行操作。通過回調(diào)函數(shù),可以訪問當(dāng)前元素的值和索引,以及原始數(shù)組。
講一下map()
在 JavaScript 中,map()
是數(shù)組對象的一個內(nèi)置方法,用于對數(shù)組中的每個元素進行操作,并返回一個新的數(shù)組。它會遍歷原始數(shù)組中的每個元素,對每個元素應(yīng)用回調(diào)函數(shù),并將回調(diào)函數(shù)的返回值組成一個新的數(shù)組。(不會修改原數(shù)組內(nèi)容)
map()
方法接受一個回調(diào)函數(shù)作為參數(shù),該回調(diào)函數(shù)會在數(shù)組的每個元素上被調(diào)用,并返回新數(shù)組中的對應(yīng)元素。
以下是 map()
方法的基本語法:
array.map(callback(element, index, array), thisArg)
- callback:回調(diào)函數(shù),用于對數(shù)組的每個元素進行操作。它可以接受三個參數(shù):
element
:當(dāng)前遍歷到的元素。index
:當(dāng)前遍歷到的元素的索引。array
:原始數(shù)組。
thisArg
(可選):回調(diào)函數(shù)中的this
值。
下面是一個示例,展示了如何使用 map()
方法將數(shù)組中的每個元素乘以 2,并生成一個新的數(shù)組:
var numbers = [1, 2, 3, 4, 5]; var doubledNumbers = numbers.map(function(element) { return element * 2; }); console.log(doubledNumbers); // 輸出:[2, 4, 6, 8, 10]
在上述示例中,回調(diào)函數(shù)將每個元素乘以 2,并將結(jié)果作為新數(shù)組中的對應(yīng)元素。因此,doubledNumbers
數(shù)組包含了原始數(shù)組中的每個元素乘以 2 的結(jié)果。
需要注意的是,map()
方法不會修改原始數(shù)組,而是返回一個新的數(shù)組。因此,它是一種純函數(shù),不會產(chǎn)生副作用。
另外,如果數(shù)組中的元素是對象,map()
方法僅對對象的引用進行操作,不會進行深層復(fù)制。所以在對對象數(shù)組進行 map()
操作時,需要注意對原始對象的引用和副本的處理。
總結(jié):
map()
方法是數(shù)組的內(nèi)置方法,用于對數(shù)組中的每個元素進行操作,并返回一個新的數(shù)組。它通過應(yīng)用回調(diào)函數(shù)對每個元素進行轉(zhuǎn)換來生成新的數(shù)組。
map()跟foreach有什么區(qū)別
- map()
- 返回一個回調(diào)函數(shù)處理后的新數(shù)組
- 對原數(shù)組沒有影響
- 目的:處理數(shù)組數(shù)據(jù)
- forEach
- 沒有返回值,不會生成新數(shù)組
- 可能對原數(shù)組有影響
- 目的:遍歷數(shù)組
講一下every()
Array.prototype.every()
方法,它可以用于檢查數(shù)組中的所有元素是否滿足特定條件。
every()
方法接受一個回調(diào)函數(shù)作為參數(shù),該回調(diào)函數(shù)會在數(shù)組的每個元素上被調(diào)用,并根據(jù)返回值判斷是否繼續(xù)遍歷數(shù)組。如果回調(diào)函數(shù)對于每個元素都返回 true
,則 every()
方法返回 true
。如果回調(diào)函數(shù)對于任何一個元素返回 false
,則 every()
方法立即返回 false
,不再繼續(xù)遍歷剩余的元素。
以下是 every()
方法的基本語法:
array.every(callback(element, index, array), thisArg)
callback
:回調(diào)函數(shù),用于對數(shù)組的每個元素進行操作。它可以接受三個參數(shù):element
:當(dāng)前遍歷到的元素。index
:當(dāng)前遍歷到的元素的索引。array
:原始數(shù)組。
thisArg
(可選):回調(diào)函數(shù)中的this
值。
下面是一個示例,展示了如何使用 every()
方法檢查數(shù)組中的所有元素是否為偶數(shù):
var numbers = [2, 4, 6, 8, 10]; var allEven = numbers.every(function(element) { return element % 2 === 0; }); console.log(allEven); // 輸出:true
在上述示例中,回調(diào)函數(shù)檢查每個元素是否為偶數(shù)。由于數(shù)組中的所有元素都是偶數(shù),所以 every()
方法返回 true
。
需要注意的是,如果數(shù)組為空,every()
方法將始終返回 true
,因為沒有元素不滿足條件。此外,every()
方法只要找到一個不滿足條件的元素就會立即停止遍歷剩余的元素。
講一下reduce()
reduce()
是數(shù)組方法之一,用于對數(shù)組的元素進行累積計算。它接受一個回調(diào)函數(shù)作為參數(shù),并可以傳遞一個初始值。這個回調(diào)函數(shù)會被應(yīng)用到數(shù)組的每個元素上,從左到右進行迭代,將前一個回調(diào)函數(shù)的返回值作為下一個回調(diào)函數(shù)的輸入,最終得到一個累積的結(jié)果。
reduce()
方法的語法如下:
array.reduce(callback, initialValue)
callback
是一個回調(diào)函數(shù),它可以接受四個參數(shù):accumulator
:累積器,用于保存計算的中間結(jié)果。currentValue
:當(dāng)前元素的值。currentIndex
:當(dāng)前元素的索引(可選)。array
:被迭代的數(shù)組(可選)。 回調(diào)函數(shù)應(yīng)該返回一個新的累積值,它將作為下一次迭代的accumulator
值。
initialValue
是可選的,用于指定累積的初始值。如果沒有提供初始值,則將使用數(shù)組的第一個元素作為初始值,并從第二個元素開始進行迭代。
reduce()
方法的使用示例:
const array = [1, 2, 3, 4, 5]; const sum = array.reduce((accumulator, currentValue) => { return accumulator + currentValue; }, 0); // 這里傳入的實參0是可選參數(shù)initialValue,用于指定累積的初始值 // 如果沒有提供初始值,則將使用數(shù)組的第一個元素作為初始值,并從第二個元素開始進行迭代。 // 所以不寫也是OK的,結(jié)果相同 console.log(sum); // 輸出 15
在上述示例中,reduce()
方法對數(shù)組 array
中的元素進行累加求和,初始值設(shè)置為 0
?;卣{(diào)函數(shù)接受兩個參數(shù),accumulator
為累加器,currentValue
為當(dāng)前元素的值。每次迭代時,回調(diào)函數(shù)將當(dāng)前元素的值加到累加器上,并返回新的累加值。最終得到的結(jié)果是數(shù)組元素的總和,即 15
。
講一下set
在 JavaScript 中,Set
是一種集合數(shù)據(jù)結(jié)構(gòu),用于存儲唯一的值,即集合中的每個元素都是唯一的,不會重復(fù)。它是 ES6(ECMAScript 2015)引入的一種數(shù)據(jù)結(jié)構(gòu),提供了一組方法用于管理集合中的元素。
以下是 Set
的基本特點和用法:
- 存儲唯一值:
Set
中的元素是唯一的,不會重復(fù)。如果嘗試向集合中添加重復(fù)的值,將被忽略。 - 任意類型的值:
Set
可以存儲任意類型的值,包括原始類型(如數(shù)字、字符串、布爾值)、對象、函數(shù)等。 - 迭代器:
Set
是可迭代的,可以使用for...of
循環(huán)或forEach()
方法遍歷集合中的元素。 - 添加和刪除元素:
- 添加元素:使用
add(value)
方法向集合中添加新元素。 - 刪除元素:使用
delete(value)
方法從集合中刪除指定的元素。 - 清空集合:使用
clear()
方法清空集合中的所有元素。
- 添加元素:使用
- 判斷元素是否存在:
- 使用
has(value)
方法可以檢查集合中是否存在指定的元素。返回值為布爾類型。
- 使用
下面是一個使用 Set
的示例:
var set = new Set(); set.add(1); // 添加元素 set.add(2); set.add(3); set.add(2); // 重復(fù)的元素將被忽略 console.log(set.size); // 輸出:3 set.delete(2); // 刪除元素 console.log(set.size); // 輸出:2 console.log(set.has(3)); // 輸出:true set.forEach(function(value) { console.log(value); // 依次輸出:1, 3 });
需要注意的是,Set
中的值是根據(jù)嚴格相等性(===
)來進行比較的,因此對于對象等引用類型的值,判斷是否相等需要引用相同的對象。
總結(jié):Set
是一種集合數(shù)據(jù)結(jié)構(gòu),用于存儲唯一的值。它提供了添加、刪除和判斷元素是否存在的方法,以及迭代集合中的元素。Set
在需要存儲唯一值且不關(guān)心順序的情況下非常有用,可以幫助我們處理集合數(shù)據(jù)。
js中set會把元素按大小進行排序嗎
在 JavaScript 的 Set
中,元素的順序是根據(jù)插入順序確定的,而不是按照大小進行排序。當(dāng)你向 Set
添加元素時,它們將按照添加的順序排列。
Set
的迭代順序與元素的插入順序相同。這意味著當(dāng)你使用 for...of
循環(huán)或 forEach()
方法迭代 Set
時,元素的順序?qū)⑴c添加它們的順序保持一致。
以下是一個示例:
var set = new Set(); set.add(3); set.add(1); set.add(2); set.forEach(function(value) { console.log(value); });
輸出的順序?qū)⑹?nbsp;3, 1, 2
,與添加元素的順序一致。
如果你需要按照某種特定順序?qū)υ剡M行排序,你可以將 Set
轉(zhuǎn)換為數(shù)組,然后使用數(shù)組的排序方法對元素進行排序。例如:
var set = new Set(); set.add(3); set.add(1); set.add(2); var sortedArray = Array.from(set).sort(); console.log(sortedArray); // 輸出: [1, 2, 3]
在上述示例中,首先使用 Array.from()
方法將 Set
轉(zhuǎn)換為數(shù)組,然后使用數(shù)組的 sort()
方法對元素進行排序。這樣,你可以獲得一個按照元素大小排序的數(shù)組。
總結(jié):
Set
不會根據(jù)元素的大小進行排序,而是根據(jù)插入順序進行排列。如果你需要對元素進行排序,可以將Set
轉(zhuǎn)換為數(shù)組,然后使用數(shù)組的排序方法。
#include <iostream> #include <set> using namespace std; int main(){ set<int> s; s.insert(3); s.insert(1); s.insert(2); for(set<int>::iterator i=s.begin();i!=s.end();i++){ cout<<*i<<" "; // 結(jié)果:1 2 3 } // 小結(jié):c++的set容器會對插入的元素值的大小進行排序 // 而JS則是按照插入的順序進行排序 return 0; }
以上就是一文講清JS中for循環(huán)的所有用法的詳細內(nèi)容,更多關(guān)于JS中for循環(huán)用法的資料請關(guān)注腳本之家其它相關(guān)文章!
- JS面試題之forEach能否跳出循環(huán)詳解
- 在JavaScript中使用for循環(huán)的方法
- 詳解如何在JavaScript中使用for循環(huán)
- javascript中for...of和for..in循環(huán)的區(qū)別
- 一文帶你搞懂JS中六種For循環(huán)的使用
- JS中for循環(huán)的四種寫法示例(入門級)
- JS關(guān)于for循環(huán)中使用setTimeout的四種解決方案
- JavaScript中的for循環(huán)與雙重for循環(huán)詳解
- 經(jīng)典面試題之JavaScript?for循環(huán)(var?let)
相關(guān)文章
網(wǎng)易JS面試題與Javascript詞法作用域說明
Javascript函數(shù)在定義它們的作用域里運行,而不是在執(zhí)行它們的作用域里運行。2010-11-11