面试题答案
一键面试JavaScript中隐式类型转换的常见场景
- 算术运算:
- 当加法运算符
+
的一侧是字符串,另一侧是非字符串时,会将非字符串转换为字符串然后拼接。例如:'5' + 3 // "53"
- 其他算术运算符(
-
,*
,/
,%
)会将操作数转换为数字类型。例如:'5' - 3 // 2
- 当加法运算符
- 比较运算:
- 当比较不同类型的值时,会进行类型转换。例如,字符串和数字比较时,字符串会转换为数字。
'5' > 3 // true
- 布尔值在比较时会转换为数字,
true
转换为1
,false
转换为0
。true > 0 // true
- 当比较不同类型的值时,会进行类型转换。例如,字符串和数字比较时,字符串会转换为数字。
- 逻辑运算:
&&
和||
运算符在操作数不是布尔值时会进行类型转换。例如:'abc' && 5 // 5
,这里'abc'
被转换为true
。'' || 5 // 5
,这里''
被转换为false
。
- 条件判断:
- 在
if
,while
等条件语句中,非布尔值会被转换为布尔值。例如:if ('abc') { /* 会执行 */ }
,'abc'
被转换为true
。
- 在
避免意外类型错误的方法
- 显式类型转换:在进行运算或比较之前,使用
Number()
,String()
,Boolean()
等函数显式地将值转换为需要的类型。例如:let num = Number('5'); num - 3;
- 严格比较:使用严格相等运算符
===
和严格不相等运算符!==
,它们不会进行类型转换。例如:'5' === 5 // false
JavaScript内存管理中垃圾回收机制的工作原理
- 标记 - 清除算法:
- JavaScript最常用的垃圾回收算法是标记 - 清除。垃圾回收器会定期运行。
- 它首先从根对象(全局对象
window
在浏览器环境中,global
在Node.js环境中)开始,标记所有可以访问到的对象。 - 然后,它会遍历堆内存中的所有对象,清除那些没有被标记的对象,回收它们占用的内存空间。
- 引用计数:
- 一些早期的JavaScript引擎也使用过引用计数算法。该算法跟踪每个对象被引用的次数。
- 当一个对象的引用计数变为0时,意味着它不再被任何其他对象引用,垃圾回收器就会回收该对象占用的内存。但该算法存在循环引用的问题,即两个对象相互引用,导致它们的引用计数永远不为0,从而无法被回收。现代JavaScript引擎主要使用标记 - 清除算法来避免这个问题。