深圳市伙伴行网络科技有限公司(套题)
选择题 | 填空题 | 问答题 | 编程题 | 试题难度 |
---|---|---|---|---|
0 | 0 | 5 | 0 | 一般 |
问答题
1、下面代码打印结果分别是什么? function a(){ this.name='HB'; console.log(this.name) } b={ name:'HB', fn:() => { console.log(this.name, this) } } a(); b.fn(); console.log(a.name); console.log(this.name)
本题主要考察的事this在JavaScript中的用法,涉及到原型和箭头函数
打印顺序依次为
HB
HB ,Window
a
HB
解析:1.首先大家要明白在全局作用域中,当代码在浏览器中执行的时候,所有的全局变量和函数都被定义在
window
对象上。因此,当我们在全局函数中使用this
的时候,它会指向全局window
对象并且拥有它的值(除非在严格模式下),此时的this
就成了整个 JavaScript 应用程序或者说整个网页的主容器。所以,在a()里面的this是指向全局的,所以会打印HB2.b.fn() 本来按照我们的理解,这里面的this指向的是b这个对象,不过由于出现了箭头函数,那么我们需要记住一个结论,箭头函数中的this指向的是定义时的this,而不是执行时的this,所以定义是的this,指向的事Window,所以会打印HB ,Window
3.a.name为什么会打印出a呢,我想大家可能对这个有点疑问,那么接下就由我来解释一下,在a函数里面是没有name这个属性的, 但是如果你打印一下a.prototype这个属性,你就会发现在a的原型里面有name这个属性,我们都知道,打印一个对象的时候先从本身找有没有这个属性,如果没有会根据原型链来寻找,一直到null为止
4.this.name这个就没什么争议了,全局的变量name,HB
2、描述一下你常用的提升页面性能的方法?
1.减少http请求
HTTP协议是无状态的应用层协议,意味着每次HTTP请求都需要简历通信链路,进行数据传输,而在服务器端,每个HTTP都需要启动独立的线程去处理,这些通信和服务的开销都很昂贵,减少HTTP请求的数目可有效提高访问性能。
减少HTTP请求的主要手段是合并CSS,合并JavaScript,合并图片。将浏览器一次访问需要的JavaScript,CSS合并成一个文件,这样浏览器就只需要一次请求。多张图片合并成一张,如果每张图片都有不同的超链接,可通过CSS偏移响应鼠标点击操作,构造不同的URL。
(2)使用浏览器缓存
对一个网站而言,CSS,JavaScript,Logo,图标等这些静态资源文件更新的频率都比较低,而这些文件又几乎是每次HTTP请求都需要的,如果将这些文件缓存在浏览器中,可以极好地改善性能。通过设置HTTP头中Cache-Control和Expires属性,可设定浏览器缓存,缓存时间可以是数天甚至是几个月。有时候,静态资源文件变化需要及时应用到客户端浏览器,这种情况可以通过改变文件名实现,比如一般会在JavaScript后面加上一个版本号,使浏览器刷新修改的文件。
(3)启用压缩
在服务器端对文件进行压缩,在浏览器端对文件解压缩,可有效较少通信传输的数据量。文本文件的压缩效率科大80%以上。
(4)CSS放在页面最上面,JavaScript放在页面最下面
浏览器会在下载完全部CSS之后对整个页面进行渲染,因此最好的做法是将CSS放在页面最上面,让浏览器尽快下载CSS。JS则想法,浏览器在加载JS后立即执行,有可能会阻塞整个页面,造成页面显示缓慢,因此JS最好放在页面最下面。
3、描述一下ES6、ES7中你常用的新特性
ES6常用新特性
- let && const
- iterable类型
- 解构赋值
- =>函数
- ...操作符
- 类
ES7新特性
- Array.prototype.includes
- Exponentiation Operator(求幂运算)
4、描述一下队列与栈的区别,并用JavaScript描述相关操作
首先要先了解一下什么是队列和栈
队列的基本概念
队列:是一种支持先进先出(FIFO)的集合,即先被插入的数据,先被取出!
堆栈的基本概念
堆栈:是一种支持后进先出(LIFO)的集合,即后被插入的数据,先被取出!
区别:
1.删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。
2.应用场景不同;常见栈的应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现,深度优先搜索遍历等;常见的队列的应用场景包括计算机系统中各种资源的管理,消息缓冲器的管理和广度优先搜索遍历等。
3.顺序栈能够实现多栈空间共享,而顺序队列不能。
JavaScript实现
在面向对象的程序设计里,一般都提供了实现队列(queue)和堆栈(stack)的方法, 在 JavaScript 中,可以使用数组及其相关操作来模拟栈操作。,来实现队列和堆栈的功能,看下面的相关介绍.
看一下它们的性质,这种性质决定了它们的使用场合
队列:是一种支持先进先出(FIFO)的集合,即先被插入的数据,先被取出!
堆栈:是一种支持后进先出(LIFO)的集合,即后被插入的数据,先被取出!
代码如下
var a=new Array();
a.unshift(1);
a.unshift(2);
a.unshift(3);
a.unshift(4);
console.log("先进先出")
a.pop()
var a=new Array();
a.push(1);
a.push(2);
a.push(3);
a.push(4);
console.log("后进先出")
a.pop()
5、使用JavaScript将一个无序的数组改变成有序(不能使用sort函数,并预估可能出现问题并解决)。(如:[1,5,3,4,2]=>[1,2,3,4,5])
可以使用冒泡排序的方式,写了一个函数,代码如下
function bubbleSort (arr) {
for (var i = 0; i < arr.length-1; i++) {
for (var j = 0; j < arr.length-1-i; j++) {
if (arr[j] > arr[j+1]) {
/* 设置第三方变量来用于数据交换,且这个变量放在循环的外面性能要好
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
*/
// 利用加法来实现两个数据的交换
// arr[j] = arr[j] + arr[j+1];
// arr[j+1] = arr[j] - arr[j+1];
// arr[j] = arr[j] - arr[j+1];
// 利用位运算实现两个数据的交换
arr[j] = arr[j]^arr[j+1];
arr[j+1] = arr[j]^arr[j+1];
arr[j] = arr[j]^arr[j+1];
}
};
};
return arr;
}