for (var key in obj) {
console.log(obj[key])
}
这里的var操作符不是必需,但为了保证局部变量,推荐使用上面的写法
function Person (name, age) {
this.name = name
this.age = age
this.sayHello = function () {
console.log('Hello');
}
}
Person.prototype.addr = 'The Earth'
Person.prototype.getNum = function() {
console.log(1);
}
const tom = new Person('Tom', 18, 'tomato')
console.log(tom);
console.log(tom.__proto__);
for (var key in tom) {
console.log(key ':' tom[key]);
}
遍历数组的缺点:
const colors = ['red', 'blue', 'yellow']
colors.name = 'overcast'
for (var key in colors) {
console.log(key);
}
for (var v of colors) {
console.log(v);
}
function deepClone (obj = {}) {
let result
if (typeof obj !== 'object' || obj === null) {
return obj
}
if (obj instanceof Array) {
result = []
} else {
result = {}
}
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key])
}
}
return result
}
const obj1 = {
name: 'tom',
colors: ['red', 'blue'],
numbers: {
language: 96,
mathematics: 100
}
}
const obj2 = deepClone(obj1)
obj2.name = 'jane'
obj2.colors = ['pink']
obj2.numbers.language = 100
console.log(obj1);
console.log(obj2);
Object.keys(),Object.values(),Object.entries()均返回一个数组,区别是数组成员不一样(都不含Symbol属性)。
var data = { name: 'tim', age: 18, [Symbol()]: 123 };
console.log(Object.keys(data));
console.log(Object.values(data));
console.log(Object.entries(data));
console.log(Object.keys('foo'));
console.log(Object.values('foo'));
console.log(Object.entries('foo'));
let obj = { a: 1, b: 2, c: 3 };
for (let key of Object.keys(obj)) {
console.log(key);
}
for (let value of Object.values(obj)) {
console.log(value);
}
for (let [key, value] of Object.entries(obj)) {
console.log([key, value]);
}
Object.keys(obj).forEach(key => {
console.log(key ':' obj[key]);
})
Object.values(obj).forEach((value) => {
console.log(value);
})
Object.entries(obj).forEach(([k, v]) => {
console.log(k ':' v);
})
Map
结构const obj = { foo: 'bar', baz: 42 };
const map = new Map(Object.entries(obj));
console.log(map);
Object.getOwnPropertyNames(obj)
const obj = { foo: 'bar', baz: 42 };
console.log(Object.getOwnPropertyNames(obj));
const obj1 = { a: 1, b: 2, [Symbol()]: 123 };
console.log(Object.getOwnPropertyNames(obj1));
let obj2 = Object.create({}, {
num: {
value: 42,
enumerable: false
}
})
console.log(Object.values(obj2));
console.log(Object.getOwnPropertyNames(obj2));
Object.getOwnPropertyNames(obj)返回的数组便可以用数组的方法进行遍历
var obj = { 0: "a", 1: "b", 2: "c"};
Object.getOwnPropertyNames(obj).forEach(function(val, idx, array) {
console.log(val " -> " obj[val]);
});
Object.getOwnPropertySymbols(obj)
只返回对象的自身的symbol属性,不返回普通属性
const obj = { a: 'Hello' };
let b = Symbol('a');
obj[Symbol('b')] = 'World';
console.log(Object.getOwnPropertySymbols(obj));
for...in
循环、Object.getOwnPropertyNames
比较const obj1 = { [Symbol('foo')]: 'bar' };
const obj2 = { a: 1 }
for (let i in obj1) {
console.log(i);
}
console.log(Object.getOwnPropertyNames(obj1));
console.log(Object.getOwnPropertySymbols(obj1));
console.log(Object.getOwnPropertySymbols(obj2));
const obj = {
[Symbol('a')]: '1',
[Symbol('b')]: '2',
[Symbol('c')]: '3',
}
Object.getOwnPropertySymbols(obj).forEach(key => {
console.log(key, ':', obj[key]);
})
Object.getOwnPropertyNames
和 Object.getOwnPropertySymbols
之和。Reflect.ownKeys(obj)
const obj = {
a: 1,
[Symbol('b')]: 2,
[Symbol('c')]: 3,
}
Object.defineProperty(obj, 'd', {
value: 4,
enumerable: false
})
console.log(obj);
console.log(Object.keys(obj));
console.log(Object.getOwnPropertyNames(obj));
console.log(Object.getOwnPropertySymbols(obj));
console.log(Reflect.ownKeys(obj));
以上遍历对象的方法都遵循同一个规则:
Reflect.ownKeys({ [Symbol()]:0, b: 0, 10: 0, 2: 0, a:0 })
for...in
循环,而用Object.keys()
代替。