• home > webfront > ECMAS > javascript >

    ES2023 新特性:Array find from last与Hashbang Grammar

    Author:zhoulujun Date:

    ECMAScript 2023 对JavaScript语法进行了多方面的增强和改进,主要包括以下几个方面:1,数据类型和数据结构,WeakMap 支持 Symbol 作为 key​、Change Array by Copy、新增两个方法: findLast()、 findLastIndex() 、Hashbang支持

    ECMAScript 2023,也被称为 ES2023,是JavaScript语言的最新标准。

    ECMAScript 2023 对JavaScript语法进行了多方面的增强和改进,主要包括以下几个方面:

    69af7210b15e435c9a9894d1541eb507~tplv-k3u1fbpfcp-zoom-in-crop-mark_1512_0_0_0.png

    数据类型和数据结构

    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 能够记住键的原始插入顺序,且一个键只能出现一次

    f0bf89a92227d6e82ce29856a5b17e44584d7e6db2bc4600d1401684a2586f09.png

    由于 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