ECMAScript 5+
我们可以在支持 ECMAScript 5+ 的浏览器中使用以下方法。
这些方法检测来自对象的值并避免在原型链上进行枚举:
let obj = { name: "Porter", age: 32 }; let keys = Object.keys(obj); for (let i = 0; i < keys.length; i++) { let val = obj[keys[i]]; console.log(val); }
要使代码更紧凑,请使用 forEach:
let obj = { name: "Porter", age: 32 }; Object.keys(obj).forEach(function (key) { let val = obj[key]; console.log(val); });
以下方法构建一个包含对象值的数组:
let obj = { name: "Porter", age: 32 }; let values = Object.keys(obj).map(function (key) { return obj[key]; }); console.log(values);
为了使那些使用 Object.keys 的人对 null 安全,那么你可以运行:
let obj = { name: "Porter", age: 32 }; let values = Object.keys(obj || {}).map(function (key) { return obj[key]; }); console.log(values);
Object.keys 返回可枚举的属性。
使用 Object.keys 通常对迭代简单对象很有效。
如果你有一些不可枚举的属性可以使用,你可以使用:
Object.getOwnPropertyNames instead of Object.keys.
ECMAScript 2015+
该规范添加了 Object.values 和 Object.entries,它们都返回数组。
Object.values 可以与 for-of 循环一起使用:
let obj = { name: "Porter", age: 32 }; const values = Object.values(obj); console.log(values);
如果你想同时使用键和值,那么你可以使用 Object.entries:
let obj = { name: "Porter", age: 32 }; for (const [key, val] of Object.entries(obj)) { console.log([key, val]); }
Object.keys/values/entries 方法与 for..in 循环相似。
它们都忽略将 Symbol(...) 应用为键的属性。
当你需要符号时,你可以使用一个单独的方法 Object.getOwnPropertySymbols,它返回一个只包含符号键的数组。
在不知道键的情况下检测对象的所有属性值可以通过多种方式完成,具体取决于浏览器。
大多数浏览器都支持 ECMAScript 5 (ES5)。
我们来看看根据不同的规格,可以使用哪些方法来获取属性值。
ECMAScript 2014+ ( ES6)
使用 ECMAScript 2014 更容易迭代数组。
在循环中逐一处理值时,我们可以使用以下脚本:
let obj = { name: "Porter", age: 32 }; for (const key of Object.keys(obj)) { const val = obj[key]; console.log(val); }
使用 ECMAScript 2014 粗箭头函数并将对象映射到值数组可以成为单行代码:
let obj = { name: "Porter", age: 32 }; const vals = Object.keys(obj).map(key => obj[key]); console.log(vals);
ECMAScript 2014 规范引入了 Symbol,其实例可用作属性名称。
我们可以使用 Object.getOwnPropertySymbols 来获取要枚举的对象的符号。
来自 ECMAScript 2014 的新 Reflect API 提供 Reflect.ownKeys 返回属性名称和符号列表。
对象值
这只是向对象添加了一个方法。
使用粗箭头函数可以是单行的:
Object.values = obj => Object.keys(obj).map(key => obj[key]); //which you can now use like //['one', 'two', 'three'] let values = Object.values({ a: 'one', b: 'two', c: 'three' }); console.log(values);
如果我们不想在本机 Object.values 存在时使用填充,则可以运行:
Object.values = Object.values || (obj => Object.keys(obj).map(key => obj[key])); let values = Object.values({ a: 'one', b: 'two', c: 'three' }); console.log(values);