1. JavaScript基础语法入门指南
作为一名从2010年开始接触JavaScript的老兵,我见证了这门语言从简单的网页特效工具成长为如今的全栈开发利器。对于初学者而言,掌握基础语法就像盖房子打地基,今天我就用最接地气的方式,带大家系统梳理JS的数据类型和变量体系。
JavaScript的数据类型分为两大阵营:基本类型(值类型)和引用类型(对象类型)。这就像超市的商品,有些是散装称重的(基本类型),有些是盒装打包的(引用类型)。理解它们的区别,是避免日后踩坑的关键。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据类型深度解析
2.1 基本数据类型详解
2.1.1 数值型(Number)的玄机
JS中所有数字都是64位浮点数存储,这和其他语言很不一样。比如:
javascript复制let a = 3; // 虽然写的是整数,实际是浮点
let b = 0.1 + 0.2; // 输出0.30000000000000004
重要提示:金融计算务必使用toFixed()或第三方库如decimal.js处理精度
特殊值需要注意:
- NaN(Not a Number):任何与NaN的运算都返回NaN
- Infinity:出现在除以0或数值超过1.7976931348623157e+308时
javascript复制console.log(1 / 0); // Infinity
console.log(-1 / 0); // -Infinity
console.log(NaN === NaN); // false!判断NaN要用isNaN()
2.1.2 字符串型(String)的现代用法
ES6的模板字符串绝对是革命性改进:
javascript复制// 传统方式
let name = '张三';
console.log('你好,' + name + '!今天星期' + 3);
// 模板字符串
console.log(`你好,${name}!今天星期${3}`);
字符串方法使用频率TOP5:
- includes() - 是否包含子串
- slice() - 提取子串
- replace() - 替换内容
- trim() - 去除首尾空格
- split() - 字符串转数组
javascript复制let str = ' Hello World ';
console.log(str.trim().toUpperCase().split(' '));
// 输出: ["HELLO", "WORLD"]
2.1.3 其他基本类型冷知识
- Boolean:除了false,0、""、null、undefined、NaN都会在条件判断中被当作false
- BigInt:解决大整数问题,后缀加n
- Symbol:创建唯一标识符,适合做对象属性键
javascript复制let big = 1234567890123456789012345678901234567890n;
let sym = Symbol('唯一ID');
2.2 引用数据类型探秘
2.2.1 对象(Object)的七十二变
对象是JS的核心,连数组和函数都是特殊对象:
javascript复制let person = {
name: '李四',
age: 25,
sayHi() {
console.log(`我是${this.name}`);
}
};
// 动态添加属性
person.job = '工程师';
实用技巧:用Object.keys()获取对象所有属性名
2.2.2 数组(Array)的高阶操作
现代JS数组方法链式调用示例:
javascript复制let nums = [1, 2, 3, 4, 5];
let result = nums
.filter(n => n > 2)
.map(n => n * 2)
.reduce((sum, n) => sum + n, 0);
console.log(result); // 输出: 14 (3*2 + 4*2 + 5*2)
2.2.3 函数(Function)的三种面孔
- 函数声明:会被提升(hoisting)
- 函数表达式:更灵活
- 箭头函数:this绑定更直观
javascript复制// 1. 函数声明
function add(a, b) { return a + b; }
// 2. 函数表达式
const multiply = function(a, b) { return a * b; }
// 3. 箭头函数
const square = x => x * x;
3. 变量与常量的正确打开方式
3.1 变量声明进化史
从var到let是JS的重大进步:
javascript复制// 旧时代
var x = 1;
var x = 2; // 允许重复声明
// 现代
let y = 1;
let y = 2; // 报错:Identifier 'y' has already been declared
血泪教训:永远不要用var,用let代替
3.2 命名规范最佳实践
好的命名应该像说明书:
- 变量:名词开头(userName)
- 布尔值:is开头(isLoggedIn)
- 函数:动词开头(getUserInfo)
- 常量:全大写加下划线(API_KEY)
javascript复制// 好例子
const MAX_RETRY = 3;
let isLoading = false;
function fetchUserData() {
// ...
}
3.3 const的误解与真相
很多人以为const定义的不能改,其实:
javascript复制const arr = [1, 2, 3];
arr.push(4); // 允许!因为引用地址没变
arr = []; // 报错!不能改变引用
const obj = { name: '王五' };
obj.age = 20; // 允许
obj = {}; // 报错
4. 类型转换的明规则与潜规则
4.1 显式类型转换
javascript复制// 转数字
Number('123'); // 123
parseInt('10px'); // 10
parseFloat('3.14.15'); // 3.14
// 转字符串
String(123); // "123"
(123).toString(); // "123"
// 转布尔
Boolean(1); // true
Boolean(0); // false
4.2 隐式类型转换的坑
JS的自动转换有时很魔幻:
javascript复制console.log(1 + '2'); // "12"
console.log('3' - 1); // 2
console.log('a' - 1); // NaN
console.log([] == 0); // true!
console.log([] == ''); // true!
console.log([] == []); // false!
避坑指南:始终使用===代替==,避免隐式转换
5. 常见问题诊断手册
5.1 NaN相关陷阱
javascript复制// 错误检测方式
if (someValue === NaN) { ... } // 永远不成立
// 正确检测方式
if (isNaN(someValue)) { ... }
// ES6更安全的方式
if (Number.isNaN(someValue)) { ... }
5.2 对象引用导致的bug
javascript复制let a = { count: 1 };
let b = a;
b.count = 2;
console.log(a.count); // 2!因为a和b指向同一对象
// 解决方案:浅拷贝
let c = { ...a };
c.count = 3;
console.log(a.count); // 保持2
5.3 变量提升的诡异现象
javascript复制console.log(x); // undefined而不是报错
var x = 5;
// 实际执行顺序:
var x;
console.log(x);
x = 5;
这就是为什么推荐用let/const,它们不会提升
6. 现代JS编码风格建议
- 优先使用const,必要时用let
- 使用模板字符串代替拼接
- 用箭头函数简化回调
- 采用解构赋值
- 默认使用严格模式("use strict")
javascript复制// 现代写法示例
const { name, age } = getUser();
const sayHi = (msg) => console.log(`[${new Date()}] ${msg}`);
我在实际项目中总结的经验是:基础语法看似简单,但细节决定成败。比如最近团队遇到的一个bug,就是因为没有处理好浮点数精度,导致财务计算结果出现微小偏差。建议新手在学习时,对每个知识点都要动手验证,建立自己的代码片段库。
