常面:《JS数据类型&&js原型链》

90 阅读2分钟

数据类型

一共八种 ES6之前有六种 之后新增两种

分别是 :string number Boolean null undefined symbol object bigint

提了就零分的答案有:数组、函数、日期。这些是类 class,不是类型 type

  • 如果你表示一个对象为空那就用null
  • 如果你表示一个非对象为空那就用undefined
为什么要有bigint

因为JS的number默认是一个双精度浮点数

如果你这个数字特别大 由于js本身的number支持不了这么高有效位数的整数 所以你在后面加上一个n

原型链

原型:每个对象都有一个隐藏的属性 这个属性指向它的原型

解释原型链:a的原型是b b的原型是c

那么 a是一个[ ] b是 Array.prototype c是 object.prototype 通过隐藏属性 下划线proto

看起来只要改写 x 的隐藏属性 __proto__ 就可以改变 x 的原型(链) 但这个不是标准写法 推荐的写法是

const x = Object.create(原型)
// 或
const x = new 构造函数() // 会导致 x.__?????__ === 构造函数.prototype

解决了什么问题:

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

  1. a 是 Array 的实例,a 拥有 Array.prototype 里的属性
  1. Array 继承了 Object(注意专业术语的使用)
  1. a 是 Object 的间接实例,a 拥有 Object.prototype 里的属性

这样一来,a 就既拥有 Array.prototype 里的属性,又拥有 Object.prototype 里的属性。

优点:

简单、优雅。

缺点:

跟 class 相比,不支持私有属性。

怎么解决缺点:

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

继承

当你有一个clasaA 有一个classB 只有出现 classA extends classB 时 才会出现继承

一个对象拥有其构造函数或者类的属性这个不叫继承 var a=new Array(1,2,3) a。length 这个不叫继承 这个叫做 实例化 a是Array的实例

原型链里面的属性以下划线开头的是私有属性 你是用不了的