题目内容:
第一题:数据类型
第二题:原型链
第三题:this
第四题:new
题一:JS数据类型有哪些?
这是个记忆题。
简版答案如下:
- 数字 number
- 字符串 string
- 布尔 Boolean
- 空 null
- 空 undefined
- 对象 object
- 大整数 bigint
- 符号 symbol
前面六种是旧的,ES6就支持的,后面两种是新的。
细化答案:
1.为什么需要bigint?
js中的number是双精度浮点数,就是精度不太够的意思,但整数数字超过一定范围时,就不准确了:12345671234567能输出成12345671234566。这个时候就需要bigint来使数字准确,用12345671234567n来表示它是一个bigint,输出的时候,就能避免由于整数数字大导致的不准确问题。
2.为什么需要symbol?
symbol基本上没什么用,它在你做库的时候自定义一些东西的使用,面试的时候不会这样问,而是会问你,你在哪里用到的,你怎么使用symbol的。但是这样的薪资都是20k以上。
错误答案:
把类(class)当成类型(type):说出函数,日期,数组这样的答案会直接0分。
题二:原型链是什么?
大概念题,答题思路为
大概念化成小概念(分割),抽象化成具体(举例)。
我的答题思路如下:
- 哦,原型链涉及到的概念挺多的,我举例说明一下吧。
- 假设我们有一个普通对象 x={} ,这个 x 会有一个隐藏属性,叫做 _ ????? _ ,这 个属性会指向 Object.prototype ,即
x._ _?????_ _ === Object.prototype // 原型- 此时,我们说
x 的原型是 Object.prototype,或者说 Object.prototype 是 x 的原 型。 而这个 _ ????? _ 属性的唯一作用就是用来指向 x 的原型的。 - 如果没有 _ ????? _ 属性,x 就不知道自己的原型是谁了。 为什么我用问号来表示?因为这样你不容易晕。
- 接下来我来说说
原型链,我还是举例说明吧。- 假设我们有一个数组对象 a=[ ] ,这个 a 也会有一个隐藏属性,叫做 _ ????? _ , 这个属性会指向 Array.prototype . 即
a.__?????__ === Array.prototype- 此时,我们说 a 的原型是 Array.prototype ,跟上面的 x 一样。但又有一点不一样, 那就是 Array.prototype 也有一个隐藏属性 _ ????? _ ,指向 Object.prototype , 即 // 用 x 表示 Array.prototype
x.__?????__ === Object.prototype- 这样一来,a 就有两层原型:
- a 的原型是 Array.prototype
- a 的原型的原型是 Object.prototype
- 于是就通过隐藏属性 _ ????? _ 形成了一个链条: a ===> Array.prototype ===> Object.prototype 这就是原型链。 以上我对「原型链是什么」的回答。
- 怎么做:
- 看起来只要改写 x 的隐藏属性 _ ????? _ 就可以改变 x 的原型(链)
但是这不是标准推荐的写法,为了设置 x._ ????? __ ,推荐的写法是x.__?????__ = 原型没错,JS 就是这么别扭。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 里的属性。
- 以 a ===> Array.prototype ===> Object.prototype 为例,
- 优点: 简单、优雅。
- 缺点: 跟 class 相比,不支持私有属性。
- 怎么解决缺点: 使用 class 呗。但 class 是 ES6 引入的,不被旧 IE 浏览器支持。
题三:this是什么?
方法题。
- 什么时候改this?在所有调用函数时直接改成call(this)形式
- this改什么?函数调用的前面一部分是什么就改什么咯。
- 特殊情况,箭头函数,new,和this在外面已经被申明过了。
详情可以参考:this 的值到底是什么?一次说清楚 - 知乎 (zhihu.com)
JS的new做了什么?
记忆题。建议甩博客链接。
答案如下:
- 创建了一个临时对象/新对象。
- 绑定原型
- 指定this = 临时对象
- 执行构造函数
- 返回临时对象
思路如下:
当你不知道new做了什么,那你肯定知道创建一个新对象要做什么,你知道创建一个新对象要做什么,你再想想,JS之父如何优化这个创建的过程的,这些事情就是new帮你在做。
解决共有属性的问题。
- 首先创建一个对象嘛,这个对象属性太多了,创建很多次,要耗很多内存,那我帮你写好原型,给你绑定好吧。
- 我如何绑定原型?是不是要用this,那我帮你指定this呗。
解决私有属性的问题。
难道我写一个私有属性我也要自己写嘛?
- 那我给你建立一个函数,你把参数传给我,我给你弄好,然后给你返回回去呗。
- 好了,接下来,我只要执行这个函数,你就可以用了。
过程可以看看这个:JS 的 new 到底是干什么的? - 知乎 (zhihu.com)