rest参数
//ES5用arguments获取函数的实参,获取的类型为对象
function date(){
console.log(arguments);
}
date('myy','wll');
//ES6用rest代替arguments,获取的是数组
function date1(...args){
console.log(args);
}
date1('myy','wwl');
//rest必须放在最后,放在中间或者最前边会报错
function date2(a,b,...args){
console.log(a);
console.log(b);
console.log(args);
}
date2(1,2,3,4,5,5,6);
运行结果:
Symbol
- symbol的值是唯一的,用来解决命名冲突的问题
- symbol值不能与其他数据进行运算
- symbol定义的对象属性不能使用for…in循环遍历,但是可以使用reflect.ownKeys来获取对象的所有键名
- 调用symbol函数时,可以传入一个字符串对符号进行描述,但是字符串参数与符号定义或者标识完全无关
- 运行时不同部分需要共享和重用符号实例,在全局符号注册表中创建,用symbol.for()方法
- symbol.for()对每个字符串键都执行幂等操作,第一次使用某个字符串调用时,它会检查全局运行时注册表,发现不存在对应的符号,于是就会生成一个新符号实例并添加到注册表中,后续使用相同字符串的调用同样会检查注册表,发现存在的时候,就会返回该符号实例。
//创建symbol
let s=Symbol();
console.log(s,typeof s);
let s2=Symbol('mmy');
let s3=Symbol('wwl');
console.log(s2===s3); //false
//symbol.for创建
let s4=Symbol.for('wwl');
let s5=Symbol.for('wwl');
console.log(s4===s5); //true
//不能与其他数据进行运行,运行报错
//Uncaught TypeError: Cannot convert a Symbol value to a number
let resul=s+1100;
let resul1=s > 1100;
let resul2=s+'100';
symbol小例子:
//symbol向对象中添加方法
let game={
name:'俄罗斯方块'
}
let methods={
up:Symbol(),
down:Symbol(),
}
game[methods.up]=function(){
console.log("我可以改变形状");
}
game[methods.down]=function(){
console.log("我可以快速下降");
}
console.log(game);
//
let youxi={
name:"狼人杀",
[Symbol('say')]:function(){
console.log("我可以说话");
},
[Symbol('zibao')]:function(){
console.log("我可以自爆");
},
}
console.log(youxi);
运行结果: