自从2015年ES2015发布以后,ECMAScript开始每年进行一次更新。下面是ES即将到来的特性,它们可能会在ES2019或ES2020中实现,相信你一定会喜欢的。
Optional Chaining(安全的链式操作)
在实际编程过程中,我们经常会遇到对象层层嵌套的情况。
const data = {
article: {
user: {
email: '[email protected]',
}
}
}
但是我们实际工作中,经常遇到数据不完整的情况。如果你直接写出data.article.user.email
这样的代码,那么一旦出现
{
article: {
user: {
}
}
}
这样的数据,你的代码就崩溃
Uncaught TypeError: Cannot read property 'email' of undefined
为了提高代码的稳定系,你可能写出
这样的代码
const email = data && data.article && data.article.user && data.article.user.email
console.log(email)
我之前就是这样做的,但是这样太丑陋了。。
新的提案引入了?.
运算符
console.log( data.article?.user?.email)
如果之前的数据不是对象类型,就不会触发后续的操作。
怎么样,是不是一个能提高代码可读性的特性?
Nullish coalescing(空值合并)
我们经常要对一个数据进行空值检测,比如说
var a = value || 'default value'
如果value不为空,就把它的值赋给a,否者给a一个默认值。
上述的代码的问题在于||
运算符把 null
undefined
''
0
false
都看作空值。实际上很多时候后面三者是有意义的值,为了避免这种情况,我们要额外做很多判断。新的??
运算符简化了这点,它只会把 null
undefined
看做空值
var a = false ?? 'default value'
console.log(a) // false
a = false || 'default value'
console.log(a) // 'default value'
Pipeline operator (管道运算符)
看这样的代码
function doubleSay (str) {
return str + ", " + str;
}
function capitalize (str) {
return str[0].toUpperCase() + str.substring(1);
}
function exclaim (str) {
return str + '!';
}
let result = exclaim(capitalize(doubleSay("hello")));
result // "Hello, hello!"
我们经常遇到:把一个函数的返回值作为另一个函数的参数,如果函数嵌套的比较多,上面的代码可读性就会很差,新的提案引入了管道的概念。
对 Linux命令行熟悉的同学,肯定不会对管道陌生。管道运算符就是把前一个函数的返回值当做后一个函数的参数。
let result = "hello"
|> doubleSay
|> capitalize
|> exclaim;
result // "Hello, hello!"
怎么样,这样是不是让代码非常易读?和Linux的管道符一模一样。