字节前端三面
可转正实习岗,凉了。
全程50min。
计网
问题1:HTTP有哪些请求方法?(二面问过的)追问put和post有什么区别?
答:(1)一些HTTP请求方法:
- GET,最常用的方法,用于请求服务器发送某个资源
- HEAD,与GET类似,但服务器在响应中只返回首部,不会返回实体的主体部分
- PUT,向服务器写入文档(与GET相反),PUT方法的语义就是让服务器用请求的主题部分来创建一个由所请求的URL命名的新文档,如果URL已存在就用这个主体来代替它
- POST,向服务器输入数据,通常用它来支持HTML表单提交
- TRACE,请求穿过***、代理、网关或一些其他应用时可能会被修改,TRACE方法允许客户端在最终将请求发送给服务器时看看他变成了什么样子
- OPTIONS,请求服务器告知其支持的各种功能
- DELETE,请服务器删除请求URL所指定的资源
(2)POST用于向服务器发送数据,PUT用于向服务器上的资源(例如文件)中存储数据。
问题2:HTTPS讲一下?HTTPS请求头会被加密吗?
答:HTTPS里的SSL/TLS是完全模拟了一个通信通道,在其上应用协议的全部数据都会加密。可以理解为平时TCP传输的数据都被加密了,这里并不区分具体的HTTP头。
JS
问题1:箭头函数和普通函数有什么区别?
答:
编程题
刚开始想让我写发布订阅,我说还没学过。
问题1:把字符串转换成驼峰格式
const test='abc-abc-abc';//测试用例 const words=test.split('-'); const len=words.length; for(let i=1;i<len;i++){ words[i]=words[i][0].toUpperCase()+words[i].slice(1); } console.log(words.join(''));追问:①修改会改变原来的字符串吗?(不会,JS中的字符串都是不可变的)②如果字符串中有多种分隔符怎么办(比如又有_又有-)?(模仿split的效果写一个可以去掉多种分隔符的for循环)
问题2:括号匹配
用栈就可以。
function isMatched(str){ if(!str){ return true; } const len=str.length; if(len%2!==0){ return false; } const stack=[]; for(let i=0;i<len;i++){ if(str[i]==='{'||str[i]==='('||str[i]==='['){ stack.push(str[i]); } else{ let val=stack.pop(); if(val==='{'&&str[i]==='}'){ continue; }else if(val==='['&&str[i]===']'){ continue; }else if(val==='('&&str[i]===')'){ continue; }else{ return false; } } } if(!stack.length){ return true; }else{ return false; } } console.log(isMatched('{{{((([[]])))}}}'));
问题3:对象深拷贝,注意循环引用的问题,不要陷入死循环(没做出来)
根据这篇帖子写了个简化版,只考虑循环引用的情况
//函数功能:判断参数是否对象类型 function isObject(target) { return typeof target === 'object' && target; } //函数功能:深拷贝 function deepClone(target) { const map = new WeakMap(); return deepCloneCore(target, map); } //核心函数 function deepCloneCore(data, map) { //如果是简单类型直接返回 if (!isObject(data)) { return data; } const exist = map.get(data); if (exist) { return exist; } //静态方法 Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组。 const keys = Reflect.ownKeys(data); //Object.getOwnPropertyDescriptors() 方法用来获取一个对象的所有自身属性的描述符。 const allDesc = Object.getOwnPropertyDescriptors(data); //Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。 const result = Object.create(Object.getPrototypeOf(data), allDesc); map.set(data, result); keys.forEach(key => { const val = data[key]; if (isObject(val)) { result[key] = deepCloneCore(val, map); } else { result[key] = val; } }); return result; } //测试 const a = {}; const b = {}; a.b = b; b.a = a; console.log(deepClone(a));
非技术问题
为什么没有实习,怎么学的前端,后面有什么学习计划,性格的优缺点