ES2023 新特性:Array find from last与Hashbang Grammar
Author:zhoulujun Date:
ECMAScript 2023,也被称为 ES2023,是JavaScript语言的最新标准。
ECMAScript 2023 对JavaScript语法进行了多方面的增强和改进,主要包括以下几个方面:
数据类型和数据结构
WeakMap 支持 Symbol 作为 key
WeakMap 原本只支持 object 类型的 key,现在支持了 Symbol 类型作为 key。
const weak = new WeakMap(); weak.set(Symbol('symbol1'), {});
在 JavaScript 中,Objects 和 Symbols 被保证是唯一并且不能被重新创建的,这使得它们都是 WeakMapkeys 的理想候选者。以前的版本或规范只允许以这种方式使用 Objects ,但新的提案将 Symbols 添加到允许的键列表中。
WeakMap 与 Map的区别,以及为什么要用WeakMap
WeakMap只接受对象(null除外)和 Symbol 值作为键名,Map 对象的键可以是任何类型
Map所构建的实例需要手动清理,才能被垃圾回收清除,可能会导致内存泄漏,因为数组会一直引用着每个键和值;而WeakMap只要外部的引用消失,所对应的键值对就会自动被垃圾回收清除。
WeakMap 的键是弱引用的,因此对象不可枚举。如果想要对象的 key 值列表,应该使用Map。如果要往对象上添加数据,又不想干扰垃圾回收机制,就可以使用 WeakMap。
使用
Symbol
作为WeakMap
的key
可以更清晰地表明它的键和映射项的角色关系,而不需要创建一个只用作键的新对象。由于 Symbol 类型的属性名是唯一的,可以避免属性名冲突问题。Map 能够记住键的原始插入顺序,且一个键只能出现一次
由于 WeakSet 内部有多少个成员,取决于垃圾回收机制有没有运行,运行前后很可能成员个数是不一样的,而垃圾回收机制何时运行是不可预测的,因此 ES6 规定 WeakSet 不可遍历
具体查看:https://es6.ruanyifeng.com/#docs/set-map#WeakSet
Change Array by Copy
很多数组的方法会改变原数组,比如push()、pop()、reversed()、sort()等等,我们称它们为破坏性方法,只要调用了数组这些方法,它的值就变了。
非破坏性方法,比如我们经常用到的 filter、some、map、find 等方法,都是不会改变原数组的。
如果想要不改变原数组,就意味着我们需要复制一个新数组,再使用这些方法。
现在新增了4个数组的方法,允许对数组进行操作时,不改变原数组,返回一个原数组的拷贝。
toReversed():是 reverse() 的非破坏性版本:
toSorted():是 sort() 的非破坏性版本:
toSpliced(start, deleteCount, ...items):是splice()的非破坏性版本:
with():是修改数组指定索引值的非破坏性版本
新增两个方法: .findLast()、.findLastIndex()
从数组的最后一个元素开始查找,可以同 find()、findIndex() 做一个对比。
const arr = [{ value: 1 }, { value: 2 }, { value: 3 }, { value: 4 }]; // find vs findLast console.log(arr.find(n n.value % 2 === 1)); // { value: 1 } console.log(arr.findLast(n n.value % 2 === 1)); // { value: 3 } // findIndex vs findLastIndex console.log(arr.findIndex(n n.value % 2 === 1)); // 0 console.log(arr.findLastIndex(n n.value % 2 === 1)); // 2
总结是:在频繁操作的情况,除了with(),非破坏性方法比破坏性方法性能表现更好,可以有效提高性能。
语法层面
Hashbang
Hashbang 语法是用来指定脚本文件的解释器是什么
Hashbang 也叫 Shebang,是一个由井号和叹号构成的字符序列 #!,用来指定使用哪种解释器执行此文件
在文件中存在Shebang的情况下,类Unix操作系统的程序加载器会分析Shebang后的内容,将这些内容作为解释器指令,并调用该指令,并将载有Shebang的文件路径作为该解释器的参数
例如,以指令#!/bin/sh开头的文件在执行时会实际调用/bin/sh程序(通常是Bourne shell或兼容的shell,例如bash、dash等)来执行。这行内容也是shell脚本的标准起始行。
语法规则是在脚本文件头部增加一行代码:#!/usr/bin/env node。
// hashbang.js #!/usr/bin/env node console.log('hashbang'); // nohashbang.js console.log('no hashbang')
在终端执行,没有 Hashbang 时,需要使用 node 指令才能执行
参考文章:
ES2023新特性 https://juejin.cn/post/7265212750363770940
转载本站文章《ES2023 新特性:Array find from last与Hashbang Grammar》,
请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/js/2023_1231_9054.html