如何实现垂直水平居中
BFC
包含块
优化问题
内存泄漏问题
清除浮动
模块化
promise相关代码
盒模型
媒体查询
js设计模式
node.js
saa/less
数组去重(set)
function unique5(arr){
var x = new Set(arr);
return [...x];
}
数组降维
二维数组降维(需要注意的是如果数组的元素还是数组则不会再展开了,也就是concat方法只能降低一维)
function flatten2d(arr) {
var result = [];
for(var i = 0; i < arr.length; i++) {
result = result.concat(arr[i]);
}
return result;
}
多维数组降维
var arr = [2, 3, [2, 2], [3, 'f', ['w', 3]], { "name": 'Tom' }];
function deepFlatten(arr) {
var res = [];
if (Array.isArray(arr)) {
arr.forEach((item) => {
res = res.concat(deepFlatten(item));
});
} else {
res = res.concat(arr);
}
return res;
}
console.log(deepFlatten(arr));// [2, 3, 2, 2, 3, "f", "w", 3, {name: "Tom"}]
new操作符具体干了什么
1.先创建了一个新的空对象
2.然后让这个空对象的__proto__指向函数的原型prototype
3.将对象作为函数的this传进去,如果return 出来东西是对象的话就直接返回 return 的内容,没有的话就返回创建的这个对象
const o = new Object();//创建了一个新的空对象o
o.__proto__ = Foo.prototype;//让这个o对象的` __proto__`指向函数的原型`prototype`
Foo.call(o);//this指向o对象
a = o;//将o对象赋给a对象
函数声明和函数表达式的区别
// 函数声明
// function fn() {}
// fn();
//1 函数声明必须有函数名
//2 函数可以在任意地方调用fn();
// 函数表达式
// 1 前后两个函数的名字可以相同也可以不相同
// 2 function 后面的这个名字是可以省略的
// 3 function 后面的这个名字只能再函数内部使用
// 4 函数调用只有在函数表达式声明后调用。
// var fn = function fn () {};
如果是使用的函数表达式,那么函数调用就不能在表达式之前,如果是函数声明,由于在全局执行上下文的执行创建阶段时,函数声明会提升到上面,所以是可以在函数声明之前调用函数的。
函数声明提升和变量提升
函数柯里化
购物车实现
事件委托