最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS中for...in?和?for...of?的區(qū)別解析

 更新時間:2024年03月27日 14:34:55   作者:fighting?~  
for?…?in?用于迭代對象的可枚舉字符串屬性,包括自身屬性和繼承的屬性,但不會遍歷對象的原型鏈上的?非可枚舉屬性,以及對象的方法,這篇文章主要介紹了JS中for...in?和?for...of?的區(qū)別,需要的朋友可以參考下

1. 迭代的對象不同

  • for … in 用于迭代對象的可枚舉字符串屬性,包括自身屬性繼承的屬性,但不會遍歷對象的原型鏈上的 非可枚舉屬性,以及對象的方法。

從內(nèi)置構(gòu)造函數(shù)(如 Array 和 Object)創(chuàng)建的對象會從 Array.prototype 和 Object.prototype 繼承不可枚舉屬性,例如 Array 的 indexOf() 方法或 Object 的 toString() 方法,它們在 for…in 循環(huán)中不會被訪問到。

  • for … of 用于迭代可迭代對象定義的要進行迭代的值??傻鷮ο?包括 數(shù)組、字符串、Set、Map等,還包括 arguments 對象。它遍歷的是可迭代對象的迭代器(Iterator)返回的值或鍵值對,而不能直接用于普通的對象。

當(dāng) for…of 循環(huán)迭代一個可迭代對象時,它首先調(diào)用可迭代對象的 @@iterator 方法,該方法返回一個迭代器,然后重復(fù)調(diào)用生成器的 next() 方法,以生成要分配給 每次循環(huán)迭代的 可迭代對象 的值的序列。

注意: 每次迭代都會創(chuàng)建一個新的變量。在循環(huán)體內(nèi)部重新賦值變量不會影響可迭代對象的原始值。

要成為可迭代對象,必須要有一個迭代器 @@iterator方法,也就是說這個對象必須有一個鍵為@@iterator的屬性,通過常量 Symbol.iterator 訪問這個屬性,并返回一個迭代器對象

迭代器對象包含一個 next() 方法,無參數(shù)或者接受一個參數(shù)的函數(shù),并返回符合 IteratorResult 接口的對象。
next() 方法會返回一個具有 valuedone 屬性的對象。

  • value 表示當(dāng)前迭代的值。如果迭代器已經(jīng)到達末尾,那么 value 的值通常為 undefined,但這并不是必然的,具體取決于迭代器的實現(xiàn)。
  • done 是一個布爾值,表示迭代是否已完成。迭代器是否已完成遍歷。當(dāng)遍歷結(jié)束時,done 為 true,否則為 false。

實際上,兩者都不是嚴格要求的;如果返回沒有任何屬性的對象,則實際上等價于 { done: false, value: undefined }。

const obj = {
  a: 1,
  b: { h:123 },
};
//定義在自身的屬性
Object.defineProperty(obj, 'c', {
  value: 3,
});
//定義在自身的屬性
Object.defineProperty(obj, 'd', {
  value: 4,
  enumerable: true,//是否可枚舉,默認false不可枚舉
});
//定義在原型上的屬性
Object.prototype.e=5;
for (let key in obj) {
  console.log(key); // 輸出 'a' 、 'b'、 'd'、'e',但不會輸出 'c'、'h'
}
console.log(Object.keys(obj)); // 輸出 ['a', 'b','d'],不包括 'c'、'e'、'h'
console.log(Object.getOwnPropertyNames(obj)); // 輸出 ['a', 'b', 'c','d'],包括 'c', 但不包括'e'、'h'
擴展:

Object.keys 會返回一個包含所有可枚舉自有字符串屬性的數(shù)組,
Object.getOwnPropertyNames 則會包含所有屬性,包括不可枚舉的。
Object.getOwnPropertyDescriptor(obj, prop)靜態(tài)方法返回一個對象,該對象描述給定對象上特定屬性(即直接存在于對象上而不在對象的原型鏈中的屬性)的配置。

obj
要查找其屬性的對象。
prop
要檢索其描述的屬性的名稱或 Symbol。
返回值
如果指定的屬性存在于對象上,則返回其屬性描述符,否則返回 undefined。
// 對象本身的屬性的屬性描述符
const desc = Object.getOwnPropertyDescriptor(obj, "c");
console.log(desc);
// {
//	value: 3, 
// 	writable: false,
//	enumerable: false, 
// 	configurable: false
// }
// 對象原型上的屬性的屬性描述符
const desc1 = Object.getOwnPropertyDescriptor(Object.prototype, "e");
console.log(desc1);
//{
//	value: 5, 
//	writable: true, 
//	enumerable: true, 
//	configurable: true
// }

屬性描述符

  • value
與屬性關(guān)聯(lián)的值(僅限數(shù)據(jù)描述符)。
  • writable :是否可更改
當(dāng)且僅當(dāng)與屬性關(guān)聯(lián)的值可以更改時,為 true(僅限數(shù)據(jù)描述符)。
  • enumerable : 是否可枚舉
當(dāng)且僅當(dāng)此屬性在相應(yīng)對象的屬性枚舉中出現(xiàn)時,為 true。
  • configurable :是否可刪除
當(dāng)且僅當(dāng)此屬性描述符的類型可以更改且該屬性可以從相應(yīng)對象中刪除時,為 true。

在迭代 Array 時,for…of 循環(huán)和 for…in 循環(huán)之間的區(qū)別。

Object.prototype.objCustom = function () {};
Array.prototype.arrCustom = function () {};
const iterable = [3, 5, 7];
iterable.foo = "hello";
for (const i in iterable) {
  console.log(i);
}
// "0"、"1"、"2"、"foo"、"arrCustom"、"objCustom"
for (const i in iterable) {
  if (Object.hasOwn(iterable, i)) {
    console.log(i);
  }
}
// "0" "1" "2" "foo"
for (const i of iterable) {
  console.log(i);
}
// 3 5 7

使用 Object.hasOwn() 來檢查找到的可枚舉屬性是否為對象的自有屬性,即非繼承屬性。

const arr=['A','B', ,'D', ,'F'];
  for(const key in arr){
    console.log(key); //0,1,3,5
  }
  for(const item of arr){
    console.log(item); // A,B,undefined,D,undefined,F
  }

for…in 使用屬性枚舉而不是數(shù)組的迭代器。在稀疏數(shù)組中,for…of 會訪問空槽,但 for…in 不會訪問空槽。

2. 遍歷順序

  • for … in 循環(huán)遍歷對象屬性時,遍歷的順序是不確定的,因為對象屬性沒有固定的順序。

根據(jù)現(xiàn)代 ECMAScript 規(guī)范的定義,遍歷的順序是一致且可預(yù)測的。在原型鏈的每個組件中,所有非負整數(shù)鍵(可以作為數(shù)組索引)將首先按值升序遍歷,然后是其他字符串鍵按屬性創(chuàng)建的先后順序升序遍歷。

  • for … of 循環(huán)遍歷可迭代對象時,遍歷的順序是按照對象的迭代器定義的順序進行的。

3. 可迭代性要求

  • for … in 循環(huán)不需要對象滿足可迭代性要求。
  • for … of 循環(huán)要求被遍歷的對象必須是可迭代對象(實現(xiàn)了迭代器接口)。如果對象沒有迭代器接口,嘗試使用 for … of 循環(huán)會拋出錯誤。

總的來說:

  • for…in 循環(huán)用于迭代對象的可枚舉字符串屬性,包括自身屬性繼承的屬性,
  • for…of 循環(huán)用于迭代可迭代對象定義的要進行迭代的值

到此這篇關(guān)于JS中for...in 和 for...of 的區(qū)別的文章就介紹到這了,更多相關(guān)js for...in 和 for...of 區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在TypeScript項目中進行BDD測試

    在TypeScript項目中進行BDD測試

    這篇文章主要介紹了在TypeScript項目中進行BDD測試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • json 帶斜杠時如何解析的實現(xiàn)

    json 帶斜杠時如何解析的實現(xiàn)

    這篇文章主要介紹了json 帶斜杠時如何解析的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 淺談JavaScript中面向?qū)ο蠹夹g(shù)的模擬

    淺談JavaScript中面向?qū)ο蠹夹g(shù)的模擬

    淺談JavaScript中面向?qū)ο蠹夹g(shù)的模擬...
    2006-09-09
  • JavaScript實現(xiàn)在頁面間傳值的方法

    JavaScript實現(xiàn)在頁面間傳值的方法

    這篇文章主要介紹了JavaScript實現(xiàn)在頁面間傳值的方法,涉及javascript傳值的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • JavaScript+Canvas實現(xiàn)簡單的柱狀圖

    JavaScript+Canvas實現(xiàn)簡單的柱狀圖

    這篇文章主要為大家詳細介紹了JavaScript如何利用Canvas實現(xiàn)繪制簡單的柱狀圖,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • JavaScript浮點數(shù)及運算精度調(diào)整詳解

    JavaScript浮點數(shù)及運算精度調(diào)整詳解

    浮點數(shù)的精度問題不是JavaScript特有的,本文主要介紹了JavaScript浮點數(shù)及運算精度調(diào)整詳解,有需要的朋友可以了解一下。
    2016-10-10
  • javascript 用局部變量來代替全局變量

    javascript 用局部變量來代替全局變量

    在JavaScript中,我們應(yīng)該盡可能的用局部變量來代替全局變量,這句話所有人都知道,可是這句話是誰先說的?
    2009-05-05
  • JavaScript作用域全面總結(jié)(附詳細代碼)

    JavaScript作用域全面總結(jié)(附詳細代碼)

    JavaScript的作用域一直以來是前端開發(fā)中比較難以理解的知識點,下面這篇文章主要介紹了JavaScript作用域全面總結(jié)的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-11-11
  • 使用JavaScript將富文本HTML轉(zhuǎn)換為純文本的三種方法

    使用JavaScript將富文本HTML轉(zhuǎn)換為純文本的三種方法

    在Web開發(fā)中,我們經(jīng)常需要處理HTML內(nèi)容,但有時為了特定的目的,比如文本處理、搜索或顯示在非HTML環(huán)境中,我們可能希望將富文本HTML轉(zhuǎn)換為純文本,這里,我們將探討如何使用JavaScript來實現(xiàn)這一功能,需要的朋友可以參考下
    2024-05-05
  • JavaScript 數(shù)組從基礎(chǔ)到高級核心操作方法

    JavaScript 數(shù)組從基礎(chǔ)到高級核心操作方法

    JavaScript數(shù)組是開發(fā)中最常用的數(shù)據(jù)結(jié)構(gòu)之一,掌握其操作方法對于提高編程效率至關(guān)重要,以下是我整理的完整數(shù)組操作指南,感興趣的朋友跟隨小編一起看看吧
    2025-11-11

最新評論

时尚| 喀喇| 阿鲁科尔沁旗| 两当县| 冀州市| 北流市| 玛沁县| 蓝田县| 辉县市| 义乌市| 嘉禾县| 神农架林区| 武清区| 文化| 甘洛县| 揭西县| 武清区| 鄯善县| 甘洛县| 莱阳市| 盘锦市| 景洪市| 荥阳市| 红桥区| 苍山县| 南充市| 民和| 望都县| 浦江县| 色达县| 鲜城| 仙居县| 西平县| 孟村| 英吉沙县| 敦化市| 越西县| 平阳县| 北安市| 贺兰县| 老河口市|