网易杭研前端题目
有一个不用循环求数组的最大值的算法
使用递归 大致思路
var i =0;
var max = 0;
var len = 0;
var arr =[1,2,8,3];
function find(max,i,arr){
if(arr[i]>max){max=arr[i]}
if(i<arr.length){
i+=1;
find(max,i,arr);
}else{
return max;
}
}
console.log(find(max,i,arr)); 判断数据类型是否相等的方法
这个跟之前判断数组的思路类似
有四种
- typeof:number,string,boolean,undefined,object,function,symbol等
- instanceof:通过判断对象的原型链中是否有类型的原型
- constructor: arr.constructor === Array
- Object.prototype.toString():Object.prototype.toString.call(arr) === '[object Array] 如果不call 返回的就是[object Object]
对console.log对象赋值会发生什么:
console.log 将在最后一个执行状态显示对象,而不是在调用 console.log的状态。
隐式转换的规则
会发生隐式转换的几个场合:
| 用+进行拼接 |
比如: 1 + '1' // '11' true + true // 2 4 + [1,2,3] // "41,2,3" |
| if语句和逻辑运算 | truly 变量 和 falsely 变量 |
| == | 当两个不同类型的数据进行抽象比较(==)时,JS会将它们先转换成统一数据类型, 低层级的数据类型向高层级的数据类型转换,直到“==”左右两边数据类型相同 然后比较数据的值是否相同 |
http2.0和http1.0
客户端多个ajax请求会产生什么问题
如果是同步请求,就会发生阻塞,应该把同步改成异步
cookie更改的权限问题
如何更改页面所有字体的样式
浏览器兼容的问题
websocket
其实 WebSocket 与 HTTP/2 一样,都是为了解决 HTTP 某方面的缺陷而诞生的。
HTTP/2 针对的是“队头阻塞”,而 WebSocket 针对的是“请求 - 应答”通信模式。
通过WebSocket可以实现真正“全双工”的通信协议
与 TCP 一样,客户端和服务器都可以随时向对方发送数据,而不用像 HTTP“你拍一,我拍一”那么“客套”。于是,服务器就可以变得更加“主动”了。一旦后台有新的数据,就可以立即“推送”给客户端,不需要客户端轮询,“实时通信”的效率也就提高了。
说白了,WebSocket 是一个“全双工”的通信协议,相当于对 TCP 做了一层“薄薄的包装”,让它运行在浏览器环境里;
WebSocket也需要握手 不过它利用 HTTP 协议实现连接握手,发送 GET 请求要求“协议升级”,握手过程中有个非常简单的认证机制,目的是防止误连接
具体过程为:
带上两个专用头字段:
- “Connection: Upgrade”,表示要求协议“升级”;
- “Upgrade: websocket”,表示要“升级”成 WebSocket 协议。
- Sec-WebSocket-Key:一个 Base64 编码的 16 字节随机数,作为简单的认证密钥;
- Sec-WebSocket-Version:协议的版本号,当前必须是 13。
删除对象的属性怎么监听
Object.defineProperty 确实无法监听属性的新增和删除 需要通过Vue.set Vue.delete来监听 但是 Proxy的Reflect可以:
new一个Proxy对象,对这个对象使用Reflect.set Reflect.deleteProperty
Array.sort()浏览器怎么实现的
iframe与所处页面的通信问题
BOM对象模型
BOM,Browser Object Model,即浏览器对象模型。
浏览器页面初始化时,会在内存创建一个全局对象,用来描述当前窗口的属性和状态,这个全局对象被称为浏览器对象模型。BOM没有官方标准,它最初是Netscape浏览器标准的一部分,也就是说,对于现代浏览器,每个浏览器都有自己的BOM实现方法,所以直接使用BOM会有兼容性问题。
于是,为了利用JavaScript完成交互,现代浏览器几乎都实现了相同的方法和属性,这些方法和属性被称作BOM的方法和属性。
重要知识点:
| navigator | 包含浏览器相关信息 navigator.userAgent |
| screen | 用户显示屏幕相关属性 screen.width .height |
| location | 即当前页面的地址 location.href .host .protocol .search .hash .pathname |
| history | 即页面的历史记录 history.back history.forward |
判断浏览器是否支持api的方法
| 判断浏览器是否支持HTML标签属性 | 'placeholder' in document.createElement('input') 支持返回true,不支持返回false |
| 判断浏览器是否支持js属性或方法 | typeof addEventListener === 'undefined' typeof 属性或方法 等于 undefined ,则表示不支持 |
服务端主动推送消息的办法
过去是使用轮询和长连接实现的 但本质还是浏览器向服务端发送了请求
但是现在有WebSocket 能够真正实现主动的推动消息 :
浏览器和服务端创建链接之后 默认不再断开 两端都可以基于该链接收发消息
如何冻结对象
Object.freeze()
正浩创新EcoFlow公司福利 777人发布
