1.函数参数默认值
在前端开发中,有时候需要写一些组件供其他开发者调用,这时候需要提供对外接口,对外接口的默认值的接口参数由调用者决定,如果在调用接口时没有传参,该怎么处理?es6之前的实现如下:
function showName(arg){
var name = arg || "React";
console.log(name);
}
showName(); //输出React
showName("LuoTianyou") //输出LuoTianyou
ES6提供了新的语法标准,使得函数参数默认值的处理变得简洁,代码如下
function showName(arg="React"){
console.log(arg);
}
showName(); //输出React
showName("LuoTianyou"); //输出LuoTianyou
2.剩余(rest)参数
要实现一个求和函数,ES5以前的写法是这样的:
function sum(){
var sum = 0;
for(var val of Array.prototype.slice.call(arguments)){
sum += val;
}
return sum;
}
console.log(sum(1,2,3)) //输出6
这里是由于arguments是一个类数组对象,不是一个真正的数组,所以需要使用Array.prototype.slice.call()方法将其转换成数组对象
es6在剩余参数上提供了新的语法标准, 就上述求和功能,es6可以这么写:
function(...values){
let sum = 0;
for (var val of values){
sum += val;
}
return sum;
}
console.log(sum(1,2,3)) //输出6
上述示例中,...values是一个剩余参数,调用该函数时,剩余参数可以是不确定的。剩余参数是一个真正的数组,所以不需要转换,而且所有的数组特性剩余参数都具有。
3.箭头函数
//语法:arg=>statement
例如
var name = function(arg){
return arg;
}
可以写成
var name = arg => arg
如果参数有多个,可以写成
var sum = (num1, num2) => (return num1 + num2;);
箭头函数中大括号中的内容是被解释为代码块的,如果在大括号中返回一个对象,需要在对象外面再加一个小括号,例如:
let person = (age, name) => { age: age, name: name}; //错误
let person = (age, name) => ({age: age, name: name}); //正确
4.多个返回值的情况
function f(age, name){
return {myAge: age, myName: name};
}
console.log(f(26, "LuoTianyou"));
//输出结果为: {MyAge: 26, myName: "LuoTianyou"}
上面的例子用ES6可以写成:
function f(age, name){
return(age, name);
}
console.log(f(26, "LuoTianyou"))
//输出结果为:{age: 26, name: "LuoTianyou"}
从上述例子可以看出,ES6是允许在对象中直接写变量的,属性名即为变量,属性值即为变量值。这种表达式的简化功能可以使代码变得简洁漂亮
这里的(age, name)等同于(age: age, name: name)是es6标准对于对象的一个简写。 此外,方法也可以简写:
//之前写法
const person = {
showName: function(){
return "LuoTianyou";
}
}
//es6写法
const person = {
showName(){
return "LuoTianyou";
}
}
5.属性名表达式
在ES5之前也可以用字面量代替属性名,如
obj["a" + "bc"] = "React";
console.log(obj["abc"]) //输出React
在ES6之后,这种方式的定义也适用于对象字面量的定义,如:
let propkey = "foo";
let obj = {
[propkey]: "true",
['a' + 'ge']: 21
}
console.log(obj['foo']) //输出true
console.log(obj) //输出{foo: true, age: 21}
属性名表达式和属性简化是不可以同时使用的
//错误
const foo = 'bar';
const bar = 'abc';
const baz = {[foo]}
//正确
const foo = 'bar';
const baz = {[foo]: 'abc'}
很显然,这里的[foo]虽然代表bar,但是编译器不能这么解释它,我们不要使用嵌套的简化属性。
6.class声明语法
众所周知,JavaScript是面向对象的一门语言,但是ES6之前的JavaScript没有原生的类机制,不能像Java,C++语言那样直接用关键字class定义一个类。
以前工程师常用函数原型来实现类系统 比如要定义一个Person类,则应该这么写:
function Person(name, age, sex){
this.name = name;
this.age = age;
this.sex = sex;
}
Person.prototype.showName = function(){
console.log(this.name);
}
var p = new Person("LTY", 21, "male");
p.showName(); //输出LTY
ES6中类的基本语法为:
class name {...}
则上述的示例用ES6标准可以改写为这样:
class Person{
constructor(name, age, sex){
this.name = name;
this.age = age;
this.sex = sex;
}
showName(){
console.log(this.name);
}
}
const p = new Person("LTY", 21, "male");
p.showName();