顶层对象的属性
众所周知,浏览器全局环境指的是window,而Node中指的是global对象。在es6之中顶层对象的属性与全局变量是等价的。
window.a = 1
a // 1
a = 2
window.a // 2
复制代码
上述代码可以看到,顶层对象的属性赋值和全局变量的赋值是同一件事。
es6为两保持兼容性,var 和 function命令声明的全局变量,依旧是顶层对象的属性。而let const calss命令声明的全局变量,不属于顶层对象的属性。
var a = 1
window.a // 1
let b = 2
window.b // undefined
复制代码
globalThis对象
javaScript语言存在一个顶层对象,它提供全局环境(即全局作用域),所有代码都是在这个环境中运行。但是顶层对象在各种实现里面是不一统一的。
es2020在语言标准的层面,引入了globalThis作为顶层对象。意味着,在任何环境下,globalThis都是存在的,都可以从它拿到顶层对象,指向全局环境下的this
数值和布尔值的解构赋值
解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。
let {toString: s} = 123;
s === Number.prototype.toString // true
let {toString: s} = true;
s === Boolean.prototype.toString // true
复制代码
上述代码中,数值和布尔值的包装对象都有toString属性,因此变量s都能取到值。
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。
null和undefined无法转为对象,所以对它们进行解构赋值会报错。
标签模版
模版字符串的功能,还可以紧跟在一个函数名后面,该函数将被调用来处理这个模版字符串。这就是标签模版。
标签模版不是模版,俄式函数调用的一种特殊形式。 标签指的就是函数,紧跟在后面的模版字符串就是它的参数。
但是,如果模板字符串里面有变量,就会将模板字符串先处理成多个参数,再调用函数。
function tag() {
return 'tag';
}
let name = "Joh";
var res = tag`hello ${name}`;
console.log(res); // tag
复制代码
上述代码,未经处理的标签函数与模板字符串的结合,导致模板字符串失效。
标签模板的一个重要应用,就是过滤HTML字符串,防止用户输入恶意内容
指数运算符
** 表示指数运算符
2 ** 2 // 4
2 ** 3 // 8
// 运算符的一个特点是右结合。多个指数运算符连用时,是从最右边开始计算的。
2 ** 3 ** 2 // 512
let a = 1.5
a **= 2 // 等价于 a = a * a
let b = 4
b **=3 // 等价于 b = b * b * b
复制代码
BigInt类型
是es2020引入的一种新数据类型(基本类型)。
BigInt只用来表示整数,没有位数的限制,任何位数的整数都可以精确表示。
BigInt类型的数据必须添加后缀 n
typeof 123n // 'bigint'