DanLevy.net

测验:你了解现代 JavaScript 吗?

展示你卓越的 JavaScript 技能!

你了解 ES2015 与 ES2022 的区别吗?

result 的值是多少?

console.log(null ?? 100);

只有 null 和 undefined 会触发这个回退值。

空值合并运算符(??)在左侧操作数 (a) 为 null 或 undefined 时返回右侧操作数 (b)。本例中 a 为 null,因此 result 为 100。

以下代码的输出会是什么?

const value = false;
const defaultVal = 42;
console.log(value ?? defaultVal);

false 与 null、undefined 有什么区别?

空值合并运算符(??)将 false 等 falsy 值视为有效值。由于 value 为 false,它被视为有效并直接返回。

以下代码的输出是什么?

const obj = { foo: null };
const result = obj.foo?.bar;
console.log(result);

可选链遇到 null 时是继续访问,还是短路返回?

可选链运算符 (?.) 在左侧为 null 或 undefined 时会停止求值。由于 obj.foo 为 null,obj.foo?.bar 的结果是 undefined。

以下代码的输出是什么?

const a = 42n;
const result = a * 2n;
console.log(result);

检查两个乘数是否都带有 BigInt 的 n 后缀。

BigInt 值通过在数字后添加 n 创建。不能在算术运算中混合使用 BigInt 和普通数字。这里两个值都是 BigInt,所以乘法可以进行,结果是 84n。

这会输出什么?

const modulePromise = import('./myModule.js');
console.log(typeof modulePromise);

注意 typeof 检查的是返回值的类型,不是构造函数名称。

import() 函数返回一个 Promise,该 Promise 解析为模块对象。由于 Promise 实例是对象,typeof modulePromise 会输出 'object'。

以下代码的结果会是什么?

const promises = [
Promise.resolve('success'),
Promise.reject('error')
];
Promise.allSettled(promises).then(results => {
console.log(results[0].status + ': ' + results[0].value);
});

区分 Promise 状态名称的实际字符串与中文解释。

Promise.allSettled 返回一个数组,数组中的对象描述每个 promise 的结果。第一个 promise 是 fulfilled,其值为 'success',因此日志会打印 fulfilled: success。

str.matchAll() 返回什么?

const str = 'foo1bar2baz3';
const matches = str.matchAll(/\d/g);

结果可以被迭代,是否意味着它已经是数组?

String.matchAll 返回匹配的迭代器,而不是数组。可以使用该迭代器获取字符串中的所有匹配组。

import.meta.url 表示什么?

console.log(import.meta.url);

这是模块的元数据,不是执行时间信息。

import.meta 是一个包含当前模块元数据的对象。import.meta.url 属性表示当前模块的 URL,可用于获取脚本运行位置的信息。

逻辑赋值后 a 的值是多少?

let a = null;
a ||= 10;
console.log(a);

逻辑或赋值判断的是假值,而不仅仅是空值。

逻辑或赋值运算符 (||=) 会在左侧值为 falsy(null、undefined、0、false 等)时将右侧值赋给左侧。因为 a 为 null,所以它被赋值为 10。

在空值赋值后,b 的值是多少?

let b = null;
b ??= 10;
console.log(b);

空值合并赋值在什么情况下才会执行赋值?

空值合并赋值 (??=) 会在左侧值为 null 或 undefined 时赋予右侧的值。由于 b 为 null,它被赋值为 10。

WeakRef 提供了什么?

const obj = { data: 'important' };
const ref = new WeakRef(obj);
console.log(ref.deref());

目标对象仍然被强引用时,deref() 会得到什么?

WeakRef 提供对对象的弱引用,如果没有其他引用存在,对象可以被垃圾回收。由于这里 obj 仍被强引用,deref() 返回原始对象。如果目标已被回收,deref() 将返回 undefined。