阿里经典面向对象面试题升级版(推荐看)

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 阿里经典面向对象面试题升级版(推荐看)

前言


此题目为几年前阿里首创,此题一出就制造了面试中"惨案"。该题有可能你能说出结果,但你未必能说清楚原因。


我查阅了部分关于此题的解析,好多就是迷迷糊糊就给讲完了,根本没抓住问题核心,因此阿包也献上一篇自己的理解,希望能为正确一方添加一票,这样大家搜索到正确频率又能提高一点。


下面是原版阿里真题和解析:


传送门: 阿里题目链接


题目


分析


该题目涉及到的知识非常多,比如: 作用域、预编译、原型与原型链、new、事件循环。

我们首先来分析一下,该题上半部分到底做了些什么:


  1. 定义 test 函数
  2. test 函数创建一个静态方法 test.getName
  3. test 函数创建一个实例方法 test.prototype.getName
  4. 定义全局变量 getName,程序运行后赋值为 函数
  5. 定义全局函数 getName
  6. test 函数内部给全局变量 getName 赋新值,返回值为 this


与原题目相比,当前题目加入了事件循环的知识, Promise.thensetTimeout 都是异步任务,前者是微任务,后者为宏任务。


解析


预编译


  1. 函数预编译四部曲和全局预编译三部曲
  2. 变量声明,声明提升函数声明,整体提升


GO: {
    test: fn,
    getName: function getName() { console.log(6); }
}
复制代码


test.getName()


执行 test 函数上的静态方法 test.getName ,打印 3,setTimeout 的回调插入事件队列中,等待同步任务执行完毕


getName()


getName 执行之前, getName 已经被重新赋值为 console.log(5) ,打印 5


test().getName()


  1. test() 执行全局的 test 函数,修改全局 getName 值; test() 函数执行为默认绑定,非严格模式 this 指向 window ,返回值为 window


GO: {
    test: fn,
    // 全局 getName 值修改
    getName: function() { 
        Promise.resolve().then(() => console.log(0))
        console.log(1);               
    };
}
复制代码


  1. test().getName() 相当于执行 window.getName() ,调用 GO 中的 getNamePromise.then 压入微任务队列,打印 1


getName()


执行全局函数 getName() ,打印 1Promise.then 压入微任务队列


(⭐)new 知识补充


在进行后面题目的解析时,先补充一点关于 new 运算符的知识。


首先咱们来看一下 MDN 中对 new 的描述,语法是:


new constructor[([arguments])]
复制代码


([arguments]) 意味着可以缺省,会存在 new constructor(...args)new constructor 两种模式,并且前者的运算优先级高于后者。更详细的优先级见下图:


image.png


从上图可以看到,部分优先级如下:new(带参数列表) = 成员访问 = 函数调用 > new(不带参数列表)


new test.getName()


根据上面的知识,表达式中自左向右共有三个运算符: new 不带参数列表、成员访问、函数调用。


优先级相同的运算符执行顺序自左向右,因此先执行成员访问,获取到 test 函数上的静态方法 getName


成员访问之后,表达式相当于变为 new (test.getName)()new 操作符由不带参数列表变为带参数列表,自左向右执行,把 test.getName 视为构造函数,生成对应实例。


new (test.getName)() 执行,打印 3setTimeout 回调压入宏任务队列。


new test().getName()


表达式运算符自左向右分别为: new 带参数列表、成员访问、函数调用


  1. 执行 new test(): new 绑定, this 指向实例。
  2. new 生成实例上没有 getName 属性,沿原型链查找到 test.prototype.getName 属性,打印 4


new new test().getName()


表达式运算符自左向右分别为: new 不带参数、new 带参数、成员访问、函数调用

因此表达式可以转化为如下形式: new((new test()).getName())


  1. new test().getName: 访问到 test.prototype.getName 属性
  2. new new test().getName(): 以 test.prototype.getName 为构造函数,打印 4


Promise.then


执行微任务队列里的 promise.then ,微任务队列中共有两次 promise.then ,打印 20


setTimeout


执行宏任务队列里的 setTimeout 回调函数,打印 22


答案


3
5
1
1
3
4
4
0
0
2
2
复制代码


往期精彩文章



后语


如果大家感觉此文对你有一些帮助,希望能点个赞,鼓励一下阿包,阿包会不断努力的。另外如果本文章有问题,或者对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!


相关文章
|
1月前
|
Python 开发工具
2024年Python最全使用Python实现音频双通道分离,2024年最新阿里p7面试难度
2024年Python最全使用Python实现音频双通道分离,2024年最新阿里p7面试难度
2024年Python最全使用Python实现音频双通道分离,2024年最新阿里p7面试难度
|
1月前
|
机器学习/深度学习 Python 算法
最新【Python 百练成钢】时间调整、二进制数、回文素数、字母距离(1),2024年最新2024年阿里Python岗面试必问
最新【Python 百练成钢】时间调整、二进制数、回文素数、字母距离(1),2024年最新2024年阿里Python岗面试必问
最新【Python 百练成钢】时间调整、二进制数、回文素数、字母距离(1),2024年最新2024年阿里Python岗面试必问
|
1月前
|
数据采集 SQL 数据挖掘
2024年8个Python高效数据分析的技巧_python 数据分析 效率,2024年最新阿里社招p7面试几轮
2024年8个Python高效数据分析的技巧_python 数据分析 效率,2024年最新阿里社招p7面试几轮
|
1月前
|
PHP Python
最新【Python】 实现循环最快的方式_python while循环加速,2024年最新阿里php面试题
最新【Python】 实现循环最快的方式_python while循环加速,2024年最新阿里php面试题
|
1月前
|
算法 Java 应用服务中间件
阿里面试:说说自适应限流?
限流想必大家都不陌生,它是一种控制资源访问速率的策略,用于保护系统免受过载和崩溃的风险。限流可以控制某个服务、接口或系统在一段时间内能够处理的请求或数据量,以防止系统资源耗尽、性能下降或服务不可用。 常见的限流策略有以下几种: 1. **令牌桶算法**:基于令牌桶的方式,限制每个单位时间内允许通过的请求量,请求量超出限制的将被拒绝或等待。 2. **漏桶算法**:基于漏桶的方式,限制系统处理请求的速率,请求速率过快时将被限制或拒绝。 3. **计数器算法**:通过计数器记录单位时间内的请求次数,并根据设定的阈值进行限制。 通过合理的限流策略,可以保护系统免受恶意攻击、突发流量和资源
33 4
阿里面试:说说自适应限流?
|
20天前
|
Java 程序员
【面试官】知道synchronized锁升级吗
线程A获取了某个对象锁,但在线程代码的流程中仍需再次获取该对象锁,此时线程A可以继续执行不需要重新再获取该对象锁。既然获取锁的粒度是线程,意味着线程自己是可以获取自己的内部锁的,而如果获取锁的粒度是调用则每次经过同步代码块都需要重新获取锁。此时synchronized重量级锁就回归到了悲观锁的状态,其他获取不到锁的都会进入阻塞状态。来获得锁,CAS操作不需要获得锁、释放锁,减少了像synchronized重量级锁带来的。轻量级锁通过CAS自旋来获得锁,如果自旋10次失败,为了减少CPU的消耗则锁会膨胀为。
75 3
|
1天前
【年前最后一波装逼】记一次阿里面试,我是如何用一行代码解决约瑟夫环问题的
【年前最后一波装逼】记一次阿里面试,我是如何用一行代码解决约瑟夫环问题的
|
1月前
|
应用服务中间件 网络安全 数据安全/隐私保护
Sqlmap参数设置_sqlmap怎么指定参数(1),阿里面试100%会问到的网络安全
Sqlmap参数设置_sqlmap怎么指定参数(1),阿里面试100%会问到的网络安全
|
1月前
|
SQL 分布式计算 前端开发
2024年最全用python写一个自动生成春联的软件,打包exe,2024年最新阿里p8面试题和答案
2024年最全用python写一个自动生成春联的软件,打包exe,2024年最新阿里p8面试题和答案
2024年最全用python写一个自动生成春联的软件,打包exe,2024年最新阿里p8面试题和答案
|
1月前
|
Python
2024年最新【Python从零到壹】Python模块介绍与使用(1),2024年最新阿里面试场景题
2024年最新【Python从零到壹】Python模块介绍与使用(1),2024年最新阿里面试场景题
2024年最新【Python从零到壹】Python模块介绍与使用(1),2024年最新阿里面试场景题