每年都有一些新的属性进入ECMA262标准,今年发布的ECMAScript2019/ES10同样也有很多新的特性,本文将会挑选一些普通开发者会用到的新属性进行深入的解读。
Array.prototype.flat()
The flat() method creates a new array with all sub-array elements concatenated into it recursively up to the specified depth. -- MDN
简单来说flat这个函数就是按照一定的深度depth将一个深层次嵌套的数组拍扁, 例子:
const nestedArr = [1, 2, [3, 4, [5, 6, [7, [8], 9]]], 10] console.log(nestedArr.flat()) // [1, 2, 3, 4, [5, 6, [7, [8], 9]], 10] console.log(nestedArr.flat(2)) // [1, 2, 3, 4, 5, 6, [7, [8], 9], 10] console.log(nestedArr.flat(3)) // [1, 2, 3, 4, 5, 6, 7, [8], 9, 10] console.log(nestedArr.flat(4)) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] console.log(nestedArr.flat(Infinity)) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
由上面的例子可以看出flat会按照指定的深度depth将一个数组扁平化,如果需要将数组完全拍扁变成一维数组,则指定depth为无限大,即是Infinity,相反如果不指定深度,其默认值是1。
Array.prototype.flatMap()
The flatMap() method first maps each element using a mapping function, then flattens the result into a new array. It is identical to a map() followed by a flat() of depth 1, but flatMap() is often quite useful, as merging both into one method is slightly more efficient. -- MDN
简单来说flatMap等于一个数组先调用完map函数再调用flat函数将其扁平化,扁平化的深度固定为1,先通过一个简单的例子感受一下:
const myArr = [1, 2, 3] myArr .map(n => [n * n]) // [[1], [4], [9]] .flat() // [1, 4, 9] // 用flatMap可以一步到位 myArr.flatMap(n => [n * n]) // [1, 4, 9]
从上面的例子来看flatMap如果只是将flat和map做了一个简单的组合好像可有可无,其实不然,flatMap有个强大的功能是可以在map的时候添加和删除元素,这个无论是map还是filter都没有这个功能。
要想删除某一个元素只需要在mapper函数里面返回一个空的数组[], 而增加元素只需在mapper函数里面返回一个长度大于1的数组,具体可以看下面的例子:
// 假如我们想要删除掉原数组里面所有的负数,同时将单数转换为一个复数和1 const a = [5, 4, -3, 20, 17, -33, -4, 18] // |\ \ x | | \ x x | // [4,1, 4, 20, 16,1, 18] a.flatMap(n => (n < 0) "color: #ff0000">Object.fromEntries()The Object.fromEntries() method transforms a list of key-value pairs into an object. --MDN
fromEntries方法将一个iterable对象返回的一系列键值对(key-value pairs)转换为一个object。先看一个简单的例子理解一下:
// key-value pairs数组 const entriesArr = [['k1', 1], ['k2', 2]] console.log(Object.fromEntries(entriesArr) // {k1: 1, k2: 2} const entriesMap = new Map([ ['k1', 1], ['k2', 2] ]) // {"k1" => 1, "k2" => 2} console.log(Object.fromEntries(entriesMap)) // {k1: 1, k2: 2}再来看一个自定义的iterable对象例子深入理解一下:
const iteratorObj = { [Symbol.iterator]: function () { const entries = [['k1', 1], ['k2', 2]] let cursor = 0 return { next() { const done = entries.length === cursor return { value: done "htmlcode">const studentMap = { student1: {grade: 80}, student2: {grade: 50}, student3: {grade: 100} } const goodStudentMap = Object.fromEntries( Object .entries(studentMap) .filter(([_, meta]) => meta.grade >= 60) ) console.log(goodStudentMap) // {student1: {grade: 80}, student3: {grade: 100}}String.prototype.trimStart
这个方法很简单,就是返回一个将原字符串开头的空格字符去掉的新的字符串,例子:
const greeting = ' Hello world! ' console.log(greeting.trimStart()) // 'Hello world! '这个方法还有一个别名函数,叫做trimLeft,它们具有一样的功能。
String.prototype.trimEnd
这个方法和trimStart类似,只不过是将原字符串结尾的空格字符去掉,例子:
const greeting = ' Hello world! ' console.log(greeting.trimEnd()) // ' Hello world!'这个方法也有一个别名函数,叫做trimRight, 它们也具有一样的功能。
Symbol.prototype.description
The read-only description property is a string returning the optional description of Symbol objects. -- MDN
ECMAScript2019给Symbol对象添加了一个可选的description属性,这个属性是个只读属性,看看例子:
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) // falsetry 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') //}"以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]