一道面试题,但有多种解法

292 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

目录

今日题

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

今日题

题目

今天的每日一题我们暂时决定先换个形式,起因是昨天晚上我在群里摸鱼时,无意看到一位老哥发了一道面试题,我觉得难度还可以,所以拿出来大家一起做做。 t.jpg

分析

这道题没啥好分析的,能实现效果即可。由于这种类型的题不存在唯一答案,所以我昨晚在CodePen上注册了一个账号,今天使用它的在线编辑功能,与大家一起讨论。您可以点击此处来与我们共同完成此题。 注意点:

  1. 您完全可以将您的答案留言在评论区与大家一起讨论
  2. 您可以不必使用CodePen
  3. 倘若您决定使用在线编辑功能,您必须要确保留下您的名字、代码、编写的时间。您所编写的代码仅供他人学习,若您的代码足够优秀,也可供他人学习。

昨日题

题目

var name = '蜘蛛侦探'
var age = 5

class Person {
    constructor(name = '鲨鱼辣椒') {
        this.name = name
    }

    sayName() {
        console.log(this.name)
    }

    sayAge() {
        var age = this ? this.age : 6
        console.log(age)
    }
}

var p = new Person('蜻蜓队长')
p.age = 7
var bar = p.sayAge

p.sayName()
bar()

答案

'蜻蜓队长',6

解析

老规矩,我们先来分析一下昨天的题《一道题带你掌握class的基本用法》。首先使用var声明了两个变量nameage,这里使用var声明的目的就是让name和age去作为window的属性而存在。然后定义了一个Person类,这个Person会初始化其实例对象的name属性,并且在constructor中给了一个默认值,如果通过new调用该构造函数时没有传递参数则使用默认值'鲨鱼辣椒',如果传递了参数,则使用传递的参数,其次Person的原型对象上有两个方法,sayNamesayAge。接下来是通过new调用Person类,并将Person类返回的实例对象给了p,然后给p添加age属性,再将p.sayAge赋值给bar。最后开始调用函数,先调用sayName,因为sayName中的this为实例对象p,而constructor中已经对实例对象的name属性进行了初始化,所以输出'蜻蜓队长';调用bar,输出6,这里要注意的是,bar确实是通过window调用的(《2022-05-20》),但类中的一般方法默认是开启了严格模式,而在严格模式中如果函数的this指向window,那么this为undefined,所以输出为6

结语

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