面试 JavaScript 框架八股文十问十答第二期

面试 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^532^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!

⭐点赞⭐收藏⭐不迷路!⭐

你可能感兴趣的:(面试,javascript,职场和发展,前端,性能优化,项目实战,八股文)