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个条件
- s 和 t 不能相等
- s 和 t 的长度必须相等
- 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
了一个简单类型(Number
、String
、Null
、Boolean
、Undefined
)时,此时的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.(解答题)说说下面代码的执行过程和输出结果
解题
这段代码的执行过程如下:
- 定义变量
a
并赋值为3
- 定义一个函数
c
,该函数打印一个出变量a
的值
- 定义一个立即执行函数,在里面定义变量
a
并赋值为4
,然后调用函数c
- 函数
c
被调用,打印出变量a
的值,此时打印出的结果是3
原因是在立即执行函数会创建一个独立的作用域,该函数中定义的变量,不会被外部访问到,因此函数
c
里面使用的变量a
,只能从全局作用域中查找,因此输出的变量a
的值是3
8.(代码题)Promise的finally怎么实现的?
解题思路
先在
Promise
原型对象上定义一个finally
函数,该函数接收一个callback
回调函数作为参数,并返回一个新的Promise
对象。无论原始Promise
的调用是否成功,都会调用callback
回调函数可以看到,我们通过
this.constructor
获取到了当前Promise
的实例,然后通过this.then
,分别处理当前Promise
对象的resolved
和rejected
状态的情况。在resolved
状态时,我们先调用callback
函数,然后将结果传递给新的Promise
对象;在rejected
状态时,我们依旧调用callback
函数,将错误信息抛出9.(问答题)Promise then的第二个参数和catch的区别是什么
解答
Promise then
的第二个参数和catch
都是用于处理Promise
的rejected
状态,但是它们在捕获错误信息时会遵循就近原则(在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
🍵🤡👻💥👉
- 作者:衔蝉
- 链接:https://xianchan.ah.cn/article/records
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。