-
深拷贝和浅拷贝
浅拷贝是拷贝了对象的引用,当原对象发生变化的时候,拷贝对象也跟着变化;深拷贝是另外申请了一块内存,内容和原对象一样,更改原对象,拷贝对象不会发生变化;
深层次理解:浅拷贝是拷贝一层,深层次的对象级别的就拷贝引用;深拷贝是拷贝多层,每一级别的数据都会拷贝出来
深拷贝实现方法:
递归和序列化反序列化
浅拷贝:
object.assign()
扩展运算符
遍历 -
webpack
侧重打包,性能优化,压缩从四,js -
数组排序:原生sort,冒泡排序(比较相邻的两个数),快速排序(递归,左右快速的排序), 还有插入排序,选择排序
-
数据结构
栈(先进后出)队列(先进先出)链表,set集合 -
js拖拽功能的实现
-
js节流和防抖
防抖是输入框,滚动,太频繁容易使页面卡顿,掉帧。然后采用合并请求,n秒内执行一次。
节流是n秒内至少执行一次。
-
手动实现promise
-
Commonjs,Amd,cmd模块化
commonjs是用在服务器端的,同步的,如nodejs
amd, cmd是用在浏览器端的,异步的,如requirejs和seajs
其中,amd先提出,cmd是根据commonjs和amd基础上提出的 -
Once函数
-
Promise封装ajax
-
Js监听对象属性的改变
-
自己实现一个bind函数,apply函数
-
数组去重(最起码说三种)
1.indexof 遍历,元素在数组中出现的位置push到数组中
2.Array.from(newSet(arr))
3.对象建值对去重
-
sleep函数
-
怎么用set timeout 实现set intervals
Settimeout(function(){
settimeout(arguments.callee,200)},200) -
递归 自己调用自己
function getSum(x) {
if (x==1){
return 1
}
return x+getSum(x-1);
};var sum=getSum(5);
console.log(sum);
console.log(getSum(10)); -
js主线程,异步队列
macro-task队列真实包含任务:
script(主程序代码),setTimeout, setInterval, setImmediate, I/O, UI rendering
micro-task队列真实包含任务:
process.nextTick, Promises, Object.observe, MutationObserver
由此我们得到的执行顺序应该为:
script(主程序代码)—>process.nextTick—>Promises…——>setTimeout——>setInterval——>setImmediate——> I/O——>UI rendering
在ES6中macro-task队列又称为ScriptJobs,而micro-task又称PromiseJobs
微任务优先级高于宏任务
setImmediate(function(){
console.log(1);
},0);
setTimeout(function(){
console.log(2);
},0);
new Promise(function(resolve){
console.log(3);
resolve();
console.log(4);
}).then(function(){
console.log(5);
});
console.log(6);
process.nextTick(function(){
console.log(7);
});
console.log(8);
- 第一个过程过后,已经输出了3 4 6 8
- 第二步. 由于其他micro-task 的 优先级高于macro-task。
- 此时micro-task 中有两个任务按照优先级process.nextTick 高于 Promise,所以先输出7,再输出5
- 第三步,micro-task 任务列表已经执行完毕,家下来执行macro-task. 由于setTimeout的优先级高于setIImmediate,所以先输出2,再输出1。
- 闭包的应用
1.匿名自执行函数
2.缓存结果(不太会用)
3.封装
4.类和继承
一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值
闭包:即重用一个变量,又保护变量不被污染的一种机制。
为什么使用闭包 : 全局变量和局部变量都具有不可兼得的优缺点。
全局变量: 优: 可重用, 缺: 易被污染。
局部变量: 优: 仅函数内可用,不会被污染。
缺: 不可重用!
何时使用: 只要即重用一个变量,又保护变量不被污染时。
如何: 3步:
1. 用外层函数包裹要保护的变量和内层函数。
2. 外层函数将内层函数返回到外部。
3. 调用外层函数,获得内层函数的对象,保存在外部的变量中——形成了闭包。
闭包形成的原因: 外层函数调用后,外层函数的函数作用域(AO)对象无法释放,被内层函数引用着。
闭包的缺点:
比普通函数占用更多的内存。
解决:闭包不在使用时,要及时释放。
将引用内层函数对象的变量赋值为null。
- 去除字符串首尾空格
1.正则
function str(arr){
if (arr && typeof arr === “string”){
return arr.replace(/(^\s+)|(\s+)$/g,"")
}
}
let trim=str(" hkjfgh jfh ")
console.log(trim);
2.trim
let arr=" jkhjgjhg jhdgjhd "
let str=arr.trim() //首尾