JavaScript this 上下文测试器 - 不同调用方式下的指向
编写函数并选择调用方式(普通、方法、call、apply、箭头等),输出 this 的值。
UD5工具箱
. 和方括号 [0] 表示法
| 访问方式 | 代码 | 结果 |
|---|---|---|
| 直接访问 | |
|
| 可选链 ?. | |
|
| 可选链 + ?? | |
可选链操作符 ?. 是 ES2020 引入的语法,用于安全地访问深层嵌套的对象属性。
当访问链中某个中间值为 null 或 undefined 时,表达式会短路返回 undefined,而不是抛出 TypeError。
语法形式:
obj?.prop — 安全访问属性obj?.[expr] — 安全访问动态属性fn?.() — 安全调用函数arr?.[index] — 安全访问数组索引示例:
// 不用可选链
const city = user && user.profile && user.profile.address && user.profile.address.city;
// 使用可选链
const city = user?.profile?.address?.city; // 安全、简洁
空值合并操作符 ?? 也是 ES2020 引入的。当左侧值为 null 或 undefined 时返回右侧的默认值。
与逻辑或 || 的关键区别:
| 值 | || '默认' | ?? '默认' |
|---|---|---|
null | '默认' | '默认' |
undefined | '默认' | '默认' |
''(空字符串) | '默认' | '' |
0 | '默认' | 0 |
false | '默认' | false |
NaN | '默认' | NaN |
?? 只把 null 和 undefined 视为空值,而 || 把所有假值都视为空值。
两者经常组合使用,实现安全的深层访问 + 兜底默认值:
// 安全访问 + 默认值
const theme = user?.settings?.theme ?? 'light';
// 等价于
const theme = (user && user.settings && user.settings.theme != null)
? user.settings.theme
: 'light';
最佳实践:使用 ?.?? 链可以让代码更健壮、更可读。
可以!可选链支持三种形式:
obj?.prop — 属性访问arr?.[0] — 数组索引访问(安全访问可能为空的数组)fn?.() — 函数调用(安全调用可能不存在的函数)// 安全访问数组
const firstItem = apiResponse?.data?.items?.[0]?.name ?? '未知';
// 安全调用回调
callback?.(); // 如果 callback 为 null/undefined,什么都不发生
// 安全访问动态属性
const val = obj?.[dynamicKey];
可选链 ?. 和空值合并 ?? 在现代浏览器中得到广泛支持:
对于需要兼容旧浏览器的项目,可以使用 Babel 或 TypeScript 进行转译。
可选链的性能开销极小,现代 JS 引擎已对其进行了深度优化。
相比手动编写 && 短路判断,可选链在大多数情况下性能相当甚至更优,因为引擎可以更好地预测和优化这种标准模式。
建议:优先考虑代码可读性和安全性,不要过早优化。在绝大多数场景中,可选链的性能影响可以忽略不计。
不能。可选链只能用于读取操作,不能用于赋值。
// ❌ 错误:可选链不能用于赋值
obj?.prop = 'value'; // SyntaxError
// ✅ 正确:先判断再赋值
if (obj != null) {
obj.prop = 'value';
}
// 或者
obj && (obj.prop = 'value');
这是因为可选链的设计目的是安全读取,赋值目标必须明确存在。
典型使用场景:
总的来说,任何数据来源不确定的深层访问都适合使用可选链。
TypeScript 从 3.7 版本开始支持可选链,与 JavaScript 语法完全一致:
interface User {
profile?: {
address?: {
city: string;
};
};
}
const user: User | null = getUser();
// TypeScript 中安全访问,类型自动推断为 string | undefined
const city = user?.profile?.address?.city ?? '未知城市';
TypeScript 会正确推断可选链结果的类型(自动加上 | undefined),配合 ?? 可以精确控制最终类型。
编写函数并选择调用方式(普通、方法、call、apply、箭头等),输出 this 的值。
并列播放所有CSS内置缓动函数(ease, linear等)的动画效果,方便对比选择。
编写嵌套函数并单步执行,直观展示每个函数的作用域和闭包变量。
在浏览器中即时测试for、forEach、map、for-of等循环的执行速度,帮助选择最优写法。
监听全局错误事件和未处理的 Promise 拒绝,在仪表板上展示错误堆栈和发生次数。
粘贴 package.json 内容,检查必填字段、许可证合规、依赖版本格式等常见问题。
勾选需要展示的选项(接受/拒绝/设置),生成纯净HTML/JS代码,自行套用样式。
创建一个 Proxy,定义各种陷阱函数,操作对象时实时显示被拦截的属性和行为。
显示当前页面的JavaScript堆内存快照和使用限制,辅助内存泄漏调试。
编写带有伪类的选择器,实时高亮匹配的HTML元素,探索现代CSS选择器的能力。
搜索CSS属性,显示其在主流浏览器的支持范围和前缀需求,快速避免踩坑。
搜索CSS属性和选择器,展示在主流浏览器的支持版本和全局使用率百分比。
模拟显示各个HTML元素在典型浏览器中的默认CSS属性表,辅助CSS Reset决策。
选择触发位置、箭头方向与样式,生成轻量悬停提示框代码。
勾选或调整所需的重置元素(盒模型、边距等),生成自定义CSS Reset片段,确保跨浏览器一致性。
在 ES 模块中直接使用顶层 await,观察执行顺序和依赖加载。
可视化选择操作(访问、点击、断言等),自动生成 Cypress 测试代码。
在线正则表达式测试工具,支持JavaScript正则匹配、替换、提取等操作,即时显示匹配结果和高亮。
配置内容和位置,生成使用最新HTML popover属性的轻量弹窗代码,无需JavaScript。
利用隐藏的checkbox和CSS兄弟选择器实现无需JS的暗黑/明亮主题切换。
通过勾选元素关系(子孙、兄弟)、属性、伪类等条件,自动生成精确的CSS选择器字符串。
选择多张图片或纯色叠加,切换所有CSS混合模式并实时预览图层效果。
应用 contain 的各种值(layout, paint, size),直观对比开启前后渲染和布局的变化。
注册带类型的 CSS 自定义属性,观察其如何支持过渡动画和继承效果。
粘贴HTML并编写XPath表达式,高亮显示匹配的节点并提取文本。
自定义箭头方向、颜色、大小和动画,生成无需JavaScript的纯CSS tooltip组件代码。
为内容区域生成灰色闪烁的骨架屏占位代码,包含卡片、标题等组件样式。
粘贴结构化数据代码,模拟Google结构化数据测试,检查错误与丰富结果。
设定物理页框数,输入页引用串,动画展示不同页面置换算法的缺页率。
输入文本,滑块调节letter-spacing和word-spacing,实时显示效果并复制CSS。