前端面试题

231 阅读2分钟

如何实现垂直水平居中

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 () {};
如果是使用的函数表达式,那么函数调用就不能在表达式之前,如果是函数声明,由于在全局执行上下文的执行创建阶段时,函数声明会提升到上面,所以是可以在函数声明之前调用函数的。

函数声明提升和变量提升

函数柯里化

购物车实现

事件委托