const TFBOYS = ['wangyuan', 'wangjunkai', 'yiyangqianxi']
function fn(...args) {
console.log(args);
}
fn(...TFBOYS)
const A = ['a','b','c','d']
const CONRACT = [...TFBOYS, ...A]
console.log(CONRACT);
let sy = Symbol('zahngsan')
let sy1 = Symbol('zahngsan')
let sm = Symbol.for('张三')
let sm1 = Symbol.for('张三')
console.log(sy, typeof sy);
console.log(sy === sy1);
console.log(sm === sm1);
let game = {
up: function() {
console.log('第一个up');
},
down: function() {
console.log('第一个down');
}
}
let sym = {
up: Symbol(),
down: Symbol()
}
game[sym.up] = function() {
console.log('我是用sym赋中的up');
}
game[sym.down] = function() {
console.log('我是用sym赋中的down');
}
console.log(game);
let arr = ['zahngsan','lisi','wangwu','zhaoyue']
for(let a in arr) {
console.log(a);
}
for(let v of arr) {
console.log(v);
}
console.log(arr);
let iterator = arr[Symbol.iterator]()
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
- 扩展运算符:…数组名,可以将数组转换为逗号分隔的参数序列;可以作为函数的实参;
- 扩展运算符的应用:拼接;两个数组可以这样:[…数组名,…数组名],有引用类型数据时,则是浅拷贝;将伪数组转换真正的数组:比如获取一组div元素时里面的数组就是伪数组,可以直接[…声明的变量名],就转换了;
- 数据类型:Symbol:值是唯一的,解决命名冲突;值不能与其它数据进行运算;定义的对象属性不能使用for in 循环遍历,可以使用Reflect.ownKeys来获取对象的所有键名;创建Symbol:let 变量名 = Symbol(可传入字符串,知识一个标志);let 变量名 = Symbol.for(可以传入字符串,是唯一标识,与前者不同)
- Symbol的应用:给对象添加属性和方法,表示独一无二的;Symbol()是一个动态的值,并不是一个固定的值;因此不可以Symbol():为函数;不过可以[Symbol()]: function() {}来添加方法;
- Symbol的内置值:Symbol对象的属性Symbol.hasInstance:整体作为一个Symbol的属性;
- 迭代器:是一种接口,为各种不同的数据结构提供统一的访问机制,任何数据结构只要部署iterator接口(对象里面的属性Symbol.iterator),就可以完成for of遍历操作;工作原理:1.创建一个指针对象,指向当前数据结构的起始位置;2.第一次调用next方法是,指针指向第一个成员;3.不断调用next方法,指针往下移动,直到最后一个成员;4.每调用next会返回一个包含value和done属性的对象;
- for in 遍历保存的是数组索引,for of遍历保存的是数组中的值;