下面按常见程度 + 易踩坑点总结 ECMAScript(主要是 ES5/ES6+ 日常开发中)的典型误区,很多即使写了几年 JS 的人也会中招。
var 有函数作用域,不是块级作用域for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0);
}
// 输出:3 3 3
✅ 正确做法:
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0);
}
let / const 有“暂时性死区(TDZ)”console.log(a); // ReferenceError
let a = 1;
== 会做隐式类型转换0 == '' // true
null == undefined // true
[] == false // true
✅ 建议:永远用 ===
typeof null === 'object'typeof null // "object"(历史 bug)
NaN !== NaNNaN === NaN // false
✅ 判断 NaN:
Number.isNaN(x)
this 不是“函数属于谁”const obj = {
name: 'a',
fn() { return this.name }
}
const f = obj.fn
f() // undefined
thisconst obj = {
name: 'a',
fn: () => this.name
}
❌ 不适合做方法
for...in 遍历数组是错的for (const k in [1,2,3]) {} // 会遍历原型链
✅ 用:
for...offorEachmap[1,2,3].map(x => x*2) // 新数组
[1,2,3].sort() // 原地修改
const o = {}
o[{}] = 1
// key 变成 "[object Object]"
setTimeout(fn, 0) 不是立即执行setTimeout(() => console.log(1), 0)
console.log(2)
// 2 1
Promise 一旦 resolve 不可取消const p = new Promise(...)
// 无法 abort
async/await 不是“多线程”await 只是语法糖
底层仍是事件循环
const 不是“不可变”const o = { a: 1 }
o.a = 2 // ✅ 可以
const { x = 1 } = {}
// x = 1
const { x = 1 } = { x: undefined }
// x = 1
const { x = 1 } = { x: null }
// x = null
JSON 不等于 JS 对象undefinedclass 只是语法糖class A {}
// 本质是构造函数 + 原型
import 是静态的if (x) import('./a') // ❌
// 必须:
import('./a').then(...)
ECMAScript 的坑,大多来自“看起来像别的语言,实际不是”。
如果你是:
我可以给你一份 「ES 常见误区 Checklist」 或 按 ES 版本(ES5 / ES6 / ES2020+)分类版。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。