JavaScript面试题 更新中......

本文详细介绍了JavaScript的八种数据类型,包括ES6新增的Symbol和BigInt,以及它们的区别。同时,讨论了数据类型检测的四种方法,并列举了多种判断数组的方法。此外,还探讨了null和undefined的区别,以及typeof null为何返回'object'的历史遗留问题。这些内容对于理解JavaScript基础和面试准备非常有帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaScript面试题

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

JavaScript共有⼋种数据类型,分别是 Undefined、Null、Boolean、Number、String、 Object、Symbol、BigInt。

其中 Symbol 和 BigInt 是ES6 中新增的数据类型:

  • Symbol 代表创建后独一无二且不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问 题。
  • BigInt 是⼀种数字类型的数据,它可以表示任意精度格式的整数,使⽤ BigInt 可以安全地存储 和操作⼤整数,即使这个数已经超出了 Number 能够表示的安全整数范围。

这些数据可以分为原始数据类型和引⽤数据类型:

  • 这些数据可以分为原始数据类型和引⽤数据类型:
  • 堆:引⽤数据类型(对象、数组和函数)

两种类型的区别在于存储位置的不同:

  • 原始数据类型直接存储在栈(stack)中的简单数据段,占据空间⼩、⼤⼩固定,属于被频繁使⽤数 据,所以放⼊栈中存储;
  • 引⽤数据类型存储在堆(heap)中的对象,占据空间⼤、⼤⼩不固定。如果存储在栈中,将会影响 程序运⾏的性能;引⽤数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻 找引⽤值时,会⾸先检索其在栈中的地址,取得地址后从堆中获得实体。

堆和栈的概念存在于数据结构和操作系统内存中,在数据结构中:

  • 在数据结构中,栈中数据的存取⽅式为先进后出。
  • 堆是⼀个优先队列,是按优先级来进⾏排序的,优先级可以按照⼤⼩来规定。

在操作系统中,内存被分为栈区和堆区:

  • 栈区内存由编译器⾃动分配释放,存放函数的参数值,局部变量的值等。其操作⽅式类似于数据结构 中的栈。
  • 堆区内存⼀般由开发着分配释放,若开发者不释放,程序结束时可能由垃圾回收机制回收。

2. 数据类型检测的⽅式有哪些

  1. typeof
  2. instanceof
  3. constructor
  4. Object.property.toString.call([obj])
    这四种方式在我博客都有写过。# JavaScript的数据类型检测 有几种方式?

3. 判断数组的⽅式有哪些

  1. Object.property.toString.call([obj])
  2. 可以通过原型链来判断(Object.getPrototypeOf(obj) === Array.property)
  3. 可以通过instanceof来判断
  4. ES6数组新增方法 Array.isArray(obj)
  5. Array.prototype.isPrototype(obj) / Object.prototype.isPrototypeOf.call(Array.prototype, arr)
    const arr = []
    // 1. toString.call
    console.log(Object.prototype.toString.call(arr).slice(8,-1) === "Array")
    // 2. 通过原型判断
    console.log(Object.getPrototypeOf(arr) === Array.prototype)
    // 3. instanceof
    console.log(arr instanceof Array)
    // 4. Array.isArray()
    console.log(Array.isArray(arr))
    // 5. isPrototype 在Object原型上的 通过Object原型或者Array原型都可以拿到的
    console.log(Object.prototype.isPrototypeOf.call(Array.prototype, arr))
    console.log(Array.prototype.isPrototypeOf(arr))

4. null和undefined区别

首先 Undefined 和 Null 都是基本数据类型,这两个基本数据类型分别都只有⼀个值,就是 undefined 和 null。

undefined 代表的含义是未定义,null 代表的含义是空对象。⼀般变量声明了但还没有定义的时候会 返回 undefined,null主要⽤于赋值给⼀些可能会返回对象的变量,作为初始化。

undefined 在 JavaScript 中不是⼀个保留字,这意味着可以使⽤ undefined 来作为⼀个变量名,但是这样的做法是⾮常危险的,它会影响对 undefined 值的判断。我们可以通过⼀些方法获得安 全的 undefined 值,⽐如说 void 0

当对这两种类型使⽤ typeof 进⾏判断时,Null 类型化会返回 “object”,这是⼀个历史遗留的问 题。当使⽤双等号对两种类型的值进⾏⽐较时会返回 true,使⽤三个等号时会返回 false。

5. typeof null 的结果是什么,为什么?

typeof null 的结果是Object。

在 JavaScript 第⼀个版本中,所有值都存储在 32 位的单元中,每个单元包含⼀个⼩的 类型标签 (1-3 bits) 以及当前要存储值的真实数据。类型标签存储在每个单元的低位中,共有五种数据类型:

000: object - 当前存储的数据指向⼀个对象。 
  1: int - 当前存储的数据是⼀个 31 位的有符号整数。 
010: double - 当前存储的数据指向⼀个双精度的浮点数。 
100: string - 当前存储的数据指向⼀个字符串。 
110: boolean - 当前存储的数据是布尔值。

如果最低位是 1,则类型标签标志位的⻓度只有⼀位;如果最低位是 0,则类型标签标志位的⻓度占三 位,为存储其他四种数据类型提供了额外两个 bit 的⻓度。

有两种特殊数据类型:

  • undefined的值是 (-2)30(⼀个超出整数范围的数字);
  • null 的值是机器码 NULL 指针(null 指针的值全是 0)
    那也就是说null的类型标签也是000,和Object的类型标签⼀样,所以会被判定为Object。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尤雨东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值