前言

一年半没有写 JS 了, 今天开始来个大复习, 顺便把这么多年零零散散的知识点做成笔记. 练练字.

ES 3, 5, 6, 2017, 2018...

ES 6 等于 ES2015

ES 7 等于 ES2016

以此类推, 年份减一就对了.

通常 ES 6 以后大家都用年份来称呼了.

ES6 是一个大改版, 往后的版本都是添加一些特性而已.

目前 2022 年, 主流游览器都支持 ES 2017 所有特性. 所以可以放心用.

var, let, const (ES6)

参考: 阮一峰 – let 和 const 命令

var 是 ES6 之前的 variable 声明. ES6 开始都用 let, const.

总之没有必要去理会 var 了.

如果变量声明以后还会被修改, 那么用 let.

如果变量声明后不会被修改, 那么用 const.

我的经验几乎 80-90% 以上的 variables 声明都是用 const 的.

globalThis (ES2020)

参考: 阮一峰 – globalThis 对象

globalThis 是 ES2020 引入的.

它在游览器指向 window 对象

console.log(globalThis === window); // true

它在 Node.js 指向 global 对象

console.log(globalThis === global); // true

如果 JS 需要支持 2 个不同环境, 那么就会用到它了.

Template literals / Template string (ES6)

参考: 阮一峰 – 模板字符串

const firstName = 'Derrick';
const lastName = 'Yam';
const fullName = `${firstName} ${lastName}`;
const oldSchool = firstName + ' ' + lastName;

如果模板内想使用 ` 符号就加一个反斜杠在前面 \` 就可以了.

对付讨人厌的反斜杠, 可以使用 String.raw, 它类似于 C# 的 @"" 的功能

let v;
v = `a\\b`;
v = String.raw`a\b`;

注意它的写法, raw 是方法, 但是没有使用元括弧调用, 而是直接拼上 template literals, 这个方式叫 tagged template (标签模板).

Google 的 Lit 也是用这个写法

我们可以理解为 "一个解析 template literals" 的方法调用. 它实际上是下面这样的.

tag 函数内就可以写 template 的处理逻辑了

string includes, startsWith, endsWith (ES6)

console.log('abc'.includes('b')); // true 包含了 b
console.log('abc'.startsWith('a')); // true 开始值是 a
console.log('abc'.endsWith('c')); // true 最后一个值是 c

ES5 也可以实现, 只是有 build-in 肯定更好丫.

string padStart, padEnd (ES2017)

console.log('123'.padStart(5, 0)); // 00123
console.log('123'.padEnd(5, 0)); // 12300

它的作用是, 不够字数就填充. padStart 比较常会用到.

string trimStart, trimEnd (ES2019)

以前只有 trim for 前后 2 边, 现在可以选择只 trim 其中一边.

string repeat (ES6)

顾名思义

console.log('a'.repeat(3)); // aaa

number seperator (es2021)

100万的写法

const a = 1000000;
const b = 1_000_000; // with separator

b 明显比 a 好看多了. C# 7.0 也是有这个哦

p.s. 虽然是 es2021 才支持, 但是如果你用 TypeScript 或 babel 的话, 这类特性都是很早就可以使用多了, 因为可以 downleveling (就是用低版本编译出同样效果的 code).

number isNaN, isFinite (es6)

const a = Number.isNaN(Number('abc')); // true
const b = Number.isFinite(100 / 0); // false

JavaScript 的 number 有 2 中奇葩情况.

1. NaN = not a number. 虽然 typeof 是 number 但它又不是 number. 常出现在强转一个 string 到 number 的情况

2. infinite = 无限, 比如 100 / 0 C# 会报错, 但 JS 不会. 它依然是 number 但是 infinite.

综上要判断一个 number 是不是真的 number, 除了 typeof 一定要在加上 isNaN 和 isFinite 哦.

Number.isNaN vs isNaN

console.log(isNaN('abc')); // true
console.log(Number.isNaN('abc')); // false

不要在用 global 的 isNaN 了, 它会做自动转换. 所以 'abc' 返回 true, 通常这不是我们期望的. Number.isNaN 不会自动转换. 当然 best practice 是先确保类型是 number 才执行 isNaN.

number parseInt, parseFloat (es6)

本来是全局方法, 改成 Number.parseInt 和 Number.parseFloat

用于把 string 转换成 number, 它会把一些多余的 string 去掉哦, 比如

const a = Number.parseInt('4px'); // 4

math trunc (es6)

去掉小数点后的数目 (它只是去掉不会 rounding 哦)

const a = Math.trunc(1.5); // 1

array from (es6)

它可以把类似 array 的对象转换成 array 类型. 所谓的 ArrayLike

const obj = {
0: 'a',
1: 'b',
length: 2,
};
console.log(Array.from(obj));

对象只要用于号码属性和 length 属性就是 ArrayLike

array toReversed、toSorted、toSpliced、with (es2023)

reverse, sort, splice 的 immutable 版本,详情可以看 TypeScript 这篇

array at (es2022)

下面这个是获取 first 和 last item 的方式

const items = ['a', 'b', 'c'];
const firstItem = items[0]; // a
const lastItem = items[items.length - 1]; // c

[0] 还算可以接受, [item.length - 1] 就很丑了。这时就可以使用 .at()

const items = ['a', 'b', 'c'];
const firstItem = items.at(0); // a
const lastItem = items.at(-1) // c

好多了。

注: iPhone IOS Safari 要 v15.4 才支持哦。

object is (es6)

它和 === 差不多, 唯一的区别是 NaN 和 +0 -0 的 compare.

const a = +0 === -0;   // true
const b = NaN === NaN; // false
Object.is(+0, -0); // false
Object.is(NaN, NaN); // true

object fromEntries (es2019)

把 array 变成 object

const keyValuePairs = [
['foo', 'bar'],
['baz', 42]
]
const obj = Object.fromEntries(keyValuePairs); // { "foo": "bar", "baz": 42 }

Optional Chaining (es2020)

参考: 阮一峰 – 链判断运算符

interface Person {
child?: {
grandChild?: {
method?: () => string;
};
};
}
const person: Person = {};
const isUndefined = person.child?.grandChild?.method?.() === undefined; // true

虽然 child, grandChild, method 都是 undefined, 但是却可以串联起来写. 这归功于 ?. 符号.

只要其中一个属性或者方法没有定义, 那么一律返回 undefined.

C# 6.0 也引入了这种写法呢.

Nullish Coalescing (es2020)

参考: 阮一峰 – Null 判断运算符

它的主要用途是拿来 set default value, 从前使用 && 利用类型转换并不是安全的做法 (一不小心会掉坑里)

const value1 = undefined ?? 'default value'; // default value
const value2 = null ?? 'default value'; // default value

配合 Optional Chaining 可以写出

const value = person.child?.grandChild?.method?.() ?? 'default value';

C# 8.0 也引入了这种写法呢.

Logical Assignment Operators (es2021)

参考: 阮一峰 – 逻辑赋值运算符

这个是熟悉的 +=

let index = 1;
index += 1; // 相等于 index = index + 1;

配合 Nullish Coalescing 也可以这样用

let value = 'existing value';
value ??= 'default value'; // 相等于 value = value ?? 'default value';

如果 value 已经有值, 那么就用当前的值, 没有的话就用 default value. (提醒: ?? 对 null 和 undefined 都有效哦)

JavaScript – ES6-ES2023 大杂烩的更多相关文章

  1. [转]JavaScript ES6 class指南

    [转]JavaScript ES6 class指南 前言 EcmaScript 2015 (又称ES6)通过一些新的关键字,使类成为了JS中一个新的一等公民.但是目前为止,这些关于类的新关键字仅仅是建 ...

  2. JavaScript ES6中export及export default的区别

    相信很多人都使用过export.export default.import,然而它们到底有什么区别呢? 在JavaScript ES6中,export与export default均可用于导出常量.函 ...

  3. JavaScript ES6 新特性详解

    JavaScript ES6 带来了新的语法和新的强大功能,使您的代码更现代,更易读 const ,  let and var 的区别: const , let 是 ES6 中用于声明变量的新关键字. ...

  4. JavaScript ES6 核心功能一览

    JavaScript 在过去几年里发生了很大的变化.这里介绍 12 个你马上就能用的新功能. JavaScript 历史 新的语言规范被称作 ECMAScript 6.也称为 ES6 或 ES2015 ...

  5. JavaScript ES6中export及export default的区别以及import的用法

    本文原创地址链接:http://blog.csdn.net/zhou_xiao_cheng/article/details/52759632,未经博主允许不得转载. 相信很多人都使用过export.e ...

  6. JavaScript ES6 核心功能一览(转)

    原文地址:Overview of JavaScript ES6 features (a.k.a ECMAScript 6 and ES2015+) 原文作者:Adrian Mejia 译文出自:掘金翻 ...

  7. JavaScript ES6 promiss的理解。

    本着互联网的分享精神,我将我对promise的理解分享给大家. JavaScript ES6的promise方法主要应用在处理异步函数返回的结果,注意他不是将异步函数转换为同步函数,而是等异步函数有结 ...

  8. JavaScript es6 class类的理解。

    本着互联网的分享精神,在本篇文章我将会把我对JavaScript  es6 class类的理解分享给大家. JavaScript 类主要是 JavaScript 现有的基于原型的继承的语法糖. 类语法 ...

  9. JavaScript ES6功能概述(ECMAScript 6和ES2015 +)

    JavaScript在过去几年中发生了很大的变化.这些是您今天可以开始使用的12项新功能! 该语言的新增内容称为ECMAScript 6.它也称为ES6或ES2015 +. 自1995年JavaScr ...

  10. JavaScript ES6中,export与export default

    自述: 本来是对new Vue()和export default比较懵的,查了一下,发现我理解错了两者的关系,也没意识到export与export default的区别,先简单的记录一下基本概念,后续 ...

随机推荐

  1. webpack4.15.1 学习笔记(九) — 11个基础的插件使用

    目录 html-webpack-plugin clean-webpack-plugin webpack-manifest-plugin HotModuleReplacementPlugin(内置) m ...

  2. oeasy教您玩转vim - 5 - # 插入模式

    插入模式 回忆上节课内容 我们总结了,模式切换的方式 命令模式 Normal mode 底线命令行模式 Command mode 帮助文件的正确打开方式 :h 在文档中使用鼠标 set mouse=a ...

  3. [oeasy]教您玩转python - 0003 - 编写 py 文件

    ​ 编写 py 文件 回忆上次内容 次在解释器里玩耍 了解到字符串就是给一堆字符两边加引号 可以是单引号 也可以是双引号 这样游乐场就知道 这个不是一个名字 而是一个字符串 字符串可以用print函数 ...

  4. 解决react native打包apk文件安装好之后进入应用闪退的问题

    这个是我一个前端前辈帮我弄的,自己解决的时候不行,她去官网找了相关的问题,然后发给我的. react-native android 的release安装包运行闪退,但是debug运行正常 环境:0.6 ...

  5. ArcGIS for Android入门(Java):ViewPage + Fragment 底部导航栏添加地图

    修改为ViewPage + Fragment 可以参考里面runoob的教程:我也是参考这个修改的:这前面的网上都有很多相应的教程,我觉得这一部分的难点主要是在Fragment里面加载地图: 在fra ...

  6. SemanticKernel/C#:使用Ollama中的对话模型与嵌入模型用于本地离线场景

    前言 上一篇文章介绍了使用SemanticKernel/C#的RAG简易实践,在上篇文章中我使用的是兼容OpenAI格式的在线API,但实际上会有很多本地离线的场景.今天跟大家介绍一下在Semanti ...

  7. python语言下的迷宫游戏的实现猜想

    由于本人是研究AI的,尤其是AI的强化学习方向,有时候就会对一些小游戏环境的实现有几分兴趣,因为刚看了有关reinforcement learning解决maze游戏的论文,于是就突发奇想的对这个ma ...

  8. 【转载】 ImportError: libGL.so.1: cannot open shared object file: No such file or directory——docker容器内问题报错

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_35516745/article/de ...

  9. gym中所有可以用的模拟环境

    python 代码: from gym import envs for env in envs.registry.all(): print(env.id) 打印出可用环境: Copy-v0 Repea ...

  10. 强化学习:AC算法中为什么不使用Q函数来表示优势函数

    强化学习中的策略梯度法(PG)不直接使用Q函数作为值函数来进行计算已经在Sutton的PG公式证明中提出,主要作用就是减少方差,因此使用优势函数进行计算.作为PG算法类中最常见的AC类算法有着较多的使 ...