在学习es6语法时发现了,阮一峰es6提及的Iterator结合mdn官网Iterator的解释,总结下这个用法
Iterator:翻译过来就是:迭代器
适用范围:数组、类数组对象、Map和Set结构(即具有Iterator接口的数据结构)。对象中没有iterator接口,因为它没有确定的顺序,所以for...of不适用于对象。
var arr = ['a', 'b', 'c', 'd', 'e'];
var eArr = arr[Symbol.iterator](); // 与arr.values()方法等效
for (let letter of eArr) {
console.log(letter);
}
看看浏览器中eArr的打印结果
- next()方法:
var arr = [1,2,3,4];
let iterator = arr[Symbol.iterator]();
console.log(iterator.next()); //{ value: 1, done: false }
console.log(iterator.next()); //{ value: 2, done: false }
console.log(iterator.next()); //{ value: 3, done: false }
console.log(iterator.next()); //{ value: 4, done: false }
console.log(iterator.next()); //{ value: undefined, done: true }
- Symbol.toStringTag属性:
class ValidatorClass {
get[Symbol.toStringTag]() {
return 'Aoo';
}
}
let res = Object.prototype.toString.call(new ValidatorClass());
console.log(res); // "[object Aoo]"
console.log(Object.prototype.toString.call(1)); // "[object Number]"
console.log({[Symbol.toStringTag]: 'Foo'}.toString()); // "[object Foo]"
Tips:这个属性要用[]包裹起来,Object.prototype.toString.call()可以用来识别任何数据类型,"符串中的数组第二项"变化的。ES6允许字面量定义对象时,把表达式作为对象的属性名,即把表达式放在方括号内。
插个小知识:values()和valueOf()用法区别:
// values()返回的是一个包含iterator接口的数据类型
let a = [1,2,3]
console.log(a.values()); // Array Iterator {}
// valueOf()用来判断详细的object类型,如下就是object中的boolean类型
let b = new Boolean(true)
console.log(typeof b.valueOf()); "boolean"
console.log(typeof b); "object"
let a ={a:1,b:2}
console.log(Object.values(a)); // [1, 2]