需要注意的是最后一个定时器打印出的p1其实是.finally
的返回值,我们知道.finally
的返回值如果在没有抛出错误的情况下默认会是上一个Promise的返回值,而这道题中.finally
上一个Promise是.then()
,但是这个.then()
并没有返回值,所以p1打印出来的Promise的值会是undefined
,如果在定时器的下面加上一个return
题目描述:实现一个选择排序
// 定义 minIndex,缓存当前区间最小值的索引,注意是索引 // i 是当前排序区间的起点 // i、j分别定义当前区间的上下界,i是左边界,j是右边界 // 若 j 处的数据项比当前最小值还要小,则更新最小值索引为 j // 如果 minIndex 对应元素不是目前的头部元素,则交换两者我们知道,在 JavaScript中, Function 和 var 都会被提升(变量提升),所以上面的代码就相当于:
这样,答案就一目了然了。
(1)第一轮事件循环流程分析如下:
console.log
,输出1。
上表是第一轮事件循环宏任务结束时各Event Queue的情况,此时已经输出了1和7。发现了process1
和then1
两个微任务:
第一轮事件循环正式结束,这一轮的结果是输出1,7,6,8。
第二轮事件循环宏任务结束,发现有process2
和then2
两个微任务可以执行:
第二轮事件循环结束,第二轮输出2,4,3,5。
(3)第三轮事件循环开始,此时只剩setTimeout2了,执行。
第三轮事件循环宏任务执行结束,执行两个微任务process3
和then3
:
第三轮事件循环结束,第三轮输出9,11,10,12。
整段代码,共进行了三次事件循环,完整的输出为1,7,6,8,2,4,3,5,9,11,10,12。
对于如何优化动画,我们知道,一般情况下,动画需要频繁的操作DOM,就就会导致页面的性能问题,我们可以将动画的position
属性设置为absolute
或者fixed
,将动画脱离文档流,这样他的回流就不会影响到页面了。
当渲染树中部分或者全部元素的尺寸、结构或者属性发生变化时,浏览器会重新渲染部分或者全部文档的过程就称为回流。
下面这些操作会导致回流:
在触发回流(重排)的时候,由于浏览器渲染页面是基于流式布局的,所以当触发回流时,会导致周围的DOM元素重新排列,它的影响范围有两种:
当页面中某些元素的样式发生变化,但是不会影响其在文档流中的位置时,浏览器就会对元素进行重新绘制,这个过程就是重绘。
下面这些操作会导致回流:
注意: 当触发回流时,一定会触发重绘,但是重绘不一定会引发回流。
什么叫函数柯里化?其实就是将使用多个参数的函数转换成一系列使用一个参数的函数的技术。还不懂?来举个例子。
现在就是要实现 curry 这个函数,使函数从一次调用传入多个参数变成多次调用每次传一个参数。
resolve(6)
不会再执行;
可以用来表示一个独一无二的变量防止命名冲突。但是面试官问还有吗?我没想出其他的用处就直接答我不知道了,还可以利用 symbol
不会被常规的方法(除了 Object.getOwnPropertySymbols
外)遍历到,所以可以用来模拟私有变量。
主要用来提供遍历接口,布置了 symbol.iterator
的对象才可以使用 for···of
循环,可以统一处理数据结构。调用之后回返回一个遍历器对象,包含有一个 next 方法,使用 next 方法后有两个返回值 value 和 done 分别表示函数当前执行位置的值和是否遍历完毕。
=>
定义,箭头函数不应用普通函数 this 绑定的四种规则,而是根据外层(函数或全局)的作用域来决定 this,且箭头函数的绑定无法被修改(new 也不行)。
这是一道关于闭包的题目,对于fun方法,调用之后返回的是一个对象。我们知道,当调用函数的时候传入的实参比函数声明时指定的形参个数要少,剩下的形参都将设置为undefined值。所以 console.log(o);
会输出undefined。而a就是是fun(0)返回的那个对象。也就是说,函数fun中参数 n
的值是0,而返回的那个对象中,需要一个参数n,而这个对象的作用域中没有n,它就继续沿着作用域向上一级的作用域中寻找n,最后在函数fun中找到了n,n的值是0。了解了这一点,其他运算就很简单了,以此类推。
渐进式网络应用(PWA)
是谷歌在2015年底提出的概念。基本上算是web应用程序,但在外观和感觉上与原生app
类似。支持PWA
的网站可以提供脱机工作、推送通知和设备硬件访问等功能。
Service Worker
是浏览器在后台独立于网页运行的脚本,它打开了通向不需要网页或用户交互的功能的大门。 现在,它们已包括如推送通知和后台同步等功能。 将来,Service Worker
将会支持如定期同步或地理围栏等其他功能。 本教程讨论的核心功能是拦截和处理网络请求,包括通过程序来管理缓存中的响应。
这个问题相信很多人会第一时间想到 Promise.all
,但是这个函数有一个局限在于如果失败一次就返回了,直接这样实现会有点问题,需要变通下。以下是两种实现思路
// 以下是不完整代码,着重于思路 非 Promise 写法
// 失败次数大于3次就应该报错了
// 失败次数大于3次就应该报错了
第1讲 程序设计与C语言
1.1 程序设计语言及其发展随堂测验
2、C语言源程序是用编译方式进行翻译的。
1.2 C语言的发展及其特点随堂测验
1.3 简单的C程序介绍随堂测验
3、1个C程序可以由1个或多个函数构成,但必须有1个函数名为main。
4、语句的结束标志是冒号“:”
5、C程序中1条语句必须写在一行。
1.4 C程序的上机步骤随堂测验
1、求两个数中的较小者。
第2讲 程序的数据描述——基本数据类型
2.1 C语言基本元素随堂测验
2.2 C语言数据类型随堂测验
2.3 常量和变量随堂测验
2、C语言中常量是没有类型之分的。
3、在程序运行期间,变量可以多次被赋值。
4、C程序中变量可以不定义而直接使用。
5、在程序运行过程中其值不能被改变的量称为:
2.4 整型数据随堂测验
4、1个有符号短整型数的最大正数是:
5、1个无符号短整型数的最大正数是:
2.5 实型数据随堂测验
2.6 字符型数据随堂测验
6、字符型数据在内容中占的字节数是:
7、'a'在内存中占的字节数是:
8、"a"在内存中占的字节数是:
第3讲 程序的数据运算
3.1 运算符与表达式随堂测验
4、赋值运算符的结合性为左结合。()
5、单目运算符、赋值运算符和条件运算符均为右结合性。( )
3.2 算术运算随堂测验
2、在C语言中,如果算术运算符(/)的运算对象中有一个是实型,则结果为双精度实型。()
3、在C语言中, 用算术运算符%求两个数相除的余数,要求两侧的运算对象必须为 数据。
3.3 赋值运算随堂测验
5、若x和n均是int型变量,且x和n的初值均为5,则计算表达式x+=n++后x的值为 ,n的值为 。
3.4 自增和自减运算及强制类型转换随堂测验
3、C语言中用 表示逻辑“假”。
4、为表示关系x≥y≥z,应使用C语言表达式 。
1、判断1个五位正整数是否是对称数。
第4讲 顺序结构程序设计
4.1 程序的基本结构随堂测验
1、任何复杂的程序都是由逆序结构、选择结构、循环结构这三种结构构成的。
4.2 C语句概述随堂测验
4.3 字符数据输入输出随堂测验
4.4 数据格式化输入输出随堂测验
46、在C程序中,注释说明只能位于一条语句的后面。
47、假设所有变量均为整型,则表达式(a=2,b=5,b++,a+b)的值为7。
48、在C 程序中,逗号运算符的优先级最低。
49、在C语言中char型数据在内存中的存储形式为ASCII码。
51、每个语句和数据定义的最后都必须有分号。
52、字符 '\0' 是字符串的结束标记,其ASCII代码为0。
53、算述运算*、/、+和一具有相同的优先级。
65、字符串常量 "ab\10823c" 在内存中的字节数是( )。
67、在C语言的赋值表达式中,赋值号左边必须是( )。
第5讲 选择结构程序设计
5.1 关系运算符和关系表达式随堂测验
5.2 逻辑运算符和逻辑表达式随堂测验
2、case与冒号之间可以是浮点类型数据
3、switch语句每个分支必须执行
5.5 条件运算符和条件表达式随堂测验
3、条件运算符符可以嵌套使用。
5.6 选择结构程序举例随堂测验
第6讲 循环结构程序设计
2、循环条件表达式不仅限于关系表达式和逻辑表达式,可以是任意类型的表达式。
3、while语句的循环体,可能一次也不被执行。
4、如果循环条件表达式的值__,表示条件为真;如果表达式的值为___,表示条件为假。
5、当循环体包含一条以上的语句时,必须用__括起来,组成复合语句。
2、若某do-while的循环体由3条语句组成,这3条语句不必用大括号“{}”括起来。
4、do-while语句的循环体,可能一次也不被执行。
3、for(表达式1;表达式2;表达式3)中的3个表达式都可以省略,但用于分割3个表达式的两个分号“;”不能省略。
6.4 循环嵌套随堂测验
4、双重循环的执行过程是外层循环的循环体执行一次,内层循环执行一遍。
6.5 辅助控制语句随堂测验
6.6 循环结构实例随堂测验
8、关于双重循环的执行过程,以下说法正确的是__。
77、循环条件表达式不仅限于关系表达式和逻辑表达式,可以是任意类型的表达式。
78、while语句的循环体,可能一次也不被执行。
79、若某do-while的循环体由3条语句组成,这3条语句不必用大括号“{}”括起来。
81、do-while语句的循环体,可能一次也不被执行。
82、for(表达式1;表达式2;表达式3)中的3个表达式都可以省略,但用于分割3个表达式的两个分号“;”不能省略。
84、双重循环的执行过程是外层循环的循环体执行一次,内层循环执行一遍。
87、case与冒号之间可以是逻辑表达式,进行选择
88、switch语句的分支有可能一个都不执行
89、如果循环条件表达式的值__,表示条件为真;如果表达式的值为___,表示条件为假。
90、当循环体包含一条以上的语句时,必须用__括起来,组成复合语句。
102、在逻辑运算符!,&&,||中,优先级最高的是 。
103、在下列运算符+,+=,++中,优先级最低的是 。
第7讲 同类型数据的处理——数组(一)
7.2 一维数组的定义和引用随堂测验
4、4、完善以下程序,填写括号内容: 已有一个已排好序的整型数组,今输入一个整数,要求按原来排序的规律将它插入数组中。例如:原来数组的元素依次为4、6、8、41、56、77、102。若将42插入数组中,则插入后数组元素依次为4、6、8、41、42、56、77、89、102。 #include <stdio.h> int main() { int a[8]={
5、5、一般地,一维数组各元素分配在连续地内存单元之中。
7.3 一维数组的应用随堂测验
7.4 二维数组定义和引用随堂测验
5、5、c语言中,一维数组某一个数组元素等价于一个同数据类型的变量。
7.5 二维数组的应用随堂测验
4、4、c语言中,当二维数组越界时,会有错误提示。
5、5、c语言中,二维数组某一个数组元素等价于一个同数据类型的变量。
7.6 数组下标越界访问问题随堂测验
5、5、c语言中,二维数组下标越界时,会有错误提示。
第8讲 同类型数据的处理——数组(二)
7.7 字符数组定义及输入输出随堂测验
3、字符数组中的数据存储时必须以'\0'结尾。
7.8 字符串处理函数随堂测验
2、对字符串进行输入输出操作时,只能对字符串整体进行输入输出。
3、如果在程序中调用了strcpy函数,则需要预处理命令 。
7.9 字符数组应用举例随堂测验
A: ‘==’在比较过程中,不但会比较两边的值,还会比较两边的数据类型
A: break关键字可以用于switch-case结构当中,跳出当前结构 B: break关键字可以用于循环当中,跳出当前循环 C: break关键字和continue的用法是一样的,因此可以通用 D: break后面的代码不会再执行
A: js中的数组可以存储任意的数据类型 B: js中的数组长度是动态可变的 C: unshift()可以用来删除数组的最后一项
A: 函数可以用来封装某些重复的代码,解决代码冗余 B: 函数包含三要素,函数功能(函数名),参数和返回值 C: 函数的形参,就相当于是函数内部的变量,只能在函数内部使用 D: js中的函数,形参和实参的个数可以不一样
A: return是js中的关键字,不能用来定义变量 B: return关键字用于函数当中,用于返回函数当中的数据 C: return用于函数当中,当执行了return之后,后面的代码不再执行
cookie的内容主要包括:名字、值、过期时间、路径和域。路径与域一起构成cookie的作用范围. 若不设置时间,关闭浏览器窗口,cookie就会消失。这种生命期为浏览器会话期的cookie被称为会话cookie。
v-model指令在vue内的作用是数据双向绑定; 通过绑定数据,提取绑定数据显示:
一般情况下变量在创建的作用域内取值,若是寻找不到,就会向上级作用域访问(就是内部子级函数项父级获取变量),这个过程形成的链条就叫作用域链.
构造函数与其他函数没有太大区别,主要是功能性,是为了提高函数内相同代码的复用,将其提取成一个构造函数,可以通过(new 构造函数名称)调用. 基本语法: function 构造函数名称() { this.属性 = 值 this.方法 = function(){
简单讲就是子级函数内的变量被父级函数以外的函数引用,就会形成闭包.就是一个函数内的函数局部变量被该函数之外其他函数调用 闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。 闭包的作用,就是保存自己私有的变量,通过提供的接口(方法)给外部使用,但外部不能直接访问该变量。
答: Javascript 是面向对象的,每个实例对象都有一个__proto_属性,该属性指向它原型对象,这个实例对象的构造函数有一个原型属性 prototype,与实例的__proto__属性 指向同一个对象。当一个对象在查找一个属性的时,自身没有就会根据__proto__ 向它的原型进行查找,如果都没有,则向它的原型的原型继续查找,直到查到Object.prototype._proto_为 null,这样也就形成了原型链。
答: 1xx:指示信息--表示请求已接收,继续处理。 2xx:成功--表示请求已被成功接收、理解、接受。 3xx:重定向--要完成请求必须进行更进一步的操作。 4xx:客户端错误--请求有语法错误或请求无法实现。 5xx:服务器端错误--服务器未能实现合法的请求。
200 OK:客户端请求成功。 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。 403 Forbidden:服务器收到请求,但是拒绝提供服务。 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
答 1.浏览器的地址栏输入URL并按下回车。 2.浏览器查找当前URL是否存在缓存,并比较缓存是否过期。 3.DNS解析URL对应的IP。 4.根据IP建立TCP连接(三次握手)。 5.HTTP发起请求。 6.服务器处理请求,浏览器接收HTTP响应。 7.渲染页面,构建DOM树。 8.关闭TCP连接(四次挥手)。