当前位置:   article > 正文

(数据类型)前端八股文修炼Day1

(数据类型)前端八股文修炼Day1

1.JavaScript有哪些数据类型,它们的区别

JavaScript中有以下种数据类型:

基本数据类型(Primitive Data Types):

  • String:表示文本数据,用单引号(')或双引号(")括起来。
  • Number:表示数字,包括整数和浮点数。
  • Boolean:表示逻辑值,即true或false。
  • Null:表示一个空值。 - Undefined:表示一个未定义的值。
  • Symbol(ES6新增):表示唯一的、不可变的值。
    引用数据类型(Reference Data Types):
  • Object:表示复杂数据结构,可以包含多个键值对。
    这些数据类型在 JavaScript 中有着不同的特点和用途:
  • Function: 作为一种特殊的数据类型,用于封装可重用的代码块,实现特定功能,是 JavaScript 中的重要组成部分。

基本数据类型在赋值、传递时是按值传递,即会创建一个新的值,原始值不受影响。

引用数据类型在赋值、传递时是按引用传递,即只是传递了指向对象的引用,多个变量可能指向同一个对象,修改其中一个会影响其他变量。

另外,JavaScript中的数据类型是动态的,变量的数据类型可以根据赋予的值自动改变。这种动态类型特性使得 JavaScript 在开发过程中更加灵活,但也需要开发者注意数据类型的转换和处理,以避免意外的问题。

2.数据类型检测的方式?

3.有哪些判断数组的方式?

4. null和undefined区别 typeof null 的结果是什么,为什么?

  • null:
    null 是一个表示“空”的值,用于指示变量未被赋值或者表示空对象引用。
    当我们想明确地表示一个变量为空时,可以将其赋值为 null。
    例如:let myVar = null;
  • undefined:
    undefined 表示一个变量声明了但未被赋值,或者访问对象属性不存在时返回的值。
    在 JavaScript 中,未初始化的变量会被默认赋值为 undefined。
    例如:let myVar; // myVar 的值为 undefined

对于 typeof null 的结果是 ‘object’,这是 JavaScript 设计上的一个历史遗留问题。在 JavaScript 的早期版本中,null 的二进制表示全为 0,而对象的二进制表示最后三位也为 0,因此 typeof null 返回 ‘object’。这个问题至今尚未修复,仍然存在于现代的 JavaScript 解释器中。
因此,虽然 null 是一个基本数据类型,但 typeof null 返回 ‘object’,这是 JavaScript 的一个特殊情况,开发者在使用 typeof 操作符时需要注意这个细节。

5.intanceof 操作符的实现原理

instanceof 操作符用于检查一个对象是否是一个特定类型(class 或者 constructor function)的实例。其实现原理是通过检查对象的原型链来确定对象的类型,即判断对象的原型链上是否存在指定类型的原型。
当使用 obj instanceof Constructor 这种形式进行检查时,JavaScript 引擎会沿着 obj 的原型链向上查找,看 Constructor.prototype 是否在 obj 的原型链上。如果在原型链上找到了 Constructor.prototype,则返回 true,否则返回 false。

6. 实现为什么0.1+0.2 ! == 0.3,如何让其相等?

这涉及到 JavaScript 浮点数精度的问题。在 JavaScript 中,所有数字都使用双精度浮点数表示,这会导致浮点数计算时出现精度丢失问题。因此,0.1 + 0.2 的结果并不精确等于 0.3,而是一个非常接近但不完全相等的值。

要解决这个问题,通常可以通过以下方法来处理:

1.转换为整数计算:将小数转换为整数,完成计算后再转回小数。
let result = (0.1 * 10 + 0.2 * 10) / 10; // 结果为 0.3
2.使用库函数:可以使用一些库函数或工具来处理精确计算,例如使用 BigDecimal.js、math.js 等库来进行精确计算。
3.比较误差范围:由于浮点数计算精度问题,可以比较两个浮点数之间的差值是否在一个很小的范围内来判断它们是否相等,而不是直接使用严格相等比较。

7.如何获取安全的 undefined 值?

  • 声明不赋值
    let a;
  • 返回 void 0
    let safeUndefined = void 0
  • 传递 undefined 作为参数:在某些情况下,将 undefined 明确传递给函数或方法也可以获得安全的 undefined 值。

8. typeof NaN 的结果是什么?isNaN 和 Number.isNaN 函数的区别?

  • isNaN:
    isNaN() 函数用来判断一个值是否是 NaN。
    当参数为非数值类型时,会先尝试将其转换为数值,然后判断是否是 NaN。
    例如,isNaN(‘hello’) 会返回 true,因为 ‘hello’ 会被转换为 NaN。
  • Number.isNaN:
    Number.isNaN() 是 ES6 新增的用于判断一个值是否为 NaN 的方法。
    与 isNaN() 不同的是,Number.isNaN() 不会尝试将参数转换为数值,只有当参数是真正的 NaN 时才会返回 true。
    例如,Number.isNaN(‘hello’) 会返回 false,因为 ‘hello’ 不是真正的 NaN。

总的来说,Number.isNaN() 更加严格和准确,只有当参数是 NaN 时才会返回 true,不会发生类型转换。而 isNaN() 在判断非数值类型时会进行类型转换,可能会导致一些意想不到的结果。因此,在判断一个值是否为 NaN 时,推荐优先使用 Number.isNaN()。

9. == 操作符的强制类型转换规则?

其他值到字符串的转换规则?
其他值到数字值的转换规则?
其他值到布尔类型的值的转换规则?
当使用 == 操作符比较两个值时,会根据以下规则进行强制类型转换:

  • 其他值到字符串的转换规则:
    如果其中一个操作数是字符串,另一个操作数会被转换为字符串。
    数字和布尔值转换为相应的字符串,例如 1 转换为 ‘1’,true 转换为 ‘true’。
    null 和 undefined 分别转换为 ‘null’ 和 ‘undefined’。
    对象会调用其 toString 方法进行转换,如果没有则调用 valueOf 方法。如果两个方法都没有返回原始值,则默认转换为 ‘[object Object]’。
  • 其他值到数字值的转换规则:
    如果其中一个操作数是数字,另一个操作数会被转换为数字。
    布尔值转换为数字时,true 转换为 1,false 转换为 0。
    字符串转换为数字时,会尝试解析字符串为数字,如果无法解析则转换为 NaN。
    null 转换为 0,undefined 转换为 NaN。
    对象会调用其 valueOf 方法进行转换,如果没有则调用 toString 方法。如果两个方法都没有返回原始值,则转换为 NaN。
  • 其他值到布尔类型的值的转换规则:
    布尔值保持不变。
    数字中只有 0 和 NaN 被转换为 false,其他数字都被转换为 true。
    字符串中只有空字符串 ‘’ 被转换为 false,其他字符串都被转换为 true。
    null、undefined 和 NaN 被转换为 false。
    对象会被转换为 true,无论对象是什么。
    这些转换规则适用于 JavaScript 中的类型转换,当需要将一个值转换为不同类型时,根据上述规则进行转换。

10. || 和 && 操作符的返回值?

这些逻辑运算符在实际开发中经常用于条件判断和简化代码逻辑。当其中一个操作数可以确定整个表达式的结果时,JavaScript 引擎会短路计算,即不会对第二个操作数进行求值,从而提高运行效率。

11. Object.is() 与比较操作符 “=”、“” 的区别?

Object.is() 方法和 === 操作符都是严格相等的比较方式,不会进行类型转换,而 == 操作符是松散相等的比较方式,可能会进行类型转换,因此在比较值时,优先考虑使用 Object.is() 或 === 来确保更准确的比较结果。

12.什么是 JavaScript 中的包装类型?

在 JavaScript 中,包装类型是指将基本数据类型(如数字、字符串、布尔值)包装成对象的过程。JavaScript 提供了三种包装类型:String、Number 和 Boolean。当我们尝试在基本数据类型上调用对象方法时,JavaScript 会临时将基本数据类型转换为包装类型,以便我们可以调用对象的方法。
虽然我们可以像操作对象一样操作包装类型的实例,但它们并不是完全相同的。包装类型是临时创建的对象,每次访问该值时都会创建一个新的包装对象,因此在比较包装对象时可能会遇到一些意外的行为。在一般情况下,推荐直接使用基本数据类型而非包装类型,除非需要调用对象方法或者明确需要对象的特性。

13.JavaScript 中如何进行隐式类型转换?

JavaScript 中的隐式类型转换是指在某些操作中,JavaScript 引擎会自动将一个数据类型转换为另一种数据类型。这种类型转换是由 JavaScript 引擎根据操作符和操作数的类型来执行的,并不需要显式地指定转换动作。

以下是一些常见的隐式类型转换情况:

  • 字符串转换:当一个非字符串类型的值与字符串相加时,非字符串类型会被自动转换为字符串类型。
    var num = 10;
    var str = "The number is: " + num; // num 会被转换为字符串,str 的值为 “The number is: 10”
  • 数字转换:当一个非数字类型(除了符号 -)的值参与数学运算时,会被自动转换为数字类型。
    var result = “10” * 2; // 字符串 “10” 会被转换为数字 10,result 的值为 20
  • 布尔值转换:在需要布尔值的地方(如条件判断、逻辑运算等),JavaScript 会将其他类型的值自动转换为布尔值。
    if (“hello”) {
    // “hello” 被转换为 true,执行这里的代码
    }
  • 比较操作符中的转换:在使用比较操作符时,JavaScript 会根据操作数的类型做出相应的转换。
    console.log(10 == ‘10’); // 字符串 ‘10’ 会被转换为数字 10,结果为 true
    虽然 JavaScript 中的隐式类型转换可以方便编码,但有时也会导致一些意外的行为,因此在编写代码时应该注意类型转换的规则,以避免出现不必要的错误。

15.为什么会有BigInt的提案?

BigInt 的提案是为了解决 JavaScript 中整数表示范围的限制。在 JavaScript 中,普通的数字类型(Number)使用双精度浮点数(64 位)表示,因此有一个固定的范围,超过这个范围的整数就会丢失精度。

BigInt 类型允许表示更大范围的整数,它可以安全地存储和操作超出普通数字类型表示范围的整数值。BigInt 可以表示任意精度的整数,只受限于计算机内存的限制。

BigInt 的提案引入了一种新的数据类型,通过在数字后面添加 n 来创建 BigInt:

const bigIntValue = 1234567890123456789012345678901234567890n;
BigInt 类型的引入使得 JavaScript 能够更好地处理大整数计算,如加密算法、大型数据集合等领域,提高了 JavaScript 在处理整数运算上的灵活性和准确性。BigInt 类型也能够解决一些传统数字类型无法处理的精度问题,使 JavaScript 在处理整数计算上更加强大和可靠。

16.object.assign和扩展运算法是深拷贝还是浅拷贝,两者区别

.Object.assign() 和扩展运算符在 JavaScript 中都用于对象的浅拷贝,但它们之间有一些区别:

  • 区别:
    1、语法:
    Object.assign(target, …sources) 是一个方法,第一个参数是目标对象,后面的参数都是源对象。
    扩展运算符 … 通常用于展开数组或对象,语法更简洁,直接在对象字面量或数组字面量中使用。
    2、应用场景:
    Object.assign() 适用于将多个源对象的属性复制到目标对象中,并返回目标对象。
    扩展运算符通常用于快速复制对象或数组的内容,通常在对象字面量、数组字面量、函数调用或解构赋值中使用。
    3、返回值:
    Object.assign() 方法会返回目标对象本身,源对象的属性会被复制到目标对象中。
    扩展运算符不会修改现有对象,而是创建一个新的对象或数组。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/304651
推荐阅读
相关标签
  

闽ICP备14008679号