面试 JavaScript 框架八股文十问十答第二期
作者:程序员小白条,个人博客
相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!
⭐点赞⭐收藏⭐不迷路!⭐
1)其他值到字符串的转换规则?
- 数字转换为字符串: 数字直接被转换为对应的字符串形式。
- 布尔值转换为字符串:
true
被转换为字符串"true"
,false
被转换为字符串"false"
。 - null 转换为字符串: null 被转换为字符串
"null"
。 - undefined 转换为字符串: undefined 被转换为字符串
"undefined"
。 - 对象转换为字符串: 大多数对象被转换为字符串 “[object Object]”。
2)其他值到数字值的转换规则?
- 字符串转换为数字: 如果字符串可以被解析为数字,它将被转换为对应的数字。否则,将被转换为 NaN。
- 布尔值转换为数字:
true
被转换为数字 1,false
被转换为数字 0。 - null 转换为数字: null 被转换为数字 0。
- undefined 转换为数字: undefined 被转换为 NaN。
- 对象转换为数字: 对象首先被转换为相应的原始值,然后再按照上述规则进行转换。
3)其他值到布尔类型的值的转换规则?
- 数字转换为布尔值: 除了 0、-0、NaN 和 null 外,所有数字转换为 true。
- 字符串转换为布尔值: 除了空字符串 “” 外,所有字符串转换为 true。
- null 和 undefined 转换为布尔值: 转换为 false。
- 对象转换为布尔值: 所有对象(包括数组和函数)转换为 true。
4)|| 和 && 操作符的返回值?
-
||
操作符(逻辑或): 返回第一个为真的操作数,如果所有操作数都是假,则返回最后一个假值。如果操作数是非布尔类型,会按照“短路评估”规则,返回第一个被确定为真的值,或者最后一个值。let result = a || b;
-
&&
操作符(逻辑与): 返回第一个为假的操作数,如果所有操作数都为真,则返回最后一个真值。如果操作数是非布尔类型,会按照“短路评估”规则,返回第一个被确定为假的值,或者最后一个值。let result = a && b;
5)Object.is() 与比较操作符 “=”、“” 的区别?
-
Object.is()
: 用于比较两个值是否相同,包括处理特殊情况,如 NaN 等。Object.is(value1, value2);
-
===
操作符(严格相等): 在比较时不进行类型转换,要求值和类型都相同。value1 === value2;
-
==
操作符(相等): 在比较时进行类型转换,然后再比较值。value1 == value2;
6)什么是 JavaScript 中的包装类型?
在 JavaScript 中,有三种基本的包装类型,它们分别是:
-
String 包装类型: 用于处理字符串的对象。当使用字符串字面量时,JavaScript 会自动转换为 String 对象。
let str = "Hello"; let strObject = new String("Hello");
-
Number 包装类型: 用于处理数字的对象。当使用数字字面量时,JavaScript 会自动转换为 Number 对象。
let num = 42; let numObject = new Number(42);
-
Boolean 包装类型: 用于处理布尔值的对象。当使用布尔字面量时,JavaScript 会自动转换为 Boolean 对象。
let bool = true; let boolObject = new Boolean(true);
这些包装类型允许对基本类型值进行方法调用,但它们也会引入一些细微的行为差异,因为它们是对象而不是原始值。通常,在处理基本类型时,直接使用字面量而不是包装类型更为常见。
7)JavaScript 中如何进行隐式类型转换?
JavaScript 中的隐式类型转换是指在表达式中,当运算符需要特定类型的操作数时,会自动将操作数转换为适当的类型。这种转换可以发生在各种上下文中,例如算术运算、比较运算、逻辑运算等。常见的隐式类型转换包括:
-
字符串和数字之间的转换: 在加法操作中,如果其中一个操作数是字符串,另一个操作数会被转换为字符串。
let num = 10; let str = "The number is: " + num; // 隐式将数字转换为字符串
-
布尔值和其他类型之间的转换: 在逻辑运算中,非布尔值会被隐式转换为布尔值。
if ("hello") {// 这段代码会执行,因为字符串 "hello" 被隐式转换为 true }
-
比较操作中的类型转换: 在比较运算中,如果操作数的类型不同,JavaScript 会尝试将它们转换为相同的类型再进行比较。
console.log(5 == "5"); // true,字符串 "5" 被转换为数字 5,然后进行比较
8)+
操作符什么时候用于字符串的拼接?
+
操作符在 JavaScript 中有两种主要用途:算术加法和字符串拼接。当 +
操作符的其中一个操作数是字符串类型时,它就会执行字符串拼接操作,而不是算术加法。这种行为称为重载。
let str = "Hello" + " " + "World"; // 字符串拼接
let result = "The answer is: " + 42; // 字符串拼接
在以上示例中,+
操作符被用于连接字符串,而不是执行算术加法。
9)为什么会有BigInt的提案?
JavaScript 中的数字类型通常被限制在 Number 的范围内,即 -2^53
到 2^53
之间。这意味着无法准确表示超出这个范围的整数。BigInt 提案旨在解决这一问题,它引入了一种新的数据类型 BigInt,用于表示任意精度的整数。
BigInt 允许你表示超出 Number 范围的整数,从而避免了精度丢失的问题。它对于处理大整数运算、加密算法等场景非常有用。
BigInt 使用后缀 n
来标识一个 BigInt 字面量:
const bigIntNum = 9007199254740991n;
BigInt 提案的目的是为了扩展 JavaScript 的数字能力,使其更适用于更广泛的应用场景。
10)object.assign和扩展运算法是深拷贝还是浅拷贝,两者区别
-
Object.assign: 它用于将一个或多个源对象的可枚举属性复制到目标对象。它是浅拷贝,即只复制对象的第一层属性,如果属性值是对象,则复制的是引用。
const obj1 = { a: 1, b: { c: 2 } }; const obj2 = Object.assign({}, obj1); obj2.b.c = 3; console.log(obj1.b.c); // 3,因为是浅拷贝,obj1 和 obj2 共享 b 对象
-
扩展运算符(Spread Operator): 也是浅拷贝,与
Object.assign
类似,只复制对象的第一层属性,如果属性值是对象,则复制的是引用。const obj1 = { a: 1, b: { c: 2 } }; const obj2 = { ...obj1 }; obj2.b.c = 3; console.log(obj1.b.c); // 3,因为是浅拷贝,obj1 和 obj2 共享 b 对象
两者的区别:
Object.assign
可以复制到目标对象中,而扩展运算符只能用于创建新对象。Object.assign
是一个函数,接受目标对象和一个或多个源对象作为参数,而扩展运算符是一个语法,只能用于对象字面量中。
需要进行深拷贝时,需要使用其他方法,例如递归复制对象的所有属性,或者使用第三方库来完成深拷贝操作。
开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system
已 300 + Star!
⭐点赞⭐收藏⭐不迷路!⭐