JavaScript 语言基础:类型、运算符、脚本加载与精度
本文目录
JavaScript 是动态类型语言:变量绑定不需要预先声明静态类型,但值仍有明确类型。语言规范由 ECMAScript 定义;DOM、BOM、定时器和网络 API 则由宿主环境提供。浏览器里的 JavaScript 常经解释与 JIT 编译协同执行,所以“解释型”只是入门层面的简化描述,不应据此推断运行性能。
值的类型与容易踩的边界
原始类型包括 string、number、bigint、boolean、undefined、symbol 和 null;对象类型包括普通对象、数组、日期、正则表达式等。函数是可调用对象,typeof function 会得到 function。typeof null 返回 object 是历史兼容行为,不表示 null 真的是对象。
对象变量保存的是对象引用;“基本类型在栈、对象在堆”可作为粗略的入门模型,不能当作 ECMAScript 对引擎内存布局的保证。判断数组用 Array.isArray,检查 NaN 用 Number.isNaN;不要用相等运算符比较 NaN,也不要用小数直接判断十进制精度。
Number.isNaN(NaN); // true
Object.is(NaN, NaN); // true
0.1 + 0.2 === 0.3; // false:二进制浮点无法精确表示部分十进制小数
Number.isFinite(Number('12')); // true
金额通常按最小货币单位用整数保存,或使用经过评估的十进制库;展示时再格式化。先验证输入格式与范围,再转换类型,避免把空字符串、部分数字或超大值悄悄接收为业务数据。
短路逻辑与位运算
|| 和 && 会短路,并返回参与运算的某个操作数,不一定返回布尔值;| 和 & 是位运算,会先把数值转成 32 位整数并且总会计算两侧表达式。逻辑运算用于条件组合;位运算只适用于位掩码等明确需求,不能按“效率更高”替代逻辑运算。
const label = userName || '访客'; // 空字符串也会回退
const pageSize = configuredSize ?? 20; // 仅 null/undefined 时回退
const allowed = isLoggedIn && hasPermission; // 逻辑短路
const hasReadFlag = (permissionBits & 0b0100) !== 0; // 位掩码
使用 || 设默认值会把 0、空字符串和 false 一并视为需要回退;若这些值是合法配置,应选用 ??。XOR 交换变量只在经过 32 位整数转换后才成立,会损失小数和大整数信息,也难读,不要用于通用数值交换。
脚本加载与执行错误
普通经典脚本按文档顺序执行,可能阻塞 HTML 解析。defer 外部脚本在解析结束后按文档顺序执行;async 脚本下载完成就执行,顺序不保证,适合彼此独立的脚本。type=module 默认延后执行并使用模块作用域;依赖关系由 import 决定。模块和严格模式脚本会启用严格模式。
脚本中的同步异常会中止当前执行栈,不会自动终止浏览器里所有其它独立任务。错误边界要按任务拆分:同步代码用 try/catch,Promise 链用 catch,网络和用户输入还需要业务级失败状态。不要把多个不相关功能塞进同一个全局脚本。
声明、遍历与检查
优先使用 const 表达不会重新赋值的绑定,需要重新赋值时用 let;var 有函数作用域和提升行为,维护旧代码时要识别它,但新代码不要依赖这些历史特性。for...in 遍历可枚举字符串键(包括继承来的键),for...of 遍历可迭代对象的值;普通对象不能直接用 for...of。
迁移前可按顺序检查:变量是否在声明前使用;外部脚本是否依赖执行顺序;输入是否涉及 NaN、无穷大或浮点误差;逻辑运算是否误吞 0/false;对象循环是否遍历了原型属性。
参考:ECMAScript Language Specification、MDN JavaScript Guide、MDN Numbers、MDN Script element、MDN Strict mode。
Live Notes
留言提交后会先进入审核,审核通过后对其他读者公开。