Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致。
语法:
Object.keys(obj)
参数:
obj:要返回其枚举自身属性的对象。
返回值:
一个表示给定对象的所有可枚举属性的字符串数组。
描述:
Object.keys 返回一个所有元素为字符串的数组,其元素来自于从给定的object上面可直接枚举的属性。这些属性的顺序与手动遍历该对象属性时的一致。
例子:
const obj1 = {a: 1, b: 2, c: 3}
console.log(Object.keys(obj1)) // ['a', 'b', 'c']
// 参数是数组,返回的是索引值
const arr1 = [1, 2, 3, 4]
console.log(Object.keys(arr1)) // ['0', '1', '2', '3']
// 如果key的类型是Number,那么Object.keys返回值是按照key从小到大排序
const obj2 = {10: 'a', 20: 'b', 7: 'c'}
console.log(Object.keys(obj2)) // ['7', '10', '20']
// 参数是字符串,返回的是索引值
const str1 = 'hello lvxiaobu'
console.log(Object.keys(str1)); // ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13']
// 参数是构造函数,返回的是空数组
function foo(name, sex, age) {
this.name = name
this.sex = sex
this.age = age
this.work = function(){
return this.name + this.sex + this.age
}
}
console.log(Object.keys(foo)) // []
const lvxiaobu = new foo('lvxiaobu', 'man', 23)
console.log(Object.keys(lvxiaobu)) // ['name', 'sex', 'age', 'work']
// 极端情况
const obj3 = {
1: 'a',
'b': 'b',
7: 'c',
a: 'd',
'3': 'e',
'-5': 'f'
}
console.log(Object.keys(obj3)) // ['1', '3', '7', 'b', 'a', '-5']
注意:
1、Object.keys()会把里面的参数分成几种情况,首先,Number类型的优先,然后再到字符串,正数字符串当做Number类型处理,负数字符串当做字符串处理。
- 如果属性名的类型是Number,那么Object.keys返回值是按照key从小到大排序
- 如果属性名的类型不是Number,那么Object.keys返回值是按照属性被创建的时间升序排序
2、在ES5里,如果此方法的参数不是对象(而是一个原始值),那么它会抛出 TypeError。在ES6中,非对象的参数将被强制转换为一个对象。
Object.keys("foo");
// TypeError: "foo" is not an object (ES5 code)
Object.keys("foo");
// ["0", "1", "2"] (ES6 code)