MST

星途 面试题库

面试题:JavaScript 赋值表达式的常见陷阱及示例

请列举 JavaScript 赋值表达式中至少两个常见的陷阱,并分别给出对应的代码示例,同时说明如何避免这些陷阱。
10.5万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

陷阱一:变量提升导致的赋值问题

  • 问题描述:在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