Skip to content

JavaScript 类型系统与转换面试题

1. JavaScript 中有哪些数据类型?请简述它们的特点

Details

JavaScript 中有两种主要的数据类型:基本数据类型和引用数据类型。

基本数据类型

  1. Number:数值类型,包括整数和浮点数。

    • 示例:123, 3.14, Infinity, -Infinity, NaN
  2. String:字符串类型,由零个或多个字符组成。

    • 示例:"Hello", 'World'
  3. Boolean:布尔类型,只有两个值:truefalse

    • 示例:true, false
  4. Null:表示一个空值或不存在的对象。

    • 示例:null
  5. Undefined:表示一个未定义的值。

    • 示例:undefined
  6. Symbol:ES6 引入的新类型,表示唯一的标识符。

    • 示例:Symbol('description')
  7. BigInt:ES11 引入的新类型,表示任意精度的整数。

    • 示例:1n, 9007199254740991n

引用数据类型

  1. Object:对象类型,包括普通对象、数组、函数等。
    • 示例:{ name: "John" }, [1, 2, 3], function() {}

特点

  • 基本数据类型:存储在栈内存中,直接存储值,赋值时会创建新的副本。
  • 引用数据类型:存储在堆内存中,栈内存中存储的是指向堆内存的引用,赋值时只会复制引用。

2. 请解释 JavaScript 中的类型转换

Details

JavaScript 中的类型转换可以分为两种:隐式类型转换和显式类型转换。

隐式类型转换

隐式类型转换是 JavaScript 自动进行的类型转换,通常发生在运算符操作中。

1. 字符串转换

当与字符串进行 + 运算时,其他类型会被转换为字符串。

javascript
console.log(1 + "2"); // "12"
console.log(true + "string"); // "truestring"

2. 数值转换

当进行数学运算时,其他类型会被转换为数值。

javascript
console.log("1" * 2); // 2
console.log(true - false); // 1
console.log(null + 1); // 1
console.log(undefined + 1); // NaN

3. 布尔转换

在布尔上下文中,其他类型会被转换为布尔值。

javascript
if ("hello") { console.log("Truthy"); } // 输出: Truthy
if (0) { console.log("Falsy"); } // 不输出
if (null) { console.log("Falsy"); } // 不输出
if (undefined) { console.log("Falsy"); } // 不输出
if ("") { console.log("Falsy"); } // 不输出
if (NaN) { console.log("Falsy"); } // 不输出

显式类型转换

显式类型转换是通过调用函数或使用运算符来手动进行的类型转换。

1. 转换为字符串

  • String() 函数:String(123) // "123"
  • .toString() 方法:(123).toString() // "123"
  • 模板字符串:${123} // "123"

2. 转换为数值

  • Number() 函数:Number("123") // 123
  • parseInt() 函数:parseInt("123a") // 123
  • parseFloat() 函数:parseFloat("123.45") // 123.45
  • 一元加号运算符:+"123" // 123

3. 转换为布尔值

  • Boolean() 函数:Boolean("hello") // true
  • 双重否定运算符:!!"hello" // true

3. 请解释 JavaScript 中的 ===== 运算符的区别

Details

===== 都是 JavaScript 中的比较运算符,用于比较两个值是否相等,但它们的比较方式不同。

== 运算符

== 运算符会进行类型转换,然后比较转换后的值是否相等。

示例

javascript
console.log(1 == "1"); // true (数值 1 与字符串 "1" 比较)
console.log(true == 1); // true (布尔值 true 与数值 1 比较)
console.log(null == undefined); // true (null 与 undefined 比较)
console.log([] == ""); // true (空数组与空字符串比较)
console.log({} == "[object Object]"); // true (空对象与字符串 "[object Object]" 比较)

=== 运算符

=== 运算符不会进行类型转换,只有当两个值的类型相同且值相等时,才会返回 true

示例

javascript
console.log(1 === "1"); // false (类型不同)
console.log(true === 1); // false (类型不同)
console.log(null === undefined); // false (类型不同)
console.log([] === []); // false (引用不同)
console.log({} === {}); // false (引用不同)

总结

  • ==:进行类型转换后比较值是否相等
  • ===:不进行类型转换,比较类型和值是否都相等

最佳实践

在 JavaScript 中,建议使用 === 运算符进行比较,因为它可以避免类型转换带来的意外结果,使代码更加清晰和可预测。