小知识:ES6-对象的扩展-Object.keys(),Object.values(),Object.entries()

Object.keys()

ES5 导入了 Object.keys 方式,回到两个字符串,核心成员是模块第一类另一方面的(不含承继的)大部份可结点(enumerable)特性的键名。

var obj = { foo: bar, baz: 42 };
 Object.keys(obj)
 // ["foo", "baz"]

ES2017 导入了跟 Object.keys 基础建设的 Object.values 和 Object.entries,做为结点两个第一类的补足方式,供 for…of 循环式采用。

let {keys, values, entries} = Object;
 let obj = { a: 1, b: 2, c: 3 };

for (let key of keys(obj)) {
 console.log(key); // a, b, c
 }

for (let value of values(obj)) {
 console.log(value); // 1, 2, 3
 }

for (let [key, value] of entries(obj)) {
 console.log([key, value]); // [a, 1], [b, 2], [c, 3]
 }

Object.values()

Object.values 方式回到两个字符串,核心成员是模块第一类另一方面的(不含承继的)大部份可结点(enumerable)特性的数组。

const obj = { foo: bar, baz: 42 };
 Object.values(obj)
 // ["bar", 42]

回到字符串的核心成员次序,与结语的《特性的结点》部份如是说的排序准则完全一致。

const obj = { 100: a, 2: b, 7: c };
 Object.values(obj)
 // ["b", "c", "a"]

下面标识符中,特性名叫值的特性,是依照值大小不一,Jaunpur结点的,因而回到的次序是 b、c、a。Object.values 只回到第一类另一方面的可结点特性。

const obj = Object.create({}, {p: {value: 42}});
Object.values(obj) // []

下面标识符中,Object.create 方式的第二个模块添加的第一类特性(特性 p),如果不显式声明,默认是不可结点的,因为 p 的特性描述第一类的 enumerable 默认是 false,Object.values 不会回到这个特性。只要把 enumerable 改成 true,Object.values 就会回到特性 p 的值。

const obj = Object.create({}, {p:
{
value: 42,
enumerable: true
}
});
Object.values(obj) // [42]

Object.values 会过滤特性名叫 Symbol 的值特性。

Object.values({ [Symbol()]: 123, foo: abc });
// [abc]

如果 Object.values方式的模块是两个字符串,会回到各个字符组成的两个字符串。

Object.values(foo)
// [f, o, o]

下面标识符中,字符串会先转成两个类似字符串的第一类。字符串的每个字符,就是该第一类的两个特性。因而,Object.value 回到每个特性的数组,就是各个字符组成的两个字符串。如果模块不是第一类,Object.values 会先将其转为第一类。由于值和布尔值的包装第一类,都不会为实例添加非承继的特性。所以,Object.values 会回到空字符串。

Object.values(42) // []
Object.values(true) // []

Object.entries

Object.entries 回到两个字符串,核心成员是模块第一类另一方面的(不含承继的)大部份可结点(enumerable)特性的数组对字符串。

const obj = { foo: ‘bar’, baz: 42 };Object.entries(obj)// [ [“foo”, “bar”], [“baz”, 42] ]

除了回到值不一样,该方式的行为与 Object.values 基本完全一致。如果原第一类的特性名是两个 Symbol 值,该特性会被忽略。

Object.entries({ [Symbol()]: 123, foo: abc });
// [ [ foo, abc ] ]

下面标识符中,原第一类有两个特性,Object.entries 只输出特性名非 Symbol 值的特性。将来可能会有 Reflect.ownEntries() 方式,回到第一类另一方面的大部份特性。Object.entries 的基本用途是结点第一类的特性。

let obj = { one: 1, two: 2 };
for (let [k, v] of Object.entries(obj)) {
console.log(
`${JSON.stringify(k)}: ${JSON.stringify(v)}`
);
}
// "one": 1
// "two": 2

Object.entries 方式的另两个用处是,将第一类转为真正的 Map 结构。

const obj = { foo: bar, baz: 42 };
const map = new Map(Object.entries(obj));
map // Map { foo: "bar", baz: 42 }

自己实现 Object.entries 方式

// Generator函数的版本
function* entries(obj) {
for (let key of Object.keys(obj)) {
yield [key, obj[key]];
}
}

// 非Generator函数的版本
function entries(obj) {
let arr = [];
for (let key of Object.keys(obj)) {
arr.push([key, obj[key]]);
}
return arr;
}

建站知识

小知识:数组去重古和今

2022-5-21 21:40:40

建站知识

小知识:input输入框只能输入正整数、或输入正整数和小数

2022-5-21 21:50:51

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索