在读别人的代码的时候发现了使用了Object.keys(obj)的函数,因此记录下用法
Object.keys(obj)会返回一个由传入对象的可枚举属性 组成的数组,数组名的排列顺序和使用for...in...循环遍历该对象返回的顺序一致。
区别: for...in....循环还会枚举其原型链上的属性
语法
Object.keys(obj)
obj:传入的对象
返回值:传入对象可枚举属性组成的数组
例子
//数组
var a=["a","b","c"]
Object.keys(a) //输出["0","1","2"]
//对象
var obj={a:1,b:2,c:3}
Object.keys(obj) //输出["a","b","c"]
//不可枚举属性
var obj1={
{},
{getFoo:function(){value:function(){return this.foo}}}
}
obj1.foo="1"
Object.keys(obj1) //输出foo
注意
在ES5中,如果此方法的参数不是一个对象,而是一个原始值,则会抛出TypeError,在ES2015中,非对象的参数会强制转换为一个对象
与for... in..的区别
在上文中对比了Object.keys()和for...in..下面简单的说明下for..in..的使用
语法
for(variable in object){...}
参数
variable:每次迭代时,将不同的属性名分配给变量
object:需要迭代属性的对象
描述
for..in..枚举只遍历可枚举的属性,循环将迭代对象的所有可枚举属性和从他的构造函数的prototype继承而来
注意
for in不应该用来迭代一个下标很重要的Array,不能保证返回的一定是按照循序的索引,但是他会返回所有可枚举的属性,包括非整数名称和继承的
例子
var a={a:'1',b:'2',c:'3'}
function test(){this.color='red'}
test.prototype=a
var obj=new test()
var obj=new test() //输出 color a b c
Object.keys(obj) //输出["color"]