[面试押题]js基础篇

119 阅读4分钟

题目内容:

第一题:数据类型
第二题:原型链
第三题: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 就有两层原型:
      1. a 的原型是 Array.prototype
      2. a 的原型的原型是 Object.prototype
      3. 于是就通过隐藏属性 _ ????? _ 形成了一个链条: a ===> Array.prototype ===> Object.prototype 这就是原型链。 以上我对「原型链是什么」的回答。
  • 怎么做:
    • 看起来只要改写 x 的隐藏属性 _ ????? _ 就可以改变 x 的原型(链)
    x.__?????__ = 原型 
    
    但是这不是标准推荐的写法,为了设置 x._ ????? __ ,推荐的写法是
    const x = Object.create(原型) 
    // 或 
    const x = new 构造函数() 
    // 会导致 x.__?????__ === 构造函数.prototype
    
    没错,JS 就是这么别扭。
  • 解决了什么问题: 在没有 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 浏览器支持。

题三:this是什么?

方法题。

  1. 什么时候改this?在所有调用函数时直接改成call(this)形式
  2. this改什么?函数调用的前面一部分是什么就改什么咯。
  3. 特殊情况,箭头函数,new,和this在外面已经被申明过了。

详情可以参考:this 的值到底是什么?一次说清楚 - 知乎 (zhihu.com)

JS的new做了什么?

记忆题。建议甩博客链接。

答案如下:

  • 创建了一个临时对象/新对象。
  • 绑定原型
  • 指定this = 临时对象
  • 执行构造函数
  • 返回临时对象

思路如下:

当你不知道new做了什么,那你肯定知道创建一个新对象要做什么,你知道创建一个新对象要做什么,你再想想,JS之父如何优化这个创建的过程的,这些事情就是new帮你在做。

解决共有属性的问题。

  • 首先创建一个对象嘛,这个对象属性太多了,创建很多次,要耗很多内存,那我帮你写好原型,给你绑定好吧。
  • 我如何绑定原型?是不是要用this,那我帮你指定this呗。

解决私有属性的问题。

难道我写一个私有属性我也要自己写嘛?

  • 那我给你建立一个函数,你把参数传给我,我给你弄好,然后给你返回回去呗。
  • 好了,接下来,我只要执行这个函数,你就可以用了。

过程可以看看这个:JS 的 new 到底是干什么的? - 知乎 (zhihu.com)