js原生方法遍歷的四種方式
由于要看是否遍歷對(duì)象原型__proto__上的屬性,第一步先寫(xiě)構(gòu)造函數(shù)
????function Fun(argument) {
????????console.log(arguments)
????????for (var i = 0; i <= arguments.length-1; i++) {
????????????this['k' + i] = arguments[i];
????????}
????};
?構(gòu)造函數(shù)原型上添加部分屬性
????Fun.prototype.key1 = 'proto01';
????Fun.prototype.key2 = 'proto02';
????Fun.prototype.key3 = 'proto03';
????Fun.prototype.key4 = 'proto04';
?添加屬性名為Symbol類型的屬性和不可枚舉熟悉
????Fun.prototype[Symbol("proto")] = 'proto05';
????Fun.prototype[Symbol("proto")] = 'proto06';
????Object.defineProperty(Fun.prototype, "defiPrro", {
????????value: "不可枚舉proto",
????????enumberable: false
????})
?構(gòu)造函數(shù)new一個(gè)實(shí)例
????var obj = new Fun(1,2,3,4,5,6);
給對(duì)象添加屬性名為Symbol類型的屬性和不可枚舉熟悉
????obj[Symbol("own")] = 'Symbol 01';
????obj[Symbol("own")] = 'Symbol 02';
????Object.defineProperty(obj, "defiPrro", {
????????value: "不可枚舉objOwn",
????????enumberable: false
????})
?Object.keys()遍歷?
返回值是一個(gè)對(duì)象屬性名組成的數(shù)組,包含對(duì)象自身(不含繼承的屬性)的所有可以枚舉的屬性(不含Symbol類型)
????Object.keys(obj).forEach( function(key, index) {
????????console.log(key,obj[key])
????});
打印結(jié)果:
for in 遍歷
返回值是一個(gè)對(duì)象屬性名組成的數(shù)組,包含對(duì)象自身(含繼承的屬性)的所有可以枚舉的屬性(不含Symbol類型)
????for (var key in obj) {
????????console.log(key,obj[key])
????}
打印結(jié)果:
Object.getOwnPropertyNames() 遍歷?
返回值是一個(gè)對(duì)象屬性名組成的數(shù)組,包含對(duì)象自身(不含繼承的屬性)的所有的(含不可枚舉)屬性(不含Symbol類型)
????Object.getOwnPropertyNames(obj).forEach(function(key){
????????console.log(key,obj[key]);
????});
打印結(jié)果:
Reflect.ownKeys() 遍歷?
返回值是一個(gè)對(duì)象屬性名組成的數(shù)組,包含對(duì)象自身(不含繼承的屬性)的所有的(含不可枚舉)屬性(含Symbol類型)
Reflect是es6的新屬性
????Reflect.ownKeys(obj).forEach(function(key){
????????console.log(key,obj[key]);
????});
打印結(jié)果: