精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

JavaScript中的遍歷詳解

開發 前端
編程這么多年,要是每次寫遍歷代碼時都用 for 循環,真心感覺對不起 JavaScript 語言~

編程這么多年,要是每次寫遍歷代碼時都用 for 循環,真心感覺對不起 JavaScript 語言~

[[185880]]

對象遍歷

為了便于對象遍歷的測試,我在下面定義了一個測試對象 obj

測試對象

// 為 Object 設置三個自定義屬性(可枚舉)
Object.prototype.userProp = 'userProp';
Object.prototype.getUserProp = function() {
    return Object.prototype.userProp;
};
// 定義一個對象,隱式地繼承自 Object.prototype
var obj = {
    name: 'percy',
    age: 21,
    [Symbol('symbol 屬性')]: 'symbolProp',
    unEnumerable: '我是一個不可枚舉屬性',
    skills: ['html', 'css', 'js'],
    getSkills: function() {
        return this.skills;
    }
};
// 設置 unEnumerable 屬性為不可枚舉屬性
Object.defineProperty(obj, 'unEnumerable', {
    enumerable: false
});

ES6 之后,共有以下 5 種方法可以遍歷對象的屬性。

for…in: 遍歷對象自身的和繼承的可枚舉屬性(不含 Symbol 類型的屬性)

for (let key in obj) {
    console.log(key);
    console.log(obj.key);    // wrong style
    console.log(obj[key]);   // right style
}

不要使用 for…in 來遍歷數組,雖然可以遍歷,但是如果為 Object.prototype 設置了可枚舉屬性后,也會把這些屬性遍歷到,因為數組也是一種對象。

Object.keys(obj):返回一個數組,包括對象自身的(不含繼承的)所有可枚舉屬性(不含 Symbol 類型的屬性)

Object.keys(obj);  
// ["name", "age", "skills", "getSkills"]
Object.getOwnPropertyNames(obj):返回一個數組,包含對象自身的所有屬性(不含 Symbol 類型的屬性,不包含繼承屬性,但是包括不可枚舉屬性)
Object.getOwnPropertyNames(obj);
// ["name", "age", "unEnumerable", "skills", "getSkills"]
Object.getOwnPropertySymbols(obj):返回一個數組,包含對象自身的所有 Symbol 類型的屬性(不包括繼承的屬性)
Object.getOwnPropertySymbols(obj);
// [Symbol(symbol 屬性)]
Reflect.ownKeys(obj):返回一個數組,包含對象自身的所有屬性(包含 Symbol 類型的屬性,還有不可枚舉的屬性,但是不包括繼承的屬性)
Reflect.ownKeys(obj);
// ["name", "age", "unEnumerable", "skills", "getSkills", Symbol(symbol 屬性)]

以上的5種方法遍歷對象的屬性,都遵守同樣的屬性遍歷的次序規則

  • 首先遍歷所有屬性名為數值的屬性,按照數字排序
  • 其次遍歷所有屬性名為字符串的屬性,按照生成時間排序
  • ***遍歷所有屬性名為Symbol值的屬性,按照生成時間排序

如何判斷某個屬性是不是某個對象自身的屬性呢?

用 in 操作符(不嚴謹,它其實判定的是這個屬性在不在該對象的原型鏈上)

'age' in obj;        // true
'userProp' in obj;   // true (userProp 是 obj 原型鏈上的屬性)
'name' in Object;    // true 
// 上面這個也是 true 的原因是,Object 是一個構造函數,而函數恰巧也有一個 name 屬性
Object.name;         // 'Object'
Array.name;          // 'Array'
用 hasOwnProperty(),這個方法只會檢測某個對象上的屬性,而不是原型鏈上的屬性。
obj.hasOwnProperty('age');      // true
obj.hasOwnProperty('skills');   // true
obj.hasOwnProperty('userProp'); // false
但是它還是有不足之處的。舉例~
// 利用 Object.create() 新建一個對象,并且這個對象沒有任何原型鏈
var obj2 = Object.create(null, {
    name: { value: 'percy' },
    age: { value: 21 },
    skills: { value: ['html', 'css', 'js'] }
});
obj2.hasOwnProperty('name');    // 報錯 
obj2.hasOwnProperty('skills');  // 報錯

針對上面的情況,我們用一個更完善的解決方案來解決。

使用 Object.prototype.hasOwnProperty.call(obj,’prop’…)

Object.prototype.hasOwnProperty.call(obj2,'name');     // true
Object.prototype.hasOwnProperty.call(obj2,'skills');   // true
Object.prototype.hasOwnProperty.call(obj2,'userProp'); // false

數組遍歷

數組實際上也是一種對象,所以也可以使用上面對象遍歷的任意一個方法(但要注意尺度),另外,數組還擁有其他遍歷的方法。

  • 最基本的 for 循環、while 循環遍歷(缺陷是多添加了一個計數變量)
  • ES6 引入:for…of ,這下就沒有這個計數變量了,但是也不夠簡潔(這里不做詳細介紹,以后寫)
for(let value of arr){
    console.log(value);
}

下面說幾種數組內置的一些遍歷方法

Array.prototype.forEach(): 對數組的每個元素執行一次提供的函數

Array.prototype.forEach(callback(currentValue, index, array){
    // do something
}[,thisArg]);
// 如果數組在迭代時被修改了,則按照索引繼續遍歷修改后的數組
var words = ["one", "two", "three", "four"];
words.forEach(function(word) {
  console.log(word);
  if (word === "two") {
    words.shift();
  }
});
// one
// two
// four
Array.prototype.map(): 返回一個新數組,每個元素都是回調函數返回的值
Array.prototype.map(callback(currentValue, index, array){
      // do something 
}[,thisArg]);
```  ```js
// map 的一個坑
[1,2,3].map(parseInt); // [1, NaN, NaN]
// 提示   map(currentValue,index,array)
//        parseInt(value,base)
一些有用的數組內置方法(類似 map,回調函數的參數都是那 3 個)
  • Array.prototype.every(callback[,thisArg]): 測試數組的各個元素是否通過了回調函數的測試,若都通過,返回 true,否則返回 false(說地本質點兒,就是如果回調函數每次返回的值都是 true 的話,則 every() 返回 true,否則為 false)
  • Array.prototype.filter(callback[,thisArg]): 返回一個新數組,數組的元素是原數組中通過測試的元素(就是回調函數返回 true 的話,對應的元素會進入新數組)
  • Array.prototype.find(callback[,thisArg]): 返回***個通過測試的元素
  • Array.prototype.findIndex(callback[,thisArg]): 與上面函數類似,只不過這個是返回索引
  • Array.prototype.some(callback[,thisArg]): 類似 find() ,只不過它不返回元素,只返回一個布爾值。只要找到一個通過測試的,就返回 true
  • Array.prototype.reduce(callback,[initialValue]): 習慣性稱之為累加器函數,對數組的每個元素執行回調函數,***返回一個值(這個值是***一次調用回調函數時返回的值)
    • 這個函數的回調函數有 4 個參數
      • accumulator: 上一次調用回調函數返回的值
      • currentValue: 當前在處理的值
      • currentIndex
      • array
    • initialValue: 可選項,其值用于***次調用 callback 的***個參數
  • Array.prototype.reduceRight(callback[, initialValue]): 用法和上面的函數一樣,只不過遍歷方向正好相反
// 一些相關的案例
// 對數組進行累加、累乘等運算
[1,10,5,3,8].reduce(function(accumulator,currentValue){
    return accumulator*currentValue;
});  // 1200
// 數組扁平化
[[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
    return a.concat(b);
});  // [0, 1, 2, 3, 4, 5]
[[0, 1], [2, 3], [4, 5]].reduceRight(function(a, b) {
    return a.concat(b);
});  // [4, 5, 2, 3, 0, 1]

總結一下上面這些函數的共性

  • 都是通過每次的回調函數的返回值進行邏輯操作或判斷的
  • 回調函數都可以寫成更簡潔的箭頭函數(推薦)
  • 都可以通過形如 Array.prototype.map.call(str,callback) 的方式來操作字符串
var str = '123,hello';
// 反轉字符串
Array.prototype.reduceRight.call(str,function(a,b){
    return a+b;
});  // olleh,321
// 過濾字符串,只保留小寫字母
Array.prototype.filter.call('123,hello', function(a) {
    return /[a-z]/.test(a);
}).join('');  // hello
// 利用 map 遍歷字符串(這個例子明顯舉得不太好 *_*)
Array.prototype.map.call(str,function(a){
    return a.toUpperCase();
});  // ["1", "2", "3", ",", "H", "E", "L", "L", "O"]

最下面的文章想說的就是讓我們用更簡潔的語法(比如內置函數)遍歷數組,從而消除循環結構。

責任編輯:張燕妮 來源: Percy
相關推薦

2015-11-10 09:34:58

JavaScript方式

2013-05-08 10:36:07

JavaScriptJS詳解JavaScrip

2009-09-21 16:59:29

Array擴展

2016-10-11 20:33:17

JavaScriptThisWeb

2021-06-15 10:01:27

JavaScript數組遍歷Entries

2021-06-18 10:05:14

JavaScript數組遍歷

2016-12-27 10:19:42

JavaScriptindexOf

2010-09-08 15:13:09

Node節點Node屬性

2009-10-26 15:07:12

checkbox樹

2024-04-26 08:27:15

JavaScriptCSSHTML元素

2016-08-12 11:04:17

JavaScript物聯網應用

2020-11-18 09:06:02

JavaScript開發技術

2009-11-06 13:28:19

Javascript框

2010-10-09 09:56:51

JavaScriptObject對象

2015-12-24 10:05:39

JavaScripttypeofinstanceof

2010-09-13 14:24:17

JavaScript

2012-02-14 09:45:02

JavaScript

2023-06-28 08:34:02

Bind()函數JavaScript

2012-06-27 09:44:28

ibmdw

2009-10-20 14:58:15

Javascript事
點贊
收藏

51CTO技術棧公眾號

91精品国产综合久久福利软件| 韩日欧美一区| 色噜噜狠狠一区二区三区果冻| 色婷婷精品国产一区二区三区| 国产视频www| 一本久道久久综合狠狠爱| 影音先锋欧美精品| 日本五十肥熟交尾| 久久人人视频| 狠狠干狠狠久久| 亚洲美女av网站| 精选一区二区三区四区五区| 天天爽夜夜爽人人爽| 欧美日韩国产中文字幕在线| 日韩精品免费专区| 精品少妇一区二区30p| 熟女俱乐部一区二区| 日韩视频一二区| 欧美综合久久久| 蜜臀av无码一区二区三区| 欧美a在线看| 久久久精品天堂| julia一区二区中文久久94| 国产情侣呻吟对白高潮| 亚洲啪啪91| 欧美精品一区二区免费| 国产白丝一区二区三区| 欧美日韩爱爱| 亚洲精品美女在线| 国产精品偷伦视频免费观看了| 国产精品亲子伦av一区二区三区| 欧美日韩中文字幕综合视频| 久久香蕉视频网站| 免费av不卡| 中文一区二区完整视频在线观看| 老司机精品福利在线观看| 人妻无码中文字幕免费视频蜜桃| 国产一区欧美一区| 国产精品一区二区三区成人| 亚洲欧美一二三区| 水蜜桃久久夜色精品一区的特点| 2023亚洲男人天堂| 亚洲 欧美 视频| 91久久久久| 午夜精品蜜臀一区二区三区免费| 九九热国产精品视频| 欧美精品国产一区| 欧美激情videos| 国产精品theporn动漫| 激情另类综合| 91国内免费在线视频| 日韩精品人妻中文字幕| 伊人激情综合| 91国产精品91| 无码人妻熟妇av又粗又大| 亚洲专区一区| 国产精品欧美日韩一区二区| 少妇无套内谢久久久久| 青青青伊人色综合久久| 国产精品自拍小视频| 亚洲天堂网视频| 国产尤物一区二区| 岛国一区二区三区高清视频| 日韩专区第一页| 99精品视频免费在线观看| 久久久久久九九| 国产免费永久在线观看| 国产精品美女久久福利网站| 日本一级淫片演员| free性m.freesex欧美| 香蕉成人伊视频在线观看| 免费av观看网址| 精品123区| 91麻豆精品国产91久久久使用方法| 网站在线你懂的| 超碰精品在线观看| 亚洲美女www午夜| 久久成人小视频| 国语精品一区| 国产精品高潮在线| 国产视频一区二区三| jlzzjlzz亚洲日本少妇| 婷婷久久五月天| 天堂av资源在线观看| 五月激情综合网| 午夜免费看视频| 国产主播性色av福利精品一区| 亚洲激情 国产| 永久免费观看片现看| 国产精品xvideos88| 2023亚洲男人天堂| 99久久久国产精品无码免费| 97久久人人超碰| 亚洲一卡二卡三卡| av色综合久久天堂av色综合在| 香蕉av福利精品导航| 奇米影音第四色| 巨人精品**| 久久伊人精品视频| 一级片免费在线播放| 国产精品资源网| 日韩欧美亚洲在线| 国产高清视频色在线www| 欧美日韩大陆一区二区| 国产国语性生话播放| 天天综合一区| 国产精品video| 国产成人三级在线观看视频| 国产精品久久久久四虎| www.com毛片| 日本免费一区二区视频| 色噜噜狠狠色综合网图区 | 国产成人麻豆免费观看| 国产老肥熟一区二区三区| 日韩福利视频| 亚洲福利影院| 精品国产乱码久久久久久浪潮| 蜜桃av.com| 日产国产欧美视频一区精品| 久久狠狠久久综合桃花| 欧美性猛片xxxxx免费中国| 欧美丝袜第三区| 麻豆精品免费视频| 亚洲深夜影院| 久久本道综合色狠狠五月| 四虎av在线| 制服.丝袜.亚洲.中文.综合| www亚洲色图| 久久精品一区二区国产| 精品欧美国产| 精品捆绑调教一区二区三区| 精品捆绑美女sm三区| 性欧美videos| 国产在线国偷精品产拍免费yy| 亚洲在线观看一区| 久久精品国产精品亚洲毛片| 中文字幕亚洲无线码a| 超碰在线97观看| 国产精品女同一区二区三区| 在线视频日韩一区 | 成人在线免费高清视频| 久久99成人| 欧美成人免费在线观看| 国产三级第一页| 亚洲欧美另类图片小说| 性折磨bdsm欧美激情另类| 久久久9色精品国产一区二区三区| 国产精品美女午夜av| a天堂中文在线| 欧美午夜精品一区二区三区 | 日韩在线视频免费| 精品国产91久久久久久老师| 波多野结衣视频播放| 99精品国产一区二区青青牛奶| 久草精品电影| 日韩精品影院| 久久久国产91| 国产香蕉在线观看| 欧美日韩激情视频8区| 中文字幕一二三四区| 日韩国产成人精品| 影音欧美亚洲| 999久久精品| 欧美性受xxx| 在线观看免费黄视频| 欧美精品色一区二区三区| 欧美黑人精品一区二区不卡| 成人aaaa免费全部观看| 国产美女无遮挡网站| 精品视频日韩| www国产亚洲精品| 交100部在线观看| 视频在线一区二区| 动漫av一区二区三区| 日韩欧美国产激情| 一级性生活免费视频| 成人免费av在线| 日本新janpanese乱熟| 欧美在线播放| 欧美日韩精品久久| 91亚洲精品在看在线观看高清| 久久久久久久久久国产| 黄视频在线播放| 日韩三级电影网址| 日日夜夜操视频| 亚洲综合视频在线| 伊人影院综合网| 懂色av中文一区二区三区| 色诱视频在线观看| 欧美另类视频| 亚洲欧美综合一区| 免费福利视频一区| 成人激情视频网| 日韩成人av电影| 欧美第一黄网免费网站| p色视频免费在线观看| 精品卡一卡二卡三卡四在线| 小泽玛利亚一区二区三区视频| 亚洲一区自拍偷拍| 91麻豆制片厂| 91免费看`日韩一区二区| 亚洲精品免费一区亚洲精品免费精品一区 | 高清国产一区二区三区四区五区| 国模视频一区二区三区| 黄色成人影院| 伊人伊成久久人综合网小说| 国产 日韩 欧美 综合| 欧美乱熟臀69xxxxxx| 三级视频在线观看| 亚洲香肠在线观看| 国产美女久久久久久| 国产欧美日韩综合| 美女100%无挡| 成人v精品蜜桃久久一区| 操人视频免费看| 久草中文综合在线| 在线免费观看视频黄| 久久精品亚洲一区二区| 麻豆tv在线播放| 国产主播一区| 996这里只有精品| 一区二区影院| 一区二区三区视频在线播放| 狠狠做六月爱婷婷综合aⅴ| 国产一区二区免费电影| 盗摄牛牛av影视一区二区| 3d精品h动漫啪啪一区二区| 日日夜夜精品| 国产一区视频在线播放| 成人午夜sm精品久久久久久久| 日本中文字幕不卡免费| 综合另类专区| 欧日韩不卡在线视频| 欧美日韩国产观看视频| 91黄色8090| 亚洲天堂av在线| 日本成人精品在线| 欧美大胆性生话| 国产mv久久久| 成人精品高清在线视频| 国产女精品视频网站免费| 欧美一级做a| 成人性生交xxxxx网站| 亚洲综合视频| 99久久99久久精品国产片| 日本亚州欧洲精品不卡| 97在线中文字幕| 久久a爱视频| 久久涩涩网站| 成人午夜国产| 青青草免费在线视频观看| 黄色成人精品网站| 阿v天堂2017| 日韩高清在线电影| www.午夜av| 成人午夜精品在线| 手机av免费看| 国产精品理论片在线观看| 蜜臀av午夜精品久久| 一区二区三区高清不卡| 国产乡下妇女做爰毛片| 欧美日韩性生活视频| 欧美超碰在线观看| 91精品国产综合久久蜜臀| 亚洲av无码乱码国产精品久久| 精品国产乱码久久久久久免费| 日韩在线无毛| 久久久久999| а√天堂8资源中文在线| 欧美中文字幕在线观看| 成人高清一区| 国产精品一区视频| 精品国产一区二区三区| 国产对白在线播放| 99热这里只有精品8| 国产福利影院在线观看| 国产精品中文字幕日韩精品| 欧美做受喷浆在线观看| 国产精品久久久久永久免费观看| 九九久久免费视频| 在线视频国内自拍亚洲视频| 99久久精品日本一区二区免费| 亚洲精美色品网站| 日本在线视频观看| 午夜精品一区二区三区在线| 欧美日韩亚洲国产| ts人妖另类在线| 久久中文亚洲字幕| 成人免费aaa| 国产在线播放一区三区四| 亚洲色图14p| 一区二区三区在线观看国产| 国产一级片毛片| 日韩欧美中文字幕精品| 激情在线视频| 97人人做人人爱| 亚洲精品tv| 欧洲亚洲一区| 国产日韩精品视频一区二区三区| 中文字幕资源在线观看| 久久精品一区二区三区不卡| 18精品爽视频在线观看| 欧美日韩国产另类一区| 久久久资源网| 8x拔播拔播x8国产精品| 激情视频亚洲| 亚洲欧美日韩精品久久久| 男人的天堂成人在线| 制服.丝袜.亚洲.中文.综合懂 | 五月天久久狠狠| 久久国产99| 男人的天堂影院| 亚洲伊人伊色伊影伊综合网| 97精品人妻一区二区三区香蕉| 亚洲午夜小视频| 日本不卡网站| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 国产精品扒开腿做爽爽爽视频软件| 国产高清精品一区二区三区| 欧美gayvideo| 一本色道无码道dvd在线观看| proumb性欧美在线观看| 九九热只有精品| 日韩一区二区在线观看视频播放| 日本三级在线视频| 国产精品第三页| 国产区精品区| 黄色高清无遮挡| 久久蜜桃香蕉精品一区二区三区| 日韩xxx高潮hd| 亚洲国产91色在线| av伦理在线| 国产色综合一区二区三区| 狠狠综合久久| 91成人在线观看喷潮蘑菇| 夜夜爽夜夜爽精品视频| 亚洲av少妇一区二区在线观看| 欧美二区乱c黑人| 国产精品久久久久av蜜臀| 日韩人妻无码精品久久久不卡| 成人自拍视频在线观看| 日本少妇性高潮| 亚洲精品一区二三区不卡| 中文av在线全新| 神马影院一区二区| 久久精品国产秦先生| 极品色av影院| 欧美一区二区三区在线视频| 怡红院红怡院欧美aⅴ怡春院| 92国产精品视频| 黄色av日韩| 国产精品九九九九九| 欧美最猛黑人xxxxx猛交| 成年人在线看| 91九色单男在线观看| 欧美午夜国产| 人妻在线日韩免费视频| 色婷婷精品久久二区二区蜜臀av | 91av在线网站| 欧美偷拍自拍| 亚洲一级片免费观看| 亚洲一区二区三区影院| 五月婷婷开心中文字幕| 国产成人综合精品在线| 天天插综合网| 人妻av一区二区| 91福利视频久久久久| 麻豆网站在线| 国产另类自拍| 视频一区国产视频| 日韩欧美综合视频| 亚洲国产三级网| av在线播放一区| 国产片侵犯亲女视频播放| 久久先锋资源网| 国产精品毛片久久久久久久av| 欧美极品少妇与黑人| 国产a久久精品一区二区三区| 欧美大片久久久| 岛国精品视频在线播放| 在线免费看黄网站| 国产精品免费看一区二区三区| 日韩一区精品视频| 久久午夜无码鲁丝片| 国产一区二区三区视频免费| 国产麻豆一区二区三区| 亚洲欧洲日产国码无码久久99 | 国产一级在线观看视频| 伊人青青综合网站| 久久91在线| 伊人成人免费视频| 91官网在线观看| 2020av在线| 国产精品无码乱伦| 国产亚洲一区二区在线观看| 999免费视频| 国产精品色午夜在线观看| 亚洲经典在线看| 久草网站在线观看| 在线观看视频亚洲|