关于 JavaScript 的怪异之处 - Stack Auth

主要观点:介绍 JavaScript 中一些较隐晦的怪异特性,包括eval比想象中更糟、JS 循环中变量按值捕获的假象、一个虚假的对象、字符与字符串迭代、稀疏数组、奇怪的自动分号插入(ASI) quirks 等,且这些特性在各种 JavaScript/ECMAScript 环境中都可能出现,无论是否启用use strict
关键信息:

  • eval在函数调用时有特殊处理,会影响代码优化和构建工具,如(0, eval)(...)eval(...)不同。
  • JS 循环中变量按值捕获,在循环中定义的变量行为特殊,若在循环外定义则按引用捕获,这与大多数人的直觉不同。
  • document.all在浏览器中是一个虚假对象,为兼容 IE 而存在,其性能比document.getElementById慢。
  • JavaScript 字符串编码为 UTF-16,一些字符由多个 Unicode 代码点组成,不同的“字符串长度”概念会导致混淆,IntlAPI 可用于处理此问题。
  • 稀疏数组是一种特殊数组,其元素可能为undefinedArray构造函数默认创建稀疏数组,应避免使用。
  • 自动分号插入(ASI)可能导致代码行为与预期不同,其机制较为复杂,新语法可能会破坏旧代码。
    重要细节:
  • eval的特殊处理在ECMAScript 标准中有规定,规范中的这一“hack”虽被优化但仍使构建工具和引擎更复杂。
  • 在 JS 中,循环变量按值捕获的行为在ECMAScript 标准中有规定,展开 for 循环的规范方式展示了这种特殊行为。
  • document.all的虚假性在ECMAScript 标准中有规定,是为兼容 IE 而在其他浏览器中实现的。
  • 字符串长度的不同概念及相关示例,如通过Intl.Segmenter处理字符串迭代时的结果与直观理解的差异。
  • 稀疏数组的特性通过Object.entries展示,以及创建非稀疏数组的正确方式,如使用fillArray.from
  • ASI 的机制在ECMAScript 标准中有规定,新语法可能影响旧代码,存在特殊的“restricted productions”。
阅读 11
0 条评论