前端面试遇到的问题

最近一场面试,发现了自己很多的问题,为此做个总结。非常感谢此次的面试。嘿嘿!

一、闭包中的问题

下列代码存在几个变量没有被回收?

var i = 0;
var i = 1;
var add = function () {
    var i = 3;
    return function () {
        i++;
        console.log(i);
    }
}();
add();

答案是3个。第一个:全局变量i;第二个:函数变量add;第三个:局部变量i;

首先先分析前两行代码

var i = 0;
var i = 1;

这两行代码,先用var声明一个变量i然后赋值,接着再次使用var声明同一个变量顺带赋值。毕竟var是可以重新声明同一个变量的。
在这里有个知识点需要了解。全局变量只有在页面关闭的时候才会销毁。
所以以上两行代码运行后,只有一个变量没有被销毁。

接下来看一下这个

function test() {
    var i = 5;
    console.log(i);
}
test();

分析:首先定义了一个函数test,里面有个变量x,赋值3,然后打印。很简单。接着运行这个函数,便是函数式编程思想的体现。
这里的知识点是:函数里面的局部变量,当函数运行后,里面的变量会被销毁。

接下来再看看这个

var test = function() {
    var x = 3;
    return function () {
        x++;
        console.log(x);
    }
}();
test();//4
test();//5

分析:在这里使用了闭包。结合这篇彻底搞懂JavaScript的闭包、防抖跟节流,应该便能够彻底理解传说中的闭包了。
这里的知识点就是:使用闭包后,函数里面的局部变量在函数运行后,不会被销毁。暂时存放在全局变量中。
所以以上的变量x在test运行后不会被销毁。

再看看这个

var test = function() {
    var x = 3;
    return function () {
        x++;
        console.log(x);
    }
}
test()();//4
test()();//4

这个要跟上个区分一下,这里虽然使用了闭包,但并没有暂存到全局变量里,所以没有发挥出闭包的作用。

二、如何检测一个数组

1、最简单,ES5提供了一个方法。

var a = [];
console.log(Array.isArray(a));//true

2、instanceof

var a = [];
console.log(a instanceof Array);//true

只不过这里有个弊端:必须要在同一个全局执行环境,因此ES5新增了Array.isArray()方法。
3、Object.prototype.toString.call()方法

var a = [];
console.log(Object.prototype.toString.call(a));//[object Array]

拓展一下:
JavaScript中的基本数据类型:Number,String,Boolean,Undefined,Null,Object(数组,日期等),Symbol。

var a = 123;
var b = "123";
var c = false;
var d = undefined;
var e = null;
var f = [];
var g = Symbol();
function h() { };
var j;

console.log(typeof a);//"number"
console.log(typeof b);//"string"
console.log(typeof c);//"boolean"
console.log(typeof d);//"undefined"
console.log(typeof e);//"object"
console.log(typeof f);//"object"  使用typeof检测数组是有问题的
console.log(typeof g);//"symbol"
console.log(typeof h);//"function"
console.log(typeof j);//"undefined"

三、CSS中的BFC规范

BFC全称:block formmating context,直译为”块级格式化上下文”。我还是第一次听到这个。
既然不知道,那只好自己去搜索一下喽。
BFC规范:

详情就不多说了,请看博客:CSS-BFC的概念及其作用

四、图片底部留白的问题

这个,我还是第一次注意到这个问题。

先看到底是什么问题?

<img src="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1730713693,2130926401&fm=26&gp=0.jpg" />图片配置的文字

就这么一行代码

仔细看看,的确有这么个问题:
图片的底部跟文字的底部不在一起。

查看一下元素,发现图片并没有设置相应的margin或者padding。
这是为啥?
查了一下,才发现图片默认的是display:inline;
图片是行内元素。行内元素有个vertical-align属性,这个属性默认值是:baseline,将其设置为bottom即可。

四、eval函数

eval(1+1);//2
eval("1+1");//2
eval("eval("console.log(45)");//45

eval函数可以执行里面的代码。

总结

面试完后,发现自己还挺享受面试的过程的,竟然还挺陶醉的。收获颇多

面试官随和一点,就像聊家常一样(不然很受拘束,会难受的

),以问答形式即可,达到那种一针见血的效果。简单、直接、粗暴。

(0)

相关推荐

  • js原型原型链

    一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object .Function 是 JS 自带的函数对象. o1 o2 o3 为普通对象, ...

  • 前端js中var的执行上下文

    //变量提升:var声明的变量(除函数内),值提升变量的声明. // console.log(i); // var i=0; // console.log(i); //函数提升:字面量声明的函数,提升 ...

  • 函数的两种创建自定义方式

    函数的两种创建自定义方式

  • 前端面试题之JavaScript

    ES6语法有哪些,分别怎么用 参考链接:http://es6.ruanyifeng.com/ new的执行过程 创建一个空对象: 将构造函数的 prototype 属性赋值给新对象的 __proto_ ...

  • 前端面试每日 3+1 —— 第645天

    今天的知识点(2021.01.20)-- 第645天 [html]本地存储和cookie之间的区别是什么? [css]在Less中有哪些不同类型的函数? [js]写一个JS方法,判断元素是否在可视区域 ...

  • 前端面试每日 3+1 —— 第509天

    今天的知识点(2020.09.06)-- 第509天 [html]如何优化大数据列表(10万+)的性能?说说你的方案 [css]flex:1与flex:auto有什么区别? [js]SeaJS和Req ...

  • 前端面试每日 3+1 —— 第481天

    今天的知识点(2020.08.09)-- 第481天 [html]button标签的type默认值是什么呢? [css]position的relative和absolute分别是相对谁进行定位的? [ ...

  • 前端面试每日 3+1 —— 第457天

    今天的知识点(2020.07.16)-- 第457天 [html]写一个鼠标跟随的特效 [css]page-break-before和page-break-after属性有什么应用场景? [js]js ...

  • 前端面试每日 3+1 —— 第454天

    今天的知识点(2020.07.13)-- 第454天 [html]p标签里面嵌套img标签会出现向上高3像素是什么原因?如何处理? [css]请说说css的三大特性是什么? [js]客户端与服务端时间 ...

  • 前端面试每日 3+1 —— 第453天

    今天的知识点(2020.07.12)-- 第453天 [html]表单可以跨域吗? [css]css子元素会继承父元素的font-size吗?请解释下面父子元素各字体的大小[代码] [js]给你一个页 ...

  • 前端面试每日 3+1 —— 第452天

    今天的知识点(2020.07.11)-- 第452天 [html]对于rtl网站的适配有哪些方案? [css]你有用到以pt为单位过吗?pt单位有什么应用场景呢? [js]如何使用js实现撤消和重做并 ...

  • 前端面试每日 3+1 —— 第451天

    今天的知识点(2020.07.10)-- 第451天 [html]404页面有什么作用? [css]如何设置字体的左右间距? [js]你用什么过Navigator.sendBeacon()吗?说说它有 ...

  • 前端面试每日 3+1 —— 第439天

    今天的知识点(2020.06.28)-- 第439天 [html]实现一个页面锁屏的功能 [css]举例说明BFC会与float元素相互覆盖吗?为什么? [js]举例说明js立即执行函数的写法有哪些? ...

  • 前端面试每日 3+1 —— 第434天

    今天的知识点(2020.06.23)-- 第434天 [html]跨标签页的通讯方式有哪些 [css]实现一个下拉不到底的橡皮筋效果 [js]异步请求重试策略有哪些呢? [软技能]LF和CRLF的区别 ...