JavaScript 类型系统与转换面试题
1. JavaScript 中有哪些数据类型?请简述它们的特点
Details
JavaScript 中有两种主要的数据类型:基本数据类型和引用数据类型。
基本数据类型
Number:数值类型,包括整数和浮点数。
- 示例:
123,3.14,Infinity,-Infinity,NaN
- 示例:
String:字符串类型,由零个或多个字符组成。
- 示例:
"Hello",'World'
- 示例:
Boolean:布尔类型,只有两个值:
true和false。- 示例:
true,false
- 示例:
Null:表示一个空值或不存在的对象。
- 示例:
null
- 示例:
Undefined:表示一个未定义的值。
- 示例:
undefined
- 示例:
Symbol:ES6 引入的新类型,表示唯一的标识符。
- 示例:
Symbol('description')
- 示例:
BigInt:ES11 引入的新类型,表示任意精度的整数。
- 示例:
1n,9007199254740991n
- 示例:
引用数据类型
- 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); // NaN3. 布尔转换
在布尔上下文中,其他类型会被转换为布尔值。
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") // 123parseInt()函数:parseInt("123a") // 123parseFloat()函数: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 中,建议使用 === 运算符进行比较,因为它可以避免类型转换带来的意外结果,使代码更加清晰和可预测。