var book = {
name: 'ES6',}
ES6 为对象字面量的语法带来了一些改进:包括属性/方法的简洁表示,可计算的属性名等等.
var events = { listen: listen } ==> var events = { listen }
var expertise = 'journalism'
var person = {
name: 'Sharon',
[expertise]: {
years: 5
}}
简写属性和计算的属性名不可同时使用。这是因为,简写属性是一种在编译阶段的就会生效的语法糖,而计算的属性名则在运行时才生效。如果你把二者混用,代码会报错。而且二者混用往往还会降低代码的可读性,所以JavaScript在语言层面上限制二者不能混用也是个好事。
我们先看看传统上如何定义对象方法;
function print() { alert('ok') }
ES6 的对象字面量方法简写允许我们省略对象方法的function关键字及之后的冒号
ES6简写为: print() { ...}
ES6 为我们提供了一种写匿名函数的新方法,即箭头函数。箭头函数不需要使用function关键字,其参数和函数体之间以=>相连接:
var max = (params) => { params > 100 }
在参数和返回的值都是一个时可以用更为简单的方式表示 var max = params => params > 100
**给函数以合理的命名,有助于增强程序的可读性。箭头函数并不能直接命名,但是却可以通过赋值给变量的形式实现间接命名
尽管箭头函数看起来类似于传统的匿名函数,他们却具有根本性的不同:
· 箭头函数不能被直接命名,不过允许它们赋值给一个变量;
· 箭头函数不能用做构造函数,你不能对箭头函数使用new关键字;
· 箭头函数也没有prototype属性;
· 箭头函数绑定了词法作用域,不会修改this的指向。
如果你想完全控制你的函数中的this,使用箭头函数是简洁高效的,采用函数式编程尤其如此。
[1, 2, 3, 4]
.map(value => value * 2)
.filter(value => value > 2)
.forEach(value => console.log(value))// <- 4// <- 6// <- 8
我们在箭头函数的函数体内使用的this,arguments,super等都指向包含箭头函数的上下文,箭头函数本身不产生新的上下文。
箭头函数的作用域也不能通过.call,.apply,.bind等语法来改变,这使得箭头函数的上下文将永久不变。
ES6提供的最灵活和富于表现性的新特性莫过于解构了。一旦你熟悉了,它用起来也很简单,某种程度上解构可以看做是变量赋值的语法糖,可应用于对象,数组甚至函数的参数。
var school = { teacher : 4 , stu: 600},让一个变量teacher指向对象school的teacher,var teacher = school.teacher,
ES6写法:var {teacher} = school
可以使用var加逗号在一行中同时声明多个变量,解构的花括号内使用逗号可以做一样的事情。
var {teacher, stu} = school
解构还允许我们使用别名,加上:即可var {teacher:ter, stu} = school
对象解构一样,数组解构也允许你添加默认值:
var name = ['jack','neo']; [ firstName = 'John', , lastName = 'Doe' ] = names
&&& 互换值
[left, right] = [right, left]
function sum(a = 1, b = 2, c = 3) { }
不过这样做存在一定的问题,当你调用该函数时,如果传入的参数对象只包含一个属性,另一个属性的默认值会自动失效.
通过函数参数解构,可以解决上面的问题,这里我们为每一个属性都提供了默认值,单独改变其中一个并不会影响其它的值:
function sum({a = 1, b = 2, c = 3} = {}) { return a } ; sum(); // 1
这样当函数被调用时,如果参数为空,会自动以{}作为参数。
ES6之前,对于不确定数量参数的函数。你需要使用伪数组arguments,它拥有length属性,却又不具备很多一般数组有的特性。需要通过Array#slice.call转换arguments对象真数组后才能进行下一步的操作:
Array.prototype.slice.call(arguments).join(', ')
使用剩余参数rest, 你只需要在任意JavaScript函数的最后一个参数前添加三个点...即可。当rest参数是函数的唯一参数时,它就代表了传递给这个函数的所有参数。它起到和前面说的.slice一样的作用,把参数转换为了数组,不需要你再对arguments进行额外的转换了。
拓展运算符可以把任意可枚举对象转换为数组,使用拓展运算符可以高效处理目标对象,在拓展目前前添加...就可以使用拓展运算符了。下例中...arguments就把函数的参数转换为了数组字面量。
function print(a) { return a + b } print(...arr1)
使用拓展运算符,我们也可以把字符串转换为由每一个字母组成的数组:
[...'boj']// <- ['o', 'b', 'j']
使用拓展运算符,还可以拼合数组:
['o', ...strings, 'j']
当你想要取出一个数组的前一个或者两个元素时,常用的解决方案是使用.shift.现在我们可以使用在ES6中,结合使用拓展和解构:
var [first, second, ...other] = ['a', 'b', 'c', 'd', 'e'] // first= 'a',second = 'b',other = ['c','d','e']