正则的扩展
Posted on
In
ECMAScript
基本用法
1 | var regex = new RegExp("xyz", "i") |
match()、replace()、search()、split()
String.prototype.match 调用 RegExp.prototype[Symbol.match]
String.prototype.replace 调用 RegExp.prototype[Symbol.replace]
String.prototype.search 调用 RegExp.prototype[Symbol.search]
String.prototype.split 调用 RegExp.prototype[Symbol.split]
字符串的扩展
Posted on
In
ECMAScript
codePointAt()
JavaScript-16 的格式储存,每个字符固定为两个字节。需要四个字节储存的字符,JavaScript 会认为那是两个字符。
ES6 提供了 codePointAt 方法,能够正确处理四个字节储存的字符,返回一个字符的码点。
String.fromCodePoint()
识别 UTF-32 字符。
includes()、startsWith()、endsWith()
1 | var s = "hello world" |
repeat()
1 | "x".repeat(3) //'xxx' |
解构赋值
Posted on
In
ECMAScript
基本用法
1 | let [a, b, c] = [1, 2, 3] |
顶层对象
Posted on
In
JavaScript
ES6 中,为了保持兼容性,var 和 function 声明的全局变量依旧是顶层对象的属性
1 | var a = 1 //如果在 Node 的 REPL 环境,可以写成 global.a 或者 this.a |
global 对象
- 在浏览器对象中,顶层对象是 window,但 Node 和 Web Worker 没有 window。
- 在浏览器和 Web Worker 中,self 也指向顶层对象,但 Node 没有 self。
- 在 Node 中,顶层对象是 global,但其他环境都不支持。
以下为两种勉强可以取到顶层对象的方法:
1 | //方法一 |
const
Posted on
In
ECMAScript
一旦声明,值不可变
1 | const PI = 3.14 |
只声明不赋值也会报错。
1 | const foo; //SyntaxError: Missing initializer in const declaration |
实质为变量指向的内存地址不可变动
const 只能保证这个指针是固定的,不能控制数据结构的变化。
1 | const foo = {} |
对象冻结方法
使用 Object.freeze 函数,冻结对象
1 | const foo = Object.freeze({}) |
冻结属性的函数
1 | var makeConstant = (obj) => { |
let
Posted on
In
ECMAScript
let 声明的变量在代码块内有效
1 | var a []; |
不存在变量提升
var 命令的变量可以在声明之前使用,值为 undefined
暂时性死区
在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。TDZ(temporal dead zone)
1 | var temp = 123 |
有些死区是不易发现的
1 | function bar(x = y, y = 2) { |
不允许重复声明
1 | function foo() { |
未看书导致的一个坑
Posted on
In
JavaScript
某日被书中一段代码误导
1 | var promise = new Promise(function (resolve, reject) { |
由于前面还有这样一段话
如果 Promise 状态已经变成 Resolved,再抛出错误是无效的。
当时看到这,思索了许久,为什么已经 resolve 了这个 ERROR 还是可以往外抛出呢?
后面发现,settimeout 是一个异步函数,throw 会在下一轮事件循环开始时抛出,所以无论是否 resolve,这个 ERROR 都是会抛出的。
开坑
Posted on