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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

. . . . .

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

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

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

打赏作者

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

抵扣说明:

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

余额充值