JavaScript面试题
1. JavaScript有哪些数据类型,它们的区别?
JavaScript共有?种数据类型,分别是 Undefined、Null、Boolean、Number、String、 Object、Symbol、BigInt。
其中 Symbol 和 BigInt 是ES6 中新增的数据类型:
- Symbol 代表创建后独一无二且不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问 题。
- BigInt 是?种数字类型的数据,它可以表示任意精度格式的整数,使? BigInt 可以安全地存储 和操作?整数,即使这个数已经超出了 Number 能够表示的安全整数范围。
这些数据可以分为原始数据类型和引?数据类型:
- 这些数据可以分为原始数据类型和引?数据类型:
- 堆:引?数据类型(对象、数组和函数)
两种类型的区别在于存储位置的不同:
- 原始数据类型直接存储在栈(stack)中的简单数据段,占据空间?、??固定,属于被频繁使?数 据,所以放?栈中存储;
- 引?数据类型存储在堆(heap)中的对象,占据空间?、??不固定。如果存储在栈中,将会影响 程序运?的性能;引?数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻 找引?值时,会?先检索其在栈中的地址,取得地址后从堆中获得实体。
堆和栈的概念存在于数据结构和操作系统内存中,在数据结构中:
- 在数据结构中,栈中数据的存取?式为先进后出。
- 堆是?个优先队列,是按优先级来进?排序的,优先级可以按照??来规定。
在操作系统中,内存被分为栈区和堆区:
- 栈区内存由编译器?动分配释放,存放函数的参数值,局部变量的值等。其操作?式类似于数据结构 中的栈。
- 堆区内存?般由开发着分配释放,若开发者不释放,程序结束时可能由垃圾回收机制回收。
2. 数据类型检测的?式有哪些
- typeof
- instanceof
- constructor
- Object.property.toString.call([obj])
这四种方式在我博客都有写过。# JavaScript的数据类型检测 有几种方式?
3. 判断数组的?式有哪些
- Object.property.toString.call([obj])
- 可以通过原型链来判断(Object.getPrototypeOf(obj) === Array.property)
- 可以通过instanceof来判断
- ES6数组新增方法 Array.isArray(obj)
- Array.prototype.isPrototype(obj) / Object.prototype.isPrototypeOf.call(Array.prototype, arr)
const arr = []
console.log(Object.prototype.toString.call(arr).slice(8,-1) === "Array")
console.log(Object.getPrototypeOf(arr) === Array.prototype)
console.log(arr instanceof Array)
console.log(Array.isArray(arr))
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。
|