根底类:
1、数据类型的转换和比拟。(+2)数据类型转换
+true; //1 , 一元加号会尝试将 boolean
类型转换为数字类型。true
被转换为 1
,false
被转换为0
。
!”Lydia”; //false
1、函数传参
对象类型是援用传递
function person(per){
per.name = 'haha';
per.age = 3;
console.log(per)
}
person({name:"www", age: 2})
// {name: "haha", age: 3}
2、Object.is()和 ==,=== 的区别
Object.is 办法在 === 的根底上减少了 NaN 和 NaN 是相等的;+ 0 和 - 0 是不相等的
延长:== 隐式转换 规定;运算符的优先级;(+1)
+0 === -0 //true
+0 === -'0' //true
+1 === -'1' //false
Object.is(+0, -0) //false
2、闭包题。https://segmentfault.com/a/11…
3、事件委托。https://segmentfault.com/a/11…
3、http 协定状态码,301 和 302 的区别,304 缓存类型,强缓存和协商缓存的区别。
常见的状态码有 200,301,302,304,400,404,401,500,502
其中以 2 结尾的代表申请胜利,以 3 结尾的是重定向,其中 301 是永恒重定向,302 是长期重定向,强缓存和协商缓存[缓存](https://mp.weixin.qq.com/s/dnEbgNnu7rL9i2V_Zjjnyw)**(+3)**
4、js 运行机制。js 运行机制(+2)
5、es6 用过哪些。promise 的实现原理(+1),all 办法(+2)。
Promise.all = function(arr){let result = [], count = 0;
return new Promise(function(resolve, reject){for(let item of arr){
item.then(res=>{result[count] = res;
count++;
if(count === arr.length){resolve(result);
}
})
};
});
};
let promise1 = new Promise(function(resolve) {resolve(1);
});
let promise2 = new Promise(function(resolve) {resolve(2);
});
let promise3 = new Promise(function(resolve) {resolve(3);
});
let promiseAll = Promise.all([promise1, promise2, promise3]);
promiseAll.then(function(res) {console.log(res);
});
Promise.all = function(arr){let result = [], count = 0;
return new Promise(function(resolve, reject){
arr.map(item=>{
item.then(res=>{result[count] = res;
count++;
(count === arr.length) && resolve(result);
}).catch(err=>{result[count] = err;
count++;
(count === arr.length) && resolve(result);
});
});
});
};
var p1 = new Promise(function(resolve, reject){reject(1)})
var p2 = new Promise(function(resolve, reject){resolve(2)})
Promise.all([p1, p2]).then(res=>{console.log(res)
})
let,const,var 申明变量的作用域不同;变量晋升;(+1)变量的赋值能够分为三个阶段:1、创立变量,在内存中开拓空间
2、初始化变量,将变量初始化为 undefined(let 和 const 申明的初始化时不会分配内存,所以会存在暂时性死区)3、真正赋值
- let,const,var 的区别(+1)
作用域概念不同;变量晋升(+1)
- es6 数组罕用的 api(+1)
- set,map,剪头函数和一般函数的区别(+1)
- map 遍历绝对于其余遍历形式的长处(+1)
- class
- 模板字符串:标签模板
- await 和 async 的应用(+1)
- promise.all 的实现(+2)
6、isNaN 和 Number.isNaN 的区别。
isNaN 会有一个转换,可能转换为数字类型的都返回 false,
Number.isNaN 是严格判断是否为 NaN
6、数组的 flat 扁平化办法。
返回一个新数组对原数组没有影响,默认扁平化一级
6、正则(获取 url 参数等)。
7、纯函数(+1)
7、数据类型的判断(+1)
7、instanceof 的实现原理(+1)
7、手写 new 的实现(+2)
7、手写 call 和 apply 的实现(+1)
7、defer 和 async 的区别(+1)
7、js 监听对象属性的扭转具体是怎么实现的,它们各自有什么特点?(+1)
7、挪动端适配;sass,less 的长处;挪动端几倍图是依据什么来定义的(+1)
7、css 布局,flex 布局形式(+1)
7、实现正方形(+2)
7、五种以上居中形式居中(+1)
7、浏览器如何解析 css 选择器
7、css 款式抵触的解决方案,scoped 的实现原理
7、css 选择器的优先级(+1)
框架利用类:
1、防抖节流;(+3)
防抖可利用于阻止反复发送申请,一段时间内反复触发的话则会从新计算工夫,只会执行最初一次;节流是只认第一次的操作,在某一时间段内不论触发多少次,只执行第一次函数的回调;
2、vue 双向数据绑定的实现。(+2)
defineProperty——>
2、computed 和 watch 的区别。(+2)
3、vue 中 key 的作用是什么?(+2)
——>diff 算法——> 重绘和回流(重排)重绘回流(+1)
3、vue 生命周期(+1)
3、webpack 相干。
- 优化(配置优化,代码优化)(+2)
- webpack 热更新原理(+1)
- chunk 和 baundle 的区别(+1)
- 压缩插件的弊病(+1)
4、axios 和 ajax 的区别,fetch 的区别,劣势。
5、跨域办法。
思路:说到跨域先理解同源策略——> 常见的跨域场景——> 解决方案
6、组件化
组件可复用性
7、设计模式;
罕用的设计模式以及解决了什么问题
8、cdn
8、node 的理解
9、vue 和 react 的设计理念,react 的简略理解
9、输出 url 到页面渲染产生了什么(+1)
9、性能优化(+1)
9、性能监控(+1)
9、http 协定相干(+1)
9、export 和 export default,moudle.export 的区别(+1)
9、内存泄露(+1)
算法类:
1、数组去重,思考优化,尽量用最优的算法实现。数组去重办法
for(var i = 0, len = arr.length; i < len; i++){for(var j = i+1, lenj = arr.length; j < lenj; j++){if(arr[i] == arr[j]){arr.splice(j, 1);
j--;
lenj--;
i--;
len--;
}
}
}
var obj = {};
for(var i = 0, len = arr.length; i < len; i++){if(!obj[arr[i]]){obj[arr[i]] = arr[i];
}
}
console.log(Object.values(obj))
利用 indexOf
2、寻找数组中第 k 大值。
2、判断字符串同构。
3、排序,二叉树遍历(中序(+1),后序,前序)。
3、微信红包算法。
https://github.com/mqyqingfeng/Blog
https://muyiy.cn/question/