Yuan的博客
EN

10 道 JavaScript 考题,测测你多了解这个古怪的语言

  1. 八进制字面量与数值解析
console.log(018 - 015);
//5

知识点总结:八进制字面量(legacy octal)

  • 非严格模式下,以 0 开头的数字可能按八进制解析。
  • 018 中的 8 不属于八进制 → 按十进制解析为 18。
  • 015 属于八进制 → 十进制解析为 13。
  • 严格模式下会报错,不推荐使用 0 前缀数字。
  1. typeof 运算符的“返回值”
console.log(typeof typeof 1)

//string

知识点总结:typeof 永远返回字符串

  • typeof 1 返回 "number"
  • 再执行 typeof "number""string"
  • typeof 的返回值始终是一个字符串。
  1. 0.1 + 0.2 !== 0.3
console.log(0.1 + 0.2 == 0.3)

//false

知识点总结:IEEE754 浮点数误差

  • JS 采用 64 位浮点数格式,会产生精度误差。
  • 0.1 + 0.2 实际结果是 0.30000000000000004。
  • 判断浮点数相等应使用误差范围:Math.abs(a - b) < Number.EPSILON
  1. sort() 默认按字典序排序
const numbers = [33, 2, 8];
numbers.sort();
console.log(numbers[1])

//33

知识点总结:sort 默认按字典序排序

  • sort() 未提供比较函数时,会将元素转为字符串再比较。
  • 导致数字排序不符合预期,如 “2” < “33” < “8”。
  • 若要按数值排序,应使用:sort((a, b) => a - b)
  1. == 的隐式转换规则
console.log(false == '0');

//true

知识点总结:抽象相等会触发强制类型转换

  • '0' 转为数字 → 0。
  • false 转为数字 → 0。
  • 因此 false == ‘0’ → true。
  • 实际开发建议使用 === 避免隐式转换。
  1. 稀疏数组(Sparse Array)
let array = [1, 2, 3];
array[6] = 9;
console.log(array[5]);

//undefined

知识点总结:稀疏数组与 empty slot

  • 给高索引赋值会创建空槽(empty slot)。
  • 数组形态例如 [1, 2, 3, <3 empty slots>, 9]
  • 读取空槽结果为 undefined,但内部并未实际存储值。
  • empty slot 与 undefined 有语义差异。
  1. NaN 的类型
console.log(typeof NaN);

//number

知识点总结:NaN 属于 number 类型

  • typeof NaN 结果为 "number",这是规范规定。
  • NaN 意味着“无法表示的数值计算结果”。
  • 判断 NaN 必须使用 Number.isNaN(),不能用 ===
  1. 香蕉梗 (banana trick)
console.log(('b' + 'a' + + 'a' + 'a').toLowerCase());

//'banana'

知识点总结:一元加号触发数字转换

  • +'a' 转换失败 → NaN。
  • 字符串拼接:“ba” + NaN → “baNaN”。
  • toLowerCase() → “banana”。
  • 体现了 JS 一元运算符的隐式类型转换行为。
  1. 对象在 == 中会做 ToPrimitive 转换
const isTrue = true == [];
const isFalse = true == ![];
console.log(isTrue + isFalse);

//0

知识点总结:对象在 == 中会进行 ToPrimitive 转换

  • [] 转为原始值 → "",再转数字 → 0。
  • true 转数字 → 1。
  • 因此 true == [] → false。
  • ![] 为 false,因此 true == false → false。
  • false + false → 0。
  • 只有 6 个值是 falsy,其余全部 truthy。:false(布尔假),0(数字零),-0(负零), “”(空字符串),null(空指针),undefined(未定义),NaN(非数字)
  1. instanceof 只能识别“对象实例”
console.log("This is a string." instanceof String);

//false

知识点总结:instanceof 只适用于对象实例

  • 字符串字面量 "abc" 属于原始类型,不是对象。
  • 只有 new String("abc") 才是 String 的实例。
  • "abc" instanceof String → false。
  • 用 typeof 判断基本类型更可靠。