for in

以任意顺序迭代一个对象的除Symbol以外的可枚举属性,包括继承的可枚举属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//Object原型链上扩展的方法也会被遍历出来
Object.prototype.fun ()=>{}
var obj = {
a:1,
b:2,
c:3
}
for (const item in obj){
console.log("属性名:"+item+"/属性值:"+obj[item]);
}
//属性名:a/属性值:1
//属性名:b/属性值:2
//属性名:C/属性值:3
//属性名:fun/属性值:()=>{}
//而如果我们不希望搜索到原型上的,我们就可以使用hasOwnProperty
for (const item in obj){
if (obj.hasOwnProperty(item)){
console.log("属性名:"+item+"/属性值:"+obj[item]);
}
}
//属性名:a/属性值:1
//属性名:b/属性值:2
//属性名:c/属性值:3

如果我们不希望搜索到原型上的,我们就可以使用hasOwnProperty

Object.key

返回一个给定对象的自身可枚举属性名组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致。

1
2
3
4
5
6
7
8
9
//注意:当属性名为数字的时候会排序,key/values/entries都有这个特性~
const anobj={100:'a',2:'b',7:'c'};
console.log(Object.keys(anobj));//console:['2',7,'100']
const str = 'hello';
console.log(Object.keys(str));//["0","1","2","3","4"]
const arr = ['a','b','c'];
console.log(Object.keys(arr));//["0","1","2"]
var obj = {a:1,b:2,c:3};
console.log(Object.keys(obj));//["a","b","c"]

Object.values

1
2
3
4
5
6
7
8
9
10
//注意:当属性名为数字的时候会排序,key/values/entries都有这个特性~
//注意:当属性名为数字的时候会排序,key/values/entries都有这个特性~
const obj1={100:1,d:2,a:9,1:3,5:99,b:8};
console.log(Object.values(obj1));//[3,99,1,2,9,8]
const str='hello';
console.log(Object.values(str));//["h","e","""""o"]
const arr=['a','b','c'];
console.log(Object.values(arr));//["a","b","c"]
var obj2={a:1,b:2,c:3};
console.log(Object.values(obj2));//["1","2","3"]v

Object.entries

返回一个给定对象自身可枚举属性的键值对数组,其排列与使用for.循环遍历该对象时返回的顺序一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//注意:当属性名为数字的时候会排序,key/values/entries都有这个特性~
const obj1={100:1,d:2,a:9,1:3,5:99,b:8};
console.log(Object.entries(obj1));//[["1",3],["5",99],["100",1],["d",2],["a",9],["b",8]]
const str='hello';
console.log(Object.entries(str));//[["0","h"],["1","e"],["2",""],["3",""],["4","o"]]
const obj2={a:1,b:2,c:3};
console.log(Object.entries(obj2));//[["a",1],["b",2],["c",3]]
const obj3={a:1,b:2,c:3};
for (const [key,value] of Object.entries(obj3)){
console.log(`${key}:${value}`);
}
//a:1
//b:2
//c:3

object.getownPropertyNames

返回一个由指定对象的所有自身属性的属性名组成的数组。(包括不可枚举属性但不包括Symbol值作为名称的
属性)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//注意:当属性名为数字的时候会排序,key/values/entries都有这个特性
const arobj={100:1,d:2,a:9,1:3,5:99,b:8};
console.log(Object.getOwnPropertyNames(arobj));//["1","5","100","d","a","b"]
const str='hello';
console.log(Object.getOwnPropertyNames(str));//["0","1","2","3","4","length"]
const arr=['a','b','c'];
console.log(Object.getOwnPropertyNames(arr));//s["0","1","2","length"]
const obj={a:1,b:2,c:3};
console.log(Object.getOwnPropertyNames(obj));//["a","b","c"]
const syobj ={a:1,b:2 }
const symbol1=Symbol('symbol1')
const symbol2=Symbol('symbol2')
syobj[symbol1]='hello'
syobj[symbol2]='world'
console.log(Object.getOwnPropertyNames(syobj));//["a","b"]

Object.getownPropertySymbols()

方法返回一个给定对象自身的所有Symbol属性的数组

1
2
3
4
5
6
const obj={a:1,b:2,c:3};
const symbol1=Symbol('symbol1')
const symbol2=Symbol('symbo12')
obj[symbol1]='hello'
obj[symbol2]='world'
console.log(Object.getOwnPropertySymbols(obj));//[Symbol(symbol1),Symbol(symbol2)]

报错:TypeError: Cannot convert a Symbol value to a string

Reflect.ownKeys()

静态方法Reflect..ownKeys(()返回一个由目标对象自身的属性名组成的数组

1
2
3
4
5
6
const obj={a:1,b:2,c:3};
const symbol1=Symbol('symbol1')
const symbol2=Symbol('symbol2')
obj[symbol1]='hello'
obj[symbol2]='world'
console.log(Reflect.ownKeys(obj));//["a","b","c",Symbol(symbol1),Symbol(symbol2)

报错:TypeError: Cannot convert a Symbol value to a string

注意

  • 在ES6之前Object的键值对是无序的;
  • 在ES6之后Object的键值对按照自然数、非自然数和Symbol进行排序,自然数是按照大小升序进行排
    序,其他两种都是按照插入的时间顺序进行排序。