这是之前学ES6做的学习笔记中的一部分,还请辩证看待。想了解更多关于ES6的,感觉阮一峰老师写的《ES6入门》挺详细,还有网上也有很多牛人翻译了很多优质的笔记,可以上简书看看、很多论坛也有资料,如果能读懂ES6英文版的那更好,锻炼了你的英文水平又更精准的学ES6。如果学习React、或者Vue,ES6很重要。‘’q(·^o^·)p‘’
刚开始听到这个名字的时候,原谅我孤陋寡闻,只知道简写之类的,专业名词真的不懂。然后百度了一下,名字还是蛮新奇的‘^^’`。
语法糖:也译为糖衣语法,是由语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会
实际上从面向过程到面向对象也是一种语法糖,C语言可以通过它的指针、类型转换,结构体实现面向对象的编程风格,但是C++更进一步的推广了这种风格,更加易用,不过到了C#把OO的风格发挥得淋漓尽致。OO的编程风格对于面向过程来说是不是一种语法糖呢?如果生硬地照此理解,只有计算机硬件指令才不算语法糖,而其他一切利用编译器、汇编器将代码抽象,和自然语言更相近的手段都算语法糖。
ES6为一些已有的功能提供了非破坏性更新,这类更新中的大部分我们可以理解为语法糖,称之为语法糖,意味着,这类新语法能做的事情其实用ES5也可以做,只是会稍微复杂一些。
var student = {
name: 'vita',
stuID: 12,
}
ES5中:
var listeners = []
function listen(){}
var events = {
listeners: listeners,
listen: listen
}
ES6中
var listeners = [];
function listen(){}
var events = {listeners,listen} //这样就减少了重复的代码
使用对象字面量的简洁写法让我们在不影响语义的情况下减少了重复代码。
ES6的对象字面量方法简写允许省略对象方法的function
关键子以及方法后面的冒号,例如:
var person = {
on: function(name,age){
....
}
}
var person= {
on(name,age){...}
}
变量/属性,有时还会被直接调用:
var example = function(event){}
ES6中匿名函数的写法–>箭头函数。箭头函数不需要使用function
关键字,其参数和函数体之间以 => 相连接
var exmaple =(parametrs)=>{}
new
关键字this
, arguments
,super
等都指向包含箭头函数的上下文,箭头函数本身不产生新的上下文。注意:箭头函数的作用域不能通过.call
、apply
,bind
等语法来改变,这使得箭头函数的上下文将永久不变。
1、当参数只有一个的时候,可以省略箭头函数参数两侧的括号
var double = value => {
return value * 2
}
2、对只有单行表达式且该表达式的值为返回值的箭头函数来说,表征函数体的{}可以省略,return
关键字可以省略,会静默返回该单一表达式的值
var double = (value) => value * 2
3、上面两种的合并
var double = value =>value * 2
当简写函数返回值为一个对象时,需要用小括号括起你想返回的对象。否则浏览器会把对象的{}
解析成箭头函数函数体的开始和结束标记。
//正确的使用形式
var obj = () =>({modular:'es6'})
[1,2,4].map(value =>{number:value}) //没有小括号会把{}当做函数执行体 --> [undefined, undefined, undefined]
[1,2,4].map(value =>({number:value})) //[{number:1},{number:2},{number:4}]
ES6不一定比ES5好,是否使用主要看其能否改善代码的可读性和可维护型,箭头函数也并非适用于所有情况。
this
,使用箭头函数是简是简洁的,采用函数式编程也是如此。[1,2,3,4]
.map(value => value * 2)
.filter(value => value > 2)
.forEach(value => console.log(value));
//打印
4
6
8
// 描述Bruce Wayne的对象
var character = {
name: 'Bruce',
pseudonym: 'Batman',
metadata: {
age: 34,
gender: 'male'
},
batarang: ['gas pellet', 'bat-mobile control', 'bat-cuffs']
}
有一个名有pseudonym的变量,要让它指向character.preudonym,
使用ES5
var presudonym = character.preudonym
使用ES6
var {presudonym} =character
var {presudonmy, name} = character
var {presudonmy} = character, two = 2
:
即可var {presudonmy: alias} = character
console.log(alias); //'Batman'
var {metadata:{gender}} = character
var {metadata:{gender: characterGender}} = character
undefined
ES5中,未经声明就被调用的值也会得到 undefined
var {t} = character
console.log(t);//undefined
对于多层解构,如果一个属性不存在,然后继续多层解构,那么程序就会抛出异常。好比你调用undefined
或者null
的属性会出现异常
var {t { aa}} = character
// Exception
var {message} = null
// Exception
var {boots = {size : 10}} = character; // {size: 10}
转换成ES5是
var _character = character,
_character$boots = _character.boots,
boots = _character$boots === undefined ? { size: 10 } : _character$boots;
var{['boo' + 'ts']: characterBoots} = character
console.log(characterBoots) //true
中括号[]
var coordinates = [12, -7];
var [x,y] = coordinates
console.log(x);// 12
var name = ['vt','fr','LL'];
var[firstname,,lastName] = names
console.log(lastName) //"LL"
var name = ['vt','fr','LL'];
var[firstname = 'vita',,lastName = 'Lin'] = names
console.log(lastName) //"Lin"
var left = 5, right = 7;
[left, right] = [right, left]
()
括起来function sumOf(a = 1,b = 2,c = 3){
return a+b+c
}
console.log(sumOf(undefined,undefined,4)) // <- 1 + 2+ 4
通过函数参数解构,可以解决JS中存在的一个问题,解决传入的参数只包含一个属性,另外一个会失效的问题
function carFactory({ brand = 'Volkswagen', make = 1999 }) {
console.log(brand)
console.log(make)
}
carFactory({ make: 2000 })
// <- 'Volkswagen'
// <- 2000
这样做还存在一定的问题,调用函数时,如果参数为空,即carFactory
函数将抛出异常。这种问题可以通过下面的方法来修复
function carFactory({
brand = 'Volkswagen',
make = 1999
} = {}){
console.log(brand)
console.log(make)
}
carFactory()
// <- 'Volkswagen'
// <- 2000
上面代码添加了一个空对象作为options
的默认值,当函数调用时,如果参数为空,会自动以{}作为参数
当一个函数的返回值为对象或则数组时,使用解构,可以非常简介的获取返回对象中某个属性的值。 比如 下面的例子,函数 getValue()返回了一系列的值,如果我们只想用其中的 x、y
,可以这样写,解构帮助我们避免了很多中间变量的使用,提高代码的可读性
function getValue(){
return {x: 10, y: 22, z: -1,type:'3d'}
}
var {x,y} = getValue()