ES6 — 箭头函数和Symbol类型
1.箭头函数
ES6 中的箭头函数,(=>) 让代码看起来更加的简洁。
var f = v => v;
// 等同于
var f = function(v){
return v;
};
上面是一个极简的写法,但这种写法有一定的约束,当箭头函数代码块不止一句的时候,就要换成常规的写法了:
var sum = (num1,num2) => { return num1 + num2; }
当代码块部分多余一条语句的时候,需要用大括号括起来,返回值也需要用到 return 语句。
但大括号往往会被解释为代码块,所以箭头函数直接返回一个对象的时候需要在外层包裹一层括号,否则会报错:
var getTempItem =id => ({ id : id , name: "Temp" });
箭头函数使用注意事项:
- 箭头函数没有自己的 this 对象,在箭头函数中所使用的 this 对象,是定义箭头函数时所在的对象,我的理解是,箭头函数借用了外面一层的 this 对象。
- 箭头函数不能作为构造函数,不能使用 new 命令。
- 不能使用 arguments 对象,但是可以用 rest 参数代替,而且使用起来更加方便。
- 箭头函数不适合定义对象的方法。
- 需要动态 this 的时候,箭头函数不适用。
2.Symbol类型
ES6 中,Symbol 是一种新的原始数据类型,表示独一无二的值。
let s = Symbol();
typeof s // " Symbol "
通过上面运行代码,s 的数据类型变成了 Symbol,Symbol 与其他数据类型不同的是,Symbol 是独一无二的,不会与任何与其他属性名产生冲突。
注意:Symbol 函数生成的是一个原始类型的值,不是对象,所以Symbol 不能使用 new 命令。
Symbol 函数可以接受一个字符串作为参数,这样比较易于区分。
let s1 = Symbol("1")
let s2 = Symbol("2")
s1.toString() // "ymbol(1)"
s2.toString() // "ymbol(2)"
加了参数之后,一眼就可以区分,但不加参数的话,s1 和 s2 输出的内容是一样的。
Symbol 函数的参数只表示当前 Symbol 值的描述,所以相同参数的Symbol 函数的返回值是不相等的:
let s1 = Symbol();
let s2 = Symbol();
s1 = s2 // false
let s1 = Symbol("1");
let s2 = Symbol("1");
s1 = s2 // false
上面代码中,可以得出结论,无论有没有参数,无论参数是否相等,s1 和 s2 都不相等。
Symbol 的值不能与其他类型的值经行运算,但可以显示的转换为字符串或者布尔值:
let sym = Symbol(" My symbol");
"your symbol is" +sym
// 报错
let sym = Symbol(" My symbol ");
String(sym)
// 'Symbol(My symbol)'
sym.toString()
// 'Symbol(My symbol)'
let sym = Symbol();
Boolean(sym) // 真
!sym //假
if (sym){
}
Number(sym)
// 报错
以上是ES6 中的箭头函数和Symbol数据类型的部分用法。