for in 和 for of
可枚举的五个影响:
- JSON.stringify方法:只串行化对象自身的可枚举的属性
- Object.assign()(ES6):只拷贝对象自身的可枚举的属性
- for-in:遍历对象 自身和原型 可枚举属性键
- object.keys():返回对象 自身 可枚举属性键组成的字符串数组
对象的键可以是数字或字符串,但Object.keys()返回的一定是字符串数组
- 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)