web前端-经典面试整理持续更新【分类】

浏览器相关

浏览器最大并发量限制是多少个?及如何去突破这个限制?

浏览器最大并发量限制

浏览器的并发连接数是有限的,一般是4到6个,在10个以内。

如果你的网站打开加载的资源过多,一般可以用按需加载,分步延时加载等机制,但如果需要同时加载,我们可以把资源分布到不同的域名下缺点是需要DNS解析更多的域名

因为浏览器并发连接数限制是针对于同一个域名的。这样就实现了并发量的限制,例如一个域名的并发量是10,那么两个域名的并发量就是20。

在火狐浏览器中输入about:config,然后 输入network.http.max可以看到个服务器的最大持久连接

network.http.max-persistent-connections-per-server // 6

其它说明:针对浏览器最大并发量有限制,还有一个原因是HTTP/1.1的Keep alive,keep alive技术的存在使得浏览器复用现有连接和服务器通信比创建新连接的性能要更好一些。

什么是Keep-Alive模式?

我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。

http 1.0中默认是关闭的,需要在http头加入"Connection: Keep-Alive",才能启用Keep-Alive;http 1.1中默认启用Keep-Alive,如果加入"Connection: close ",才关闭。目前大部分浏览器都是用http1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep-Alive连接就看服务器设置情况。

其它参考:

JavaScript

数组去重的方法有哪些?

方法一:for...of + Object

利用对象的属性不能相同的特点进行去重,代码如下:

function distinct(a,b) {
    let arr = a.concat(b)
    let result = []
    let obj = {}

    for (let i of arr) {
        if (!obj[i]) {
            result.push(i)
            obj[i] = 1
        }
    }

    return result
}

方法二:ES6的new Set()

Set数据结构,它类似于数组,其成员的值都是唯一的。

利用Array.from将Set结构转换成数组。

return Array.from(new Set([...a,...b]))
}

更多方法可参考:《JS实现数组去重方法整理》

怎样判断一个对象是否为数组?

let temporaryArray3 = [1,2,1,3];
console.log(temporaryArray3 instanceof Array);
console.log(temporaryArray3.constructor == Array);
console.log(Array.isArray(temporaryArray3));
console.log(Object.prototype.toString.call(temporaryArray3) === "[object Array]");

怎样判断一个对象是否为空?

方法一:将json对象转化成json字符串,然后进行判断是否等于字符串'{}'

let isObject = {};
console.log(JSON.stringify(isObject) === '{}');   true

方法二:使用for...in,若不为空,则返回false

let isObject = {};
 isEmptyObject(obj) {
    for(let key in obj) {
        return false;
    }
    true;
}
console.log(isEmptyObject(isObject));  true

方法三:使用Object.keys()来判断,返回的是一个数组,根据数组长度来判断

 isEmptyObject2(obj) {
    return Object.keys(obj).length == 0;
}
console.log(isEmptyObject2(isObject));

方法四:对这个对象中一定存在的属性进行判断

console.log(isObject.id == null);

 循环中使用闭包解决 `var` 定义函数的问题

如下代码:

for (var i = 1; i <= 5; i++) {
  setTimeout( timer() {
    console.log(i)
  },i * 1000)
}

每次输出结果都是6,如下三种解决方式。

方法一:使用闭包

) {
  ;((j) {
    setTimeout( timer() {
      console.log(j)
    },j * 1000)
  })(i)
}

方法二:使用 setTimeout的第三个参数,这个参数会被当成 timer 函数的参数传入

) {
  setTimeout(
     timer(j) {
      console.log(j)
    },1)">,i
  )
}

方式三:使用let定义变量i

for (let i = 1; i <= 5; i++)
}

其它

开发中遇到最大的难题是什么及如何去解决的?

答案:略

相关文章

1==&gt;简述一下src与href的区别 src用于替换当前元素;...
什么是window对象?什么是document对象? window对象代表浏览...
1 》vue-router有哪几种导航钩子? 第一种:是全局导航钩子:...
1=&gt;为什么data是一个函数 【理解】 组件的data写成一...
01 vue3的新特征 1.组合式API. setUp作为组合函数的入口函数...