经典题目之同步异步任务

299 阅读2分钟

目录

今日题

  1. 题目
  2. 分析 昨日题
  3. 题目
  4. 答案
  5. 解析 结语

今日题

题目

const one = () => console.log(1)
const two = () => console.log(2)
const three = () => setTimeout(() => console.log(3))

one()
three()
two()

分析

考察输出顺序,典型的同步异步任务

昨日题

题目

var outer = {
    name: '鲨鱼辣椒',
    inner: {
        name: '蟑螂恶霸'
    }
}
var f = function ({name, inner}) {
    name = '蝎子莱莱'
    inner.name = '蜻蜓队长'
}
f(outer)
console.log(outer.name)
console.log(outer.inner.name)

答案

'鲨鱼辣椒','蜻蜓队长'

解析

退!退!退!在做这道题之前,先说个关于这道题答案的事情,反正就挺好玩的。昨天我在群里看群成员打卡每日一题,无意间我看到了一句话“这题最多四种不同答案,全给我整出来了”,我就往上翻了翻聊天记录,我在想,这题很难吗???好了,言归正传,我们来依次分析一下。outer对象中包含name属性、inner对象,而inner对象中又包含一个name属性。然后就是函数f,f的形参为解构赋值形式,其实这道题的根本考点不是函数传参是值传递这里,而是结构赋值是如何进行的。函数f的职责为修改name以及inner.name的值。首先调用函数f并将outer对象传递进去,注意因为函数的形参是解构赋值的形式,所以此处的function({name, inner}){...}相当于function(obj){ var name = obj.name, inner = obj.inner },然后修改name时其实是修改的name变量,所以outer中的name肯定不会受到影响!然后修改inner.name,因为对象的赋值是拷贝内存地址值给对方,所以此处的inner.name就相当于outer.inner.name,所以outer.inner中的name会受到影响。执行完函数f后,输出'鲨鱼辣椒','蜻蜓队长'

结语

此文章已收录至《JavaScript每日一题》专栏,如果你对本专栏有任何建议,欢迎反馈。如果你对此文章中的题目还有不懂的地方,那么请在评论区留言与大家一起讨论吧。
创作不易,少年,就请留个赞再走吧!