高频前端面试题汇总js篇【上】

 

 

 高频前端面试题汇总js篇【上】

 

 一、数据类型

1.js有那些数据类型,他们的区别?

  js共有八种数据类型,分别为undefined、Null、Boolean、Number、String、Object、Symbol、BigInt.

其中symbol和bigInt是es6中新增的数据类型:

  symbol代表创建后独一无二且不可变的数据类型,他主要是为了解决可能出现的全局变量冲突的问题

  bigInt是一个数字类型的数据,他可以表示任意精度格式的整数,使用bingInt可以安全的储存和操作大整数,即使这个数已经超出了Number能够Number能够表示的安全整数范围。

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

  栈:原始数据类型(undefined、Null、boolean、Number、string)

  堆:引用数据类型(对象、数组和函数)

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

  原始数据类型直接储存在栈中的简单数据段,占据空间小、大小固定,

  引用数据类型储存在堆中的对象,占据空间大、大小不固定。如果储存在栈中,将会影响程序运行的性能,引用数据类型在栈中存储了指针,实体存在堆中

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

  在数据结构中,堆中的数据的存取方式为先进后出。

  堆是一个优先队列,是按优先级来进行排序的,优先级可以按照大小来规定。

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

  栈区内存由编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构中的栈。

  堆区内存一般由开发者分配释放,若开发者不释放,程序结束时可能由垃圾回收机制回收。

2.数据类型检测的方式由那些

  2.1 typeof,注意tupeof数组\对象和null的结果都是Object'

  2.2 instanceof可以正确判断对象的类型,其内部运行机制时判断在其原型链中能否找到该类型的原型

  2.3 constructor有两个作用,一时判断数据的类型,二是对象实例通过constrcutor对象访问它的构造函数。需要注意,如果创建一个对象来改变他的原型,constructor就不能用来判断数据类型了

  2.4Object.prototypr.toString.call(),使用Object对象的原型方法toString来判断数据类型

3.判断数组的方式有那些

  通过Object.prototype.toStrign.cal(obj);

  通过原型链做判断:obj.__proto__===Array.prototype

  通过es6的Array.isArray()做判断

  通过instanceof做判断

  通过Array.prototype.isPrototypeOf(Obj)

4.null和undefined区别

  首先undefined和null都是基本数据类型,这两个基本数据类型分别都只有一个值,就是undefined和null.undefined代表的含义是未定义,null代表的含义是空对象。一般变量声明了但是还没有定义的时候会返回undefined,null主要用于赋值给一些可能会返回对象的变量作为初始值

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

  typeof null的结果是object.

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

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

有两个特殊的数据类型:

  undefined的值是(-2)30(一个超出整数范围的数字)

  null的值是机器码null指针(null指针的值全是0)

那也就是说null的类型标签也是000,和Object的标签一样,所以会呗判定为Object.

6.instanceof操作符的实现原理及实现

  instanceof运算符用于判断构造函数的prototype属性是否出现在对象的原型链中的任何位置。

function myInstanceof(left,right){
//获取对象原型
 let proto=Object.getPrototypeOf(left)
//获取构造函数的prototype对象
 let prototype=right.prototype;

//判断构造函数的prototype对象
 while (true) {
    if (!proto) return false;
    if (proto === prototype) return true;
    // 如果没有找到,就继续从其原型上找,Object.getPrototypeOf方法用来获取指定对象的原型
    proto = Object.getPrototypeOf(proto);
  }

}

7.为什么0.1+0.2!==0.3,如何让他相等

在开发过程中遇到类似这样的问题:

let n1 = 0.1, n2 = 0.2
console.log(n1 + n2)  // 0.30000000000000004
//这里得不到不是想要的结果,要相等于0.3,就要把他进行转换:
(n1 + n2).toFixed(2) // 注意,toFixed为四舍五入

 

上一篇:CSS24:CSS预处理器


下一篇:直播源码,下拉刷新和上划预加载新内容