for...in:
for...in語句以任意順序遍歷一個對象的可枚舉屬性。對于每個不同的屬性,語句都會被執行。
語法:
for (variable in object) {...}
variable- 在每次迭代時,將不同的屬性名分配給變量。
object- 被迭代枚舉其屬性的對象
-
描述
for...in循環只遍歷可枚舉屬性。像Array和Object使用內置構造函數所創建的對象都會繼承自Object.prototype和String.prototype的不可枚舉屬性,例如String的indexOf()方法或Object的toString()方法。循環將遍歷對象本身的所有可枚舉屬性,以及對象從其構造函數原型中繼承的屬性(更接近原型鏈中對象的屬性覆蓋原型屬性)。刪除,添加或者修改屬性
for...in循環以任意序迭代一個對象的屬性(請參閱delete運算符,了解為什么不能依賴于迭代的表面有序性,至少在跨瀏覽器設置中)。如果一個屬性在一次迭代中被修改,在稍后被訪問,其在循環中的值是其在稍后時間的值。一個在被訪問之前已經被刪除的屬性將不會在之后被訪問。在迭代進行時被添加到對象的屬性,可能在之后的迭代被訪問,也可能被忽略。通常,在迭代過程中最好不要在對象上進行添加、修改或者刪除屬性的操作,除非是對當前正在被訪問的屬性。這里并不保證是否一個被添加的屬性在迭代過程中會被訪問到,不保證一個修改后的屬性(除非是正在被訪問的)會在修改前或者修改后被訪問,不保證一個被刪除的屬性將會在它被刪除之前被訪問。注意:
for...in不應該用于迭代一個Array,其中索引順序很重要。數組索引只是具有整數名稱的枚舉屬性,并且與通用對象屬性相同。不能保證
for ... in將以任何特定的順序返回索引。for ... in循環語句將返回所有可枚舉屬性,包括非整數類型的名稱和繼承的那些。因為迭代的順序是依賴于執行環境的,所以數組遍歷不一定按次序訪問元素。因此當迭代訪問順序很重要的數組時,最好用整數索引去進行
for循環(或者使用Array.prototype.forEach()或for...of循環)。例如:
<!DOCTYPE html>
<html>
<body><p>點擊按鈕循環對象屬性。</p>
<button onclick="myFunction()">點我</button>
<p id="demo"></p>
<script>
function myFunction() {
var person = {fname:"John", lname:"Doe", age:25};
var text = "";
var x;
for (x in person) {text += person[x] + " ";
}
document.getElementById("demo").innerHTML = text;
}
</script></body>
</html>for....of:
for...of語句在可迭代對象(包括Array,Map,Set,String,TypedArray,arguments 對象等等)上創建一個迭代循環,調用自定義迭代鉤子,并為每個不同屬性的值執行語句。語法
for (variable of iterable) { //statements }variable在每次迭代中,將不同屬性的值分配給變量。iterable被迭代枚舉其屬性的對象。- 例如:
function* foo(){
yield 1;
yield 2;
}for (let o of foo()) {
console.log(o);
// expected output: 1break; // closes iterator, triggers return
}for...of與for...in的區別無論是
for...in還是for...of語句都是迭代一些東西。它們之間的主要區別在于它們的迭代方式。for...of語句遍歷可迭代對象定義要迭代的數據。for each....in:
使用一個變量迭代一個對象的所有屬性值,對于每一個屬性值,有一個指定的語句塊被執行.
作為ECMA-357(E4X)標準的一部分,for each...in語句已被廢棄,E4X中的大部分特性已被刪除,但考慮到向后兼容,for each...in只會被禁用而不會被刪除,可以使用ES6中新的for...of語句來代替.(bug 791343.)
for each...in是 ECMA-357 (E4X) 標準的一部分, 大部分非Mozilla瀏覽器都沒有實現該標準, E4X并不是 ECMAScript 標準的一部分.語法
for each (variable in object) { statement }variable- 用來遍歷屬性值的變量,前面的
var關鍵字是可選的.該變量是函數的局部變量而不是語句塊的局部變量.
object- 該對象的屬性值會被遍歷.
statement- 遍歷屬性值時執行的語句. 如果想要執行多條語句, 請用(
{ ... }) 將多條語句括住.
描述
一些對象的內置屬性是無法被遍歷到的,包括所有的內置方法,例如String對象的
indexOf方法.不過,大部分的用戶自定義屬性都是可遍歷的.警告:永遠不要使用for each...in語句遍歷數組,僅用來遍歷常規對象。
(以上內容均來源于網絡摘抄)
浙公網安備 33010602011771號