js

97 阅读3分钟

js的数据类型?

  1. string
  2. number
  3. boolean
  4. object
  5. undefined
  6. null --es6新增--
  7. symbol
  8. bigint

bigint

为什么需要bigint? number不能用么?

js的number默认是一个双精度浮点数, 比如你在js里面存了一个了1, 他会给你存为1.0 而且是64位去保存的。 保存的精度有限 虽然保存的数字是大的,但是保存的精度是有限的 比如写了一个 const a = 12345678912345677 但是会发现js 保存的是 1234567891234566 但是如果我们在 大数字后面加上一个n 表示是一个bigint数字 就不会错了

const a = 12345678912345677n;

bigint的作用就是, 如果你的数字很大, 但是js又支持不了这么多位数的有效整数,导致最后保存下的数据出错,那么就在后面加个n。 bigint只支持整数 不支持小数。

原型链是什么?

大概念题,将大概念抽象成小概念,抽象化成具体(举例)

什么是原型链? 俗话说,就是__proto__的路径叫做原型链。 原型链的终点 object.prototype.proto 指向的是null;

原型继承? 原型继承就是实例可以使用构造函数上的prototype中的方法。

instanceof

A instanceof B 这个方法可以判断B的prototype 是否在A 的原型链上

答题:

  1. 先举例说明什么是原型 假设我们有一个普通对象 const x = {}; 这个对象x 会有一个隐藏属性 proto, 这个属性会指向object.prototype,即

x.proto === object.protype

这个时候我们说x的原型是object.protytpe, 或者说object.prototype是x的原型 而这个__proto__属性的唯一作用是用来指向x的原型。如果没有__proto__,x也就不知道自己的原型是谁了。

  1. 我们再来举例说明下什么是原型链 假设 我们有一个数组对象 const a = []; 这个a 也会有一个隐藏属性,叫做__proto__,这个属性会指向Array.prototype, 也就是

a.proto === Array.prototype

这个时候,我们说a的原型是Array.prototype 跟上面的x 一样,但有一点不一样的是 Array.prototype 也有一个隐藏属性, proto 指向的是Object.prototype, 即 a.proto === Array.prototype Array.prototype.proto === Object.prototype

这样一来,a就有两层原型,

  1. a的原型是Array.prototype
  2. a的原型的原型是Object.prototype 于是,就通过隐藏属性__proto__ 形成了一个链条: a ====> Array.prototype ===> Object.prototype

这就是原型链。

如何创建原型链

方法一: const a = Object.create(f) a 的原型就是f a.proto === f.prototype (es6) 方法二: const a = new F(); a.proto === F.prototype (es5)

原型链解决了什么问题呢?

在没有class的情况下实现了继承。 以 a ===> Array.prototype ===> Object.prototype 为例,我们说,

  1. a 是Array的实例,a拥有Array.prototype里的属性
  2. Array继承了Object
  3. a是Object的间接实例, a拥有Object.prototype里的属性 这样一来,a就既拥有了Array.prototype里的属性,又拥有Object.prototype里的属性

优点是: 简单优雅 缺点是 跟class相比, 不支持私有属性 class是支持私有属性的 如果在原型上写了一个属性,那么在这条原型链上的都可以访问到,所以不支持私有属性。

如何解决缺点?

使用class 但是class是ES6引入的,不被旧IE浏览器所支持

什么是继承?

比如 const a = new Array(1,2,3); 那么a 是Array的实例。

a有一个length属性,这个属性不能说他是继承来的,这里的a应该说是Array的实例化。a是Array的实例。

那么a还可以使用valueof这个属性,这个属性不是Array提供的,而是Object.prototype上的的,所以a的父类是Object, 因为这个valueof属性是从它的父类Object得到的,所以这个叫做继承。 因为数组继承了对象。