js基本规则

3 阅读3分钟

一、基本语法规则

1. 大小写敏感

JavaScript 区分大小写:

let myVar = 1;
let MyVar = 2; // 完全不同的变量

❗ 错误示例:console.log 写成 Console.Log 将报错。


2. 分号(Semicolon)

  • 推荐始终添加分号,避免 ASI(自动分号插入)带来的潜在问题。
// ✅ 推荐
let a = 1;
console.log(a);

// ❌ 不推荐(可能出错)
let b = 1
[1, 2, 3].forEach(console.log) // 解析为 let b = 1[1,2,3]... → 报错!

3. 注释方式

// 单行注释

/*
 * 多行注释
 * 可跨行
 */

4. 标识符命名规则

  • 只能包含:字母、数字、$_
  • 不能以数字开头
  • 不能使用保留关键字(如 if, for, class, function 等)
  • 推荐使用 驼峰命名法(camelCase)

✅ 合法命名:

userName, $input, _privateVar, fetchDataById

❌ 非法命名:

123name, my-name, function, class

二、变量声明规则

关键字作用域是否可重新赋值是否存在提升初始值
var函数作用域undefined
let块级作用域({})是(但不初始化)暂时性死区(TDZ)
const块级作用域否(仅一次赋值)是(但不初始化)必须初始化

⚠️ 注意:const 声明的对象/数组内容仍可修改:

const arr = [1, 2];
arr.push(3); // ✅ 允许
arr = [];    // ❌ 报错:Assignment to constant variable.

三、数据类型与类型判断

7 种原始类型 + Object

typeof "hello""string"
typeof 42"number"
typeof true"boolean"
typeof undefined"undefined"
typeof null"object"  // ❗历史 bug
typeof Symbol()    → "symbol"
typeof BigInt(10)  → "bigint"

typeof {}          → "object"
typeof []          → "object"
typeof function(){}→ "function"

类型判断建议

场景推荐方法
判断原始类型typeof
判断数组Array.isArray(arr)
判断 nullvalue === null
判断对象是否为空Object.keys(obj).length === 0
判断 NaNNumber.isNaN(value)

❗不要用 typeof 判断 null 或数组!


四、运算符与比较规则

1. 相等比较

运算符名称是否类型转换示例
==宽松相等5 == "5"true
===严格相等5 === "5"false

✅ 建议:始终使用 === !==,避免类型隐式转换导致的错误。

2. 布尔转换(Falsy 值)

以下值在布尔上下文中为 false

false, 0, -0, 0n, "", null, undefined, NaN

其余均为 truthy


五、函数与作用域

1. 函数定义方式

// 函数声明(存在提升)
function sayHello() { ... }

// 函数表达式
const sayHi = function() { ... };

// 箭头函数(无 this,无 arguments)
const greet = (name) => `Hello, ${name}`;

2. this 指向差异

函数类型this 指向
普通函数调用时决定(动态绑定)
箭头函数定义时外层作用域中的 this(词法绑定)
const obj = {
  name: "Alice",
  normal: function() { console.log(this.name); },
  arrow: () => { console.log(this.name); } // this 指向外层(通常是 window/global)
};
obj.normal(); // "Alice"
obj.arrow();  // undefined(在浏览器中)

六、异步编程规则

1. Promise 使用

fetch('/api/data')
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => console.error(err));

2. async/await(推荐)

async function getData() {
  try {
    const res = await fetch('/api/data');
    const data = await res.json();
    console.log(data);
  } catch (err) {
    console.error('请求失败:', err);
  }
}

✅ 优势:代码更清晰,易于调试和处理异常。


七、常见陷阱与注意事项(⚠️ 必看)

陷阱描述解决方案
NaN !== NaNNaN 与自身不相等使用 Number.isNaN(value)
typeof null === "object"历史 bugvalue === null 判断
浮点数精度问题0.1 + 0.2 !== 0.3使用 toFixed() 或数学库(如 decimal.js)
变量提升(Hoisting)var 提升但未初始化为 undefined使用 let/const,避免提前使用
暂时性死区(TDZ)let/const 在声明前访问会报错确保先声明后使用
数组是对象typeof [] === "object"使用 Array.isArray(arr) 判断数组
对象引用问题多个变量指向同一对象使用深拷贝(如 JSON.parse(JSON.stringify(obj)) 或 Lodash)
闭包中的循环变量var 在循环中共享变量使用 let 替代 var,或 IIFE 包裹
this 丢失回调函数中 this 指向改变使用箭头函数或 .bind(this)

八、最佳实践建议

推荐做法

  1. 使用 const / let 替代 var
  2. 使用模板字符串替代拼接:
`Hello, ${name}`
  1. 使用严格相等:===!==
  2. 使用 Array.isArray() 判断数组
  3. 异步操作优先使用 async/await
  4. 使用 ESLint + Prettier 统一代码风格
  5. 避免全局变量污染,使用模块化开发(ES Module / CommonJS)

避免做法

  • 使用 witheval()(安全风险)
  • 修改原型链(如 Array.prototype.xxx
  • 在循环中定义函数(性能差)
  • 忽略 catch 中的错误处理

九、附录:常用工具方法速查

功能方法
判断数组Array.isArray(arr)
深拷贝对象JSON.parse(JSON.stringify(obj))(简单情况)
延迟执行setTimeout(fn, delay)
类型安全判断 NaNNumber.isNaN(value)
字符串转数字Number(str)parseInt(str, 10)
防抖函数自定义或使用 Lodash 的 _.debounce
节流函数自定义或使用 Lodash 的 _.throttle

十、结语

JavaScript 是一门灵活但容易“踩坑”的语言。掌握其基本规则并了解常见陷阱,是写出健壮、可维护代码的关键。

📌 记住一句话

“The best way to avoid bugs is to understand how they happen.”


📄 文档用途建议

  • 新人入职培训材料
  • 团队编码规范参考
  • JS 面试复习提纲
  • 个人知识总结归档

如需导出为 PDF / Markdown 文件,可复制此内容保存为 .md 文件,或使用工具转换为 PDF。

需要我为你生成一个可下载的 PDF 版本吗?欢迎继续提问!