console.log(Symbol('desc').description) // desc console.log(Symbol.for('desc').description) // desc // 一些内置的Symbol也有这个属性 console.log(Symbol.iterator.description) // Symbol.iterator // 如果初始化时没有带description,这个属性会返回一个undefined,因为这样才说这个属性是可选的 console.log(Symbol().description) // undefined // 这个属性是只读的,不能被设置 Symbol.iterator.description = 'mess it' console.log(Symbol.iterator.description) // Symbol.iterator
这个新的属性只要是为了方便开发者调试,不能通过比较两个Symbol对象的description来确定这两个Symbol是不是同一个Symbol:
var s1 = Symbol("desc") var s2 = Symbol("desc") console.log(s1.description === s2.description) // true console.log(s1 === s2) // false
try catch optional binding
ECMAScript2019之后,你写try...catch时如果没必要时可以不用声明error:
// ECMAScript2019之前,你一定要在catch里面声明error,否则会报错 try { ... } catch (error) { } // 可是有时候,你确实用不到这个error对象,于是你会写这样的代码 try { ... } catch (_) { ... } // ECMAScript2019后,你可以直接这样写了 try { ... } catch { ... }
虽然这个新属性可以让你省略掉error,可是我觉得开发者应该避免使用这个属性,因为在我看来所有的错误都应该被处理,至少应该被console.error出来,否则可能会有一些潜在的bug,举个例子:
let testJSONObj try { testJSONObj = JSON.prase(testStr) } catch { testJSONObj = {} } console.log(testJSONObj)
以上代码中无论testStr是不是一个合法的JSON字符串,testJSONObj永远都是一个空对象,因为JSON.parse函数名写错了,而你又忽略了错误处理,所以你永远不会知道这个typo。
稳定的排序 Array.prototype.sort
ECMAScript2019后Array.sort一定是个稳定的排序。什么是稳定排序?所谓的稳定排序就是:假如没排序之前有两个相同数值的元素a[i]和a[j],而且i在j前面,即i < j,经过排序后元素a[i]依然排在a[j]元素的前面,也就是说稳定的排序不会改变原来数组里面相同数值的元素的先后关系。看个例子:
var users = [ {name: 'Sean', rating: 14}, {name: 'Ken', rating: 14}, {name: 'Jeremy', rating: 13} ] users.sort((a, b) => a.rating - b.rating) // 非稳定的排序结果可能是 // [ // {name: 'Jeremy', rating: 13}, // {name: 'Ken', rating: 14}, // {name: 'Sean', rating: 14} // ] // 虽然Sean和Ken具有同样的rating,可是非稳定的排序不能保证他们两个的顺序在排序后保持不变 // ECMAScript2019后,Array.sort将是一个稳定的排序,也就是说它可以保证Sean和Ken两个人的顺序在排序后不变 // [ // {name: 'Jeremy', rating: 13}, // {name: 'Sean', rating: 14}, // {name: 'Ken', rating: 14} // ]
改进Function.prototype.toString()
ECMAScript2019之前,调用function的toString方法会将方法体里面的空格字符省略掉,例如:
function hello() { console.log('hello word') } console.log(hello.toString()) //'function hello() {\nconsole.log('hello word')\n}'
ECMAScript2019之后,要求一定要返回函数源代码(保留空格字符)或者一个标准的占位符例如native code,所以ECMAScript2019之后,以上的输出会变为:
console.log(hello.toString()) //"function hello() { // console.log('hello word') //}"