JavaScript:ES6-对象遍历 可枚举

522 阅读2分钟

for in 和 for of

可枚举的五个影响:

  1. JSON.stringify方法:只串行化对象自身的可枚举的属性
  2. Object.assign()(ES6):只拷贝对象自身的可枚举的属性
  3. for-in:遍历对象 自身和原型 可枚举属性键
  4. object.keys():返回对象 自身 可枚举属性键组成的字符串数组

对象的键可以是数字或字符串,但Object.keys()返回的一定是字符串数组

  1. for-of:遍历对象 自身 可枚举属性值

for in:遍历对象 自身+原型链 上的所有可枚举属性的 键

Object.prototype.myProperty = 'brynn'
let arr = ['name', 'age', 'job']
console.log(arr) // ["name", "age", "job"]
for (let i in arr) {
  console.log(i) // 0 1 2 myProperty
}

for of:遍历可迭代对象 自身 所有可枚举属性的 值

可迭代对象:这个对象自身/原型链上必须有一个能返回迭代器的函数,可迭代对象不一定是类数组比如arguments对象

类数组对象:对象可以用下标做索引,并且有length属性,类数组对象不一定可以迭代

let arrLike = {
    0:'brynn',
    1:'xd'
    length:2
}
  • 数组 Array的prototype上有Symbol(Symbol.iterator)方法返回一个迭代器对象,其有next方法
Object.prototype.myProperty = 'brynn'
let arr = ['name', 'age', 'job']
console.log(arr) // ["name", "age", "job"]
for (let i of arr) {
  console.log(i) // name age job
}

数组是一个属性键值为下标的+有一个不可枚举length属性的+以Array.prototype为原型的对象

let arr = ['name', 'age', 'job']
let properties = Object.getOwnPropertyDescriptors(arr)
console.log(properties) // {0: {…}, 1: {…}, 2: {…}, length:  {value: 3, writable: true, enumerable: false, configurable: false}}
  • Set Set的prototype上有Symbol(Symbol.iterator)
let set = new Set(['name', 'age', 'job'])
console.log(set) // Set(3) {"name", "age", "job"}
for (let i of set) {
  console.log(i) // name age job
}

Set对象打印是会看到上面有一个灰色的size属性,但其实不是它的属性,而是因为它的原型上有一个size的getter

getOwnProperties返回的是一个空对象

let set = new Set(['name', 'age', 'job'])
let properties = Object.getOwnPropertyDescriptors(set)
console.log(properties) // {}
  • arguments arguments对象的原型是Object.prototype,其属性Symbol(Symbol.iterator)不是在对象的原型链上的,而是对象本身
function testArguments() {
  console.log(arguments) // index.js:2 Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]
  for (let i of arguments) {
    console.log(i) // 1 2 3
  }
}
testArguments(1, 2, 3)

解构和拓展运算符

数组解构

function testDestruction(...args) {
  console.log(args) // [1, 2, 3]
  console.log(...args) // 1 2 3
}
let array = [1, 2, 3]
console.log(array) // [1, 2, 3]
console.log(...array) // 1 2 3
testDestruction(...array)

let [first, ...rest] = [1, 2]
console.log(rest) // [2]

对象解构

var {name, height = '1'} = {
    age:'20',
    name: 'brynn',
}
console.log(name);
console.log(height);

Set/Map/Symbol

Set是一个对象,用来数组去重,常用方法有add delete

var arr = [1,3,5,2,3,1];
var uniObj = new Set(arr);
uniObj.add(100);
//Set(5) {1, 3, 5, 2, 100}
console.log(uniObj);
var uniArr = [...uniObj];
//[1, 3, 5, 2, 100]
console.log(uniArr);

Map是一个对象,可实现用对象作为键

const map = new Map();
const k1 = ['a'];
const k2 = ['a'];
map.set(k1, 111).set(k2, 222);
// Map(2) {Array(1) => 111, Array(1) => 222}
console.log(map);

Symbol是新增加的原始类型,不能用new,传入相同参数返回值也不同

var s1 = Symbol('a');
//Symbol(a)
console.log(s1)
var a = {};
a[s1] = 'brynn';
// {Symbol(a): "brynn"}
console.log(a)
var bool = Symbol("name") === Symbol("name")
// false
console.log(bool)