主要观点:介绍 JavaScript 中一些较隐晦的怪异特性,包括eval
比想象中更糟、JS 循环中变量按值捕获的假象、一个虚假的对象、字符与字符串迭代、稀疏数组、奇怪的自动分号插入(ASI) quirks 等,且这些特性在各种 JavaScript/ECMAScript 环境中都可能出现,无论是否启用use strict
。
关键信息:
eval
在函数调用时有特殊处理,会影响代码优化和构建工具,如(0, eval)(...)
与eval(...)
不同。- JS 循环中变量按值捕获,在循环中定义的变量行为特殊,若在循环外定义则按引用捕获,这与大多数人的直觉不同。
document.all
在浏览器中是一个虚假对象,为兼容 IE 而存在,其性能比document.getElementById
慢。- JavaScript 字符串编码为 UTF-16,一些字符由多个 Unicode 代码点组成,不同的“字符串长度”概念会导致混淆,
Intl
API 可用于处理此问题。 - 稀疏数组是一种特殊数组,其元素可能为
undefined
,Array
构造函数默认创建稀疏数组,应避免使用。 - 自动分号插入(ASI)可能导致代码行为与预期不同,其机制较为复杂,新语法可能会破坏旧代码。
重要细节: eval
的特殊处理在ECMAScript 标准中有规定,规范中的这一“hack”虽被优化但仍使构建工具和引擎更复杂。- 在 JS 中,循环变量按值捕获的行为在ECMAScript 标准中有规定,展开 for 循环的规范方式展示了这种特殊行为。
document.all
的虚假性在ECMAScript 标准中有规定,是为兼容 IE 而在其他浏览器中实现的。- 字符串长度的不同概念及相关示例,如通过
Intl.Segmenter
处理字符串迭代时的结果与直观理解的差异。 - 稀疏数组的特性通过
Object.entries
展示,以及创建非稀疏数组的正确方式,如使用fill
或Array.from
。 - ASI 的机制在ECMAScript 标准中有规定,新语法可能影响旧代码,存在特殊的“restricted productions”。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。