JS遍历对象属性(for in、Object.keys、Object.getOwnPropertyNames、for of、Reflect.ownKey

js中几种遍历对象的方法,包括:

  1. for in
  2. Object.keys、Object.values()、Object.entries()
  3. Object.getOwnPropertyNames()
  4. for of
  5. Reflect.ownKeys()它们在使用场景方面各有不同。

1. for in

  • 主要用于遍历对象的可枚举属性,包括自有属性、继承自原型的属性。
var obj = {"name":"Poly", "career":"it"}
Object.defineProperty(obj, "age", {value:"forever 18", enumerable:false});
Object.prototype.protoPer1 = function(){console.log("proto");};
Object.prototype.protoPer2 = 2;
console.log("For In : ");
for(var a in obj) console.log(a);

输出如下:
在这里插入图片描述

2. Object.keys

返回一个数组,元素均为对象自有的可枚举属性

var obj = {"name":"Poly", "career":"it"}
Object.defineProperty(obj, "age", {value:"forever 18", enumerable:false});
Object.prototype.protoPer1 = function(){console.log("proto");};
Object.prototype.protoPer2 = 2;
console.log("Object.keys:")
console.log(Object.keys(obj));

输出如下:
在这里插入图片描述

3. Object.getOwnPropertyNames

用于返回对象的自有属性,包括可枚举和不可枚举的

var obj = {"name":"Poly", "career":"it"}
Object.defineProperty(obj, "age", {value:"forever 18", enumerable:false});
Object.prototype.protoPer1 = function(){console.log("proto");};
Object.prototype.protoPer2 = 2;
console.log("Object.getOwnPropertyNames: ");
console.log(Object.getOwnPropertyNames(obj));

输出如下:
在这里插入图片描述

4. Reflect.ownKeys

Reflect.ownKeys可以返回包含symbol作为key的所有键名,包含可枚举和不可枚举的,不包含继承自原型的。

5. for of

必须是可迭代的。
for…of
Iterable object(可迭代对象)


补充:Object.getOwnPropertySymbols()

Object.getOwnPropertySymbols() 方法返回一个给定对象自身的所有 Symbol 属性的数组。

var obj = {};
var a = Symbol("a");
var b = Symbol.for("b");

obj[a] = "localSymbol";
obj[b] = "globalSymbol";

var objectSymbols = Object.getOwnPropertySymbols(obj);

console.log(objectSymbols.length); // 2
console.log(objectSymbols)         // [Symbol(a), Symbol(b)]
console.log(objectSymbols[0])      // Symbol(a)

遍历一个对象的自身属性

function toObject(iterator, callback = x => x) {
	// 传入一个callback,也就是给toObject暴露一个接口来改变内部的值,默认为 x=>x
    const result = {};
    for (const item of iterator) {
    	// item为yield的结果
        const [key, value = item] = [].concat(callback(item));
        // concat()一个基础数据类型或者一个数组,都返回一个数组
        result[key] = value;
    }
    return result;
}

function hasOwnProperty(obj, key) {
    return Object.prototype.hasOwnProperty.call(obj, key);
}

function* iterate(object, symbol = false) {
    for (const key in object) {
        if (hasOwnProperty(object, key)) {
            yield [object[key], key];
        }
    }

    if (symbol) {
        for (const key of Object.getOwnPropertySymbols(object)) {
            yield [object[key], key];
        }
    }
}

const obj = {
    name: 'xiaoming',
    age: '30',
    [Symbol(1)]: 11
}
// 封装这部分代码,封装成toObject
// for (let i of iterate(obj, true)) {
//     console.log('i', i);
// }
// console.log('res', [...iterate(obj)])

// toObject()
const res = toObject(iterate(obj), x => {
    console.log('x', x)
    return [x[1], x[0]];
});
console.log('res2', res);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Reflect.ownKeys和Object.keys都是用来获取对象属性键的方法,但它们之间有一些区别。 Reflect.ownKeys返回对象的所有属性,不管属性是否可枚举,包括普通属性和Symbol属性。它的返回值等效于Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))。 而Object.keys只返回对象的可枚举属性的键。它的返回值是一个数组,包含了所有可枚举属性的键。 所以,如果你需要获取对象的所有属性键,不管可枚举与否,你可以使用Reflect.ownKeys方法。如果你只需要获取对象的可枚举属性键,你可以使用Object.keys方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Reflect.ownKeys和Object.keys详解](https://blog.csdn.net/lin1072368472/article/details/108220371)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Reflect.ownKeys()与Object.keys()区别 以及 JS中的可枚举属性与不可枚举属性](https://blog.csdn.net/happyqyt/article/details/90578205)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [reflect-own-keys-x:Reflect.ownKeys的伪造](https://download.csdn.net/download/weixin_42133329/16208967)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

. . . . .

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值