type
status
date
slug
summary
tags
category
icon
password

1.(代码题)有效的变位词

给定两个字符串 s 和 t ,编写一个函数来判断它们是不是一组变位词(字母异位词)。
注意: s t中每个字符出现的次数都相同且字符顺序不完全相同,则称 s 和 t互为变位词(字母异位词)。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
示例 3:
输入: s = "a", t = "a"
输出: false
提示:
  • 1 <= s.length, t.length <= 5 * 104
  • s and t 仅包含小写字母
解题思路
根据题目可以总结出3个条件
  1. s 和 t 不能相等
  1. s 和 t 的长度必须相等
  1. s 和 t 里的字符出现的次数必须相等 (这一点可以使用排序方法来比对)
解题:

2.(代码题)使用 js 实现有序数组原地去重

原地去重有序数组,也就是在不创建新数组的情况下修改原始数组。
示例 :
输入: [1, 2, 2, 3, 4, 4, 5, 6, 6, 6]
输出: [1, 2, 3, 4, 5, 6]
解题思路
可以使用双指针的方法,slow代表慢指针,fast代表快指针
我们从数组的第二个元素开始遍历,将其与慢指针指向的元素进行比较,如果不相等,就代表这是一个新的不重复元素,就将慢指针向后移动一位,并将这个新的不重复元素放进该位置。反之就跳过该元素,继续向后遍历
最后,返回的慢指针加1,就是去重后的数组长度

3.(问答题)谈谈对this的理解

解答
this是指包含它的函数作为方法被调用时所属的对象
它有5个绑定规则,根据不同的绑定,this的指向不同
1.默认绑定
👉如果是在全局环境中定义一个普通函数并调用,此时的this指向window
👉如果是在严格模式下,不能将全局对象用于默认绑定,此时的this指向undefined
2.new绑定
👉通过构造函数的new关键字,生成一个实例对象,此时的this就指向这个实例对象
👉特殊情况:如果new过程return了一个对象{},此时的this指向返回的对象
👉如果new过程return了一个简单类型(NumberStringNullBooleanUndefined)时,此时的this还是指向实例对象
3.显式绑定
👉call()apply()bind()是函数的方法,用于改变this指向,此时this指向它们的第一个参数
apply()第二个参数是数组,apply()call()在调用函数后会立即自动执行,bind()返回一个新的函数,需要手动执行
4.隐式绑定
👉当函数调用时,前面存在调用它的对象,此时的this就指向这个对象
obj.foo() 的调用方式,foo() 内的 this 指向 obj
👉如果函数调用前存在多个对象,此时的this指向距离调用自己最近的对象
fn.obj.foo() 的调用方式,foo() 内的 this 指向 obj
5.箭头函数绑定
👉箭头函数并没有属于自己的this,它的this指向取决于外层作用域中的this指向,外层作用域的作用域指向谁,箭头函数中的this就指向谁
👻优先级:new绑定 > 显示绑定 > 隐式绑定 > 默认绑定

4.(解答题)bind()连续调用多次,this的绑定值是什么?

解答
JavaScript中,多次bind()是无效的
答案:两次输出都是 3

5.(代码题)计算出下面数组中的平均时间

解题思路
将时间转换为分钟数,然后除以时间数量(arr的数组长度),然后再把结果转回小时和分钟

6.(解答题)说说下面代码的输出是什么

解题思路
调用Foo.a()时,会输出 4 ,因为Foo.a是一个静态方法,直接在函数对象上定义的,所以可以通过函数名直接调用
调用obj.a()时,会输出2。因为obj指的是构造函数Foo,在Foo中通过this.a定义了实例属性a,会覆盖原属性中的同名属性
最后再次调用Foo.a()时,会输出1,因为此时静态方法Foo.a已经被构造函数里的Foo.a给覆盖了
所以最后的输出结果依次是:4, 2, 1

7.(解答题)说说下面代码的执行过程和输出结果

解题
这段代码的执行过程如下:
  1. 定义变量a并赋值为3
  1. 定义一个函数c,该函数打印一个出变量a的值
  1. 定义一个立即执行函数,在里面定义变量a并赋值为4,然后调用函数c
  1. 函数c被调用,打印出变量a的值,此时打印出的结果是3
原因是在立即执行函数会创建一个独立的作用域,该函数中定义的变量,不会被外部访问到,因此函数c里面使用的变量a,只能从全局作用域中查找,因此输出的变量a的值是3

8.(代码题)Promise的finally怎么实现的?

解题思路
先在Promise原型对象上定义一个finally函数,该函数接收一个callback回调函数作为参数,并返回一个新的Promise对象。无论原始Promise的调用是否成功,都会调用callback回调函数
可以看到,我们通过this.constructor获取到了当前Promise的实例,然后通过this.then,分别处理当前Promise对象的resolvedrejected状态的情况。在resolved状态时,我们先调用callback函数,然后将结果传递给新的Promise对象;在rejected状态时,我们依旧调用callback函数,将错误信息抛出

9.(问答题)Promise then的第二个参数和catch的区别是什么

解答
Promise then 的第二个参数和catch都是用于处理Promiserejected状态,但是它们在捕获错误信息时会遵循就近原则(在then的第二个参数和catch同时存在的情况下,只有then的第二个参数可以捕获到错误,反之,则catch方法会捕获到)
它们的区别在于:
如果在then的第一个参数里抛出了异常,后面的catch能捕获到,而then的第二个参数捕获不到
catch方法返回的还是一个Promise对象,它可以继续链式调用,而then的第二个参数不可以
一般来说,捕获异常/错误建议使用catch

10.(解答题)说出下面代码的执行顺序和结果

解答
JS把任务分为同步任务和异步任务,异步任务又分为宏任务和微任务
<script>本身就是一个大的宏任务,忽略<script>,里面代码执行顺序为:
1、同步代码
2、微任务的异步代码(promise里面的.then,.catch等)
3、宏任务(setTimeout、setInterval等)
所以,把上面代码拆分成三块,按照代码的执行顺序,就可以得到如下结果:
同步代码有:
微任务有:
宏任务有:
依次将上面三个区块的代码执行出来,可得到结果:"X" 0 5 6 " C" 1 2 3 4
 
 
 
🍵🤡👻💥👉
 
《花舍》Pinia学习
衔蝉
衔蝉
一个普通的干饭人🍚
公告
type
status
date
slug
summary
tags
category
icon
password
欢迎来到衔蝉的博客小站✨
这里是我的个人学习、生活记录
--- 免责声明 ---
⚠️ 本站内容仅代表个人观点
⚠️ 本站内容仅供学习参考使用
--- 关于我 ---
我要如加菲猫一般地活着
一大碗杂碎面
就能换来一个艳阳天🌻