数据类型
一共八种 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 为例,我们说:
- a 是 Array 的实例,a 拥有 Array.prototype 里的属性
- Array 继承了 Object(注意专业术语的使用)
- 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的实例
原型链里面的属性以下划线开头的是私有属性 你是用不了的