陷阱一:变量提升导致的赋值问题
- 问题描述:在JavaScript中,变量声明会被提升到其作用域的顶部,但变量赋值不会。如果在变量声明之前使用变量,可能会得到
undefined
,而非预期的值。
- 代码示例:
console.log(a); // 输出: undefined
var a = 10;
- 避免方法:养成在作用域顶部声明变量的习惯,确保变量在使用前已声明和赋值。如下修改代码:
var a;
a = 10;
console.log(a); // 输出: 10
陷阱二:使用==
进行宽松比较导致的类型转换问题
- 问题描述:
==
在比较时会进行类型转换,可能导致不符合预期的结果。例如,0 == ''
、false == 0
等在宽松比较中都为true
。
- 代码示例:
console.log(0 == ''); // 输出: true
console.log(false == 0); // 输出: true
- 避免方法:尽量使用严格比较
===
,它不会进行类型转换,只有在值和类型都相等时才返回true
。修改代码如下:
console.log(0 === ''); // 输出: false
console.log(false === 0); // 输出: false
陷阱三:对象浅拷贝时的引用问题
- 问题描述:当使用简单的赋值方式对对象进行“拷贝”时,实际上是复制了对象的引用,而不是创建一个新的独立对象。这意味着对一个对象的修改会影响到另一个。
- 代码示例:
var obj1 = {name: 'Alice'};
var obj2 = obj1;
obj2.name = 'Bob';
console.log(obj1.name); // 输出: Bob
- 避免方法:使用深拷贝方法,如
JSON.parse(JSON.stringify(obj))
(此方法有局限性,无法处理函数、循环引用等情况),或使用lodash
库中的cloneDeep
方法。以下是使用JSON.parse(JSON.stringify(obj))
的示例:
var obj1 = {name: 'Alice'};
var obj2 = JSON.parse(JSON.stringify(obj1));
obj2.name = 'Bob';
console.log(obj1.name); // 输出: Alice