摘要:遍歷對象的屬性并沒有像中遍歷一個(gè)那么簡單,主要原因有以下兩點(diǎn)在中對象的屬性分為可枚舉與不可枚舉之分他們是由屬性的的值決定的。
javascript遍歷對象的屬性并沒有像java中遍歷一個(gè)Map那么簡單,主要原因有以下兩點(diǎn):
在javascript中對象的屬性分為可枚舉與不可枚舉之分,他們是由屬性的 enumerable 的值決定的??擅杜e性
決定了這個(gè)屬性是否可以被 for-in 遍歷到。
javascript的對象一般都處于原型鏈中,它會從上層原型對象上繼承一些屬性
根據(jù)這兩點(diǎn)特性,我們可以分為 4 種情況來遍歷javascript對象屬性
1.遍歷自身可枚舉的屬性 (可枚舉,非繼承屬性) Object.keys() 方法
該方法會返回一個(gè)由一個(gè)給定對象的自身可枚舉屬性組成的數(shù)組,數(shù)組中的屬性名的排列順序和使用for..in遍歷該對象時(shí)返回的順序一致(兩者的區(qū)別是 for ..in還會枚舉其原型鏈上的屬性 )
/**Array 對象**/ var arr = ["a","b","c"]; console.log(Object.keys(arr)); // ["0","1","2"] /**Object對象**/ var obj = {foo:"bar",baz:42}; console.log(Object.keys(obj)); // ["foo","baz"] /**類數(shù)組 對象 隨機(jī)key排序**/ var anObj ={100:"a",2:"b",7:"c"}; console.log(Object.keys); //["2","7","100"] /***getFoo 是一個(gè)不可枚舉的屬性**/ var my_obj = Object.create( {}, { getFoo : { value : function () { return this.foo } } } ); my_obj.foo = 1; console.log(Object.keys(my_obj)); // ["foo"]
2.遍歷自身的所有屬性(可枚舉,不可枚舉,非繼承屬性) Object.getOwnPropertyNames()方法
該方法返回一個(gè)由指定對象的所有自身屬性組成的數(shù)組(包括不可枚舉屬性但不包括Symbol值作為名稱的屬性)
var arr = ["a", "b", "c"]; console.log(Object.getOwnPropertyNames(arr).sort()); // ["0", "1", "2", "length"] // 類數(shù)組對象 var obj = { 0: "a", 1: "b", 2: "c"}; console.log(Object.getOwnPropertyNames(obj).sort()); // ["0", "1", "2"] // 使用Array.forEach輸出屬性名和屬性值 Object.getOwnPropertyNames(obj).forEach(function(val, idx, array) { console.log(val + " -> " + obj[val]); }); // 輸出 // 0 -> a // 1 -> b // 2 -> c //不可枚舉屬性 var my_obj = Object.create({}, { getFoo: { value: function() { return this.foo; }, enumerable: false } }); my_obj.foo = 1; console.log(Object.getOwnPropertyNames(my_obj).sort()); // ["foo", "getFoo"]
3.遍歷可枚舉的自身屬性和繼承屬性 (可枚舉,可繼承的屬性) for in
遍歷對象的屬性 var obj={ name:"張三", age : "24", getAge:function(){ console.log(this.age); } } var arry ={}; for(var i in obj){ if(obj.hasOwnProperty(i)&& typeOf obj[i] != "function"){ arry[i] = obj[i]; } } console.log(arry); {name:"張三",age:24} 注: hasOwnProperty()方法判斷對象是有某個(gè)屬性(本身的屬性,不是繼承的屬性)
4.遍歷所有的自身屬性和繼承屬性
(function () { var getAllPropertyNames = function (obj) { var props = []; do { props = props.concat(Object.getOwnPropertyNames(obj)); } while (obj = Object.getPrototypeOf(obj)); return props; } var propertys = getAllPropertyNames(window); alert(propertys.length); //276 alert(propertys.join(" ")); //toString等 })()
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/92518.html
摘要:所以說遍歷屬性時(shí),要考慮這兩個(gè)因素。開始遍歷先定義兩個(gè)類吧和,后者繼承前者。然后再聲明并初始化一個(gè)的實(shí)例。 原文鏈接 JavaScript 中遍歷對象的屬性 參考 JavaScript中的屬性:如何遍歷屬性《JavaScript 高級程序設(shè)計(jì)》 概述 遍歷 JavaScript 對象中的屬性沒有其他語言那么簡單,因?yàn)閮蓚€(gè)因素會影響屬性的遍歷:對象屬性的屬性描述符 (property ...
摘要:簡單說就是一個(gè)有一個(gè)函數(shù),這個(gè)函數(shù)執(zhí)行的返回值一定是一個(gè)對象,對象有兩個(gè)屬性標(biāo)記迭代是否結(jié)束,標(biāo)記這次迭代的結(jié)果值。 引言 遍歷對象是平常工作中很常見的一個(gè)操作,幾乎是日常操作,但是遍歷對象真的是一件很容易的事情么,顯然不是的。 常用的方式 for...in for (variable in object) {...} 這個(gè)是一個(gè)很常見的用法,相信每個(gè)人順手都可以寫出來。但是這里需要主...
摘要:日常開發(fā)中我們難免需要對數(shù)組和對象進(jìn)行遍歷,今天抽空來總結(jié)下遍歷數(shù)組和對象常用的方法。使用遍歷對象注只能遍歷出自身可枚舉的屬性,而不能遍歷出原型鏈上面的屬性。 日常開發(fā)中我們難免需要對數(shù)組和對象進(jìn)行遍歷,今天抽空來總結(jié)下遍歷數(shù)組和對象常用的方法。 Javascript遍歷數(shù)組總結(jié) 我們定義一個(gè)數(shù)組 var arr = [2,4,6]; 1.使用for循環(huán)遍歷 var lengt...
摘要:在中,引入了新的循環(huán),即循環(huán)。而且,遍歷數(shù)組元素的順序可能是隨機(jī)的。所以,鑒于以上種種缺陷,我們需要改進(jìn)原先的循環(huán)??偨Y(jié)一下,循環(huán)有以下幾個(gè)特征這是最簡潔最直接的遍歷數(shù)組元素的語法。 在ECMAScript5(簡稱 ES5)中,有三種 for 循環(huán),分別是: 簡單for循環(huán) for-in forEach 在2015年6月份發(fā)布的ECMAScript6(簡稱 ES6)中,新增了一種循...
摘要:總結(jié)中的循環(huán)遍歷定義一個(gè)數(shù)組和對象經(jīng)常用來遍歷數(shù)組元素遍歷值為數(shù)組元素索引用來遍歷數(shù)組元素第一個(gè)參數(shù)為數(shù)組元素,第二個(gè)參數(shù)為數(shù)組元素索引,第三個(gè)參數(shù)為數(shù)組本身可選沒有返回值用來遍歷數(shù)組元素第一個(gè)參數(shù)為數(shù)組元素,第二個(gè)參數(shù)為數(shù)組元素索引,第三 總結(jié)JavaScript中的循環(huán)遍歷 定義一個(gè)數(shù)組和對象 const arr = [a, b, c, d, e, f]; const obj = ...
閱讀 1500·2023-04-25 15:40
閱讀 2885·2021-08-11 11:15
閱讀 2285·2019-08-26 13:48
閱讀 2861·2019-08-26 12:18
閱讀 2461·2019-08-23 18:23
閱讀 2916·2019-08-23 17:01
閱讀 2990·2019-08-23 16:29
閱讀 1109·2019-08-23 15:15