字节前端一面--凉
js
js 的数据类型 null undefined symbole string boolean function object array
null == undefined (true) null === null (true) 结果是什么? 为什么?
普通类型和引用类型的区别
基本数据类型是按值访问的,因为可以直接操作保存在变量中的实际值.
引用用数据类型是保存在堆内存中的对象。与其他语言的不同是,你不可以直接访问堆内存空间中的位置和操作堆内存空间。只能操作对象在栈内存中的引用地址。
所以,引用类型数据在栈内存中保存的实际上是对象在堆内存中的引用地址。通过这个引用地址可以快速查找到保存中堆内存中的对象。比如:
var a = 10; var b = a; b = 20; console.log(a); // 10值
var obj1 = new Object(); var obj2 = obj1; obj2.name = “我有名字了”; console.log(obj1.name); // 我有名字了
判断数据类型的方式有那些
- typeof 返回string,number,boolean,symbol,bigint,unfined,object,function
- instanceof 返回Object,Function,Array,Date,RegExp等
- constructor 返回null和undefined是无效的对象,因此是不会有constructor存在的,这两种类型的数据可以通过第四种方法来判断。
- toString 通用
堆内存和栈的区别
栈(stack):有编译器自动分配和释放,存放函数的参数、局部变量、临时变量、函数返回地址等;
堆(heap):一般有程序员分配和释放,如果没有手动释放,在程序结束时可能由操作系统自动释放
typeof [] 输出什么 object
this指针指向的问题
function foo() { return () => this; } console.log(foo()()) ; //指向window
普通函数和箭头函数的区别
事件循环机制 ---promise的链式调用如何理解
new Promise((resolve, reject) => { resolve(); }).then( () => { console.log('1'); }).then(() => { console.log(2); }).catch(() => { console.log(r) }).then(() => { console.log("then") }) setTimeout(() => { console.log('hhahh') }, 100); //输入 1 2 then hhahh
http
输入浏览器到ip寻址过程发现哪些事?
首先进入浏览器缓存,和host(在电脑的什么位置),然后使用dns寻址浏览器缓存
强缓存: cache-control: no-cache 此时会走协商缓存吗?
协商缓存: 304的意义是什么?
etag和什么配套使用? etag + last-modefied
代码题
求连续子串在父串中的位置
let s = "ablc"; let t = "lc"; function getIndex(S, T, slen, tlen) { let i, j = 0, k = 0; //i表示串S的下标,j表示串T的下标,k表示子串在主串的位置 i = k; //子串在主串的位置 while (i < slen && j < tlen) { if (S[i] == T[j]) { i++; j++; } else { k++; //子串后移,比较后一个自串 i = k; //后一个子串的首尾开始 j = 0; //T子串从开始比较 } } if (k === slen) { return -1; } return k; } console.log(getIndex(s, t, s.length, t.length), "we are family")
给定id的div,求其字节点的最大嵌套深度的最大值
网上找的大神的代码
var domBox = document.getElementById('lazy'); alert(getEleDeep(domBox)) function getEleDeep() { // 类似于数组的map方法 不过这里颗粒化了 var map = function map(cb) { return function (arr) { return Array.prototype.map.call(arr, cb); }; }; var max = function max(arr) { return arr.reduce(function (acc, cur) { if (cur >= acc) return cur; else return acc; }, arr[0]); }; // 递归函数 var nextChildren = function nextChildren(node) { // 基准条件 if (node.children.length === 0) return 1; else { // 求子节点们的长度 并取最大值 var deeps = map(nextChildren)(node.children); //map.call(node.children, nextChildren) return 1 + max(deeps); } }; // 计算 var deep = nextChildren(domBox); return deep; }
总结: 一面总体不是很难,怪自己基础太差了。。。多多思考为啥呢,字节问的东西比较细节深入,代码还是要敲
回报牛客,祝我春招上岸吧✊👻