js的数据类型?
- string
- number
- boolean
- object
- undefined
- null --es6新增--
- symbol
- 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 的原型链上
答题:
- 先举例说明什么是原型 假设我们有一个普通对象 const x = {}; 这个对象x 会有一个隐藏属性 proto, 这个属性会指向object.prototype,即
x.proto === object.protype
这个时候我们说x的原型是object.protytpe, 或者说object.prototype是x的原型 而这个__proto__属性的唯一作用是用来指向x的原型。如果没有__proto__,x也就不知道自己的原型是谁了。
- 我们再来举例说明下什么是原型链 假设 我们有一个数组对象 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就有两层原型,
- a的原型是Array.prototype
- 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 为例,我们说,
- a 是Array的实例,a拥有Array.prototype里的属性
- Array继承了Object
- 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得到的,所以这个叫做继承。 因为数组继承了对象。