侧边栏壁纸
  • 累计撰写 225 篇文章
  • 累计创建 275 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

前端面试题(四)

DGF
DGF
2018-03-06 / 0 评论 / 0 点赞 / 14 阅读 / 0 字

这段代码的运行结果是什么?

var name = 'fulu';
(function() {
    if(typeof name === 'undefined') {
        var name = 'blog';
        console.log('welcome to' + name)
    } else {
        console.log('hi' + name)
    }
})();

这段代码的运行结果是:welcome to blog

在匿名函数内部有一个自己的变量name,并且代码的顺序是先使用,后定义复制。这里就会出现一个变量提升的问题,所以此时我们函数内部的变量是先置顶声明,未赋值,也就是相当于,在匿名函数的内部第一行增加一句代码,var name; 这个时候用typeof判断类型,得到的值为 'undefined'

以下代码输出结果是什么?

function printing() {
    console.log(1);
    setTimeout(function() {
        console.log(2);
    }, 1000);
    setTimeout(function() {
        console.log(3);
    }, 0);
    console.log(4);
}
printing();

输出结果为:1 4 3 2

想知道为什么输出顺序是这样的,我们需要弄了解 setTimeout() 做了什么,以及浏览器的事件循环原理。

浏览器有一个事件循环用于检查事件队列,处理延迟的事件。UI事件(例如点击,滚动等),Ajax回调,以及提供给 setTimeout()setInterval() 的回调都会依次被事件循环处理。

因此,当调用 setTimeout() 函数时,即使延迟的时间被设置为0,提供的回调也会被排队。回调会乖乖地待在队列中,直到指定的时间用完后,它才开始执行动作。

以下代码输出结果是什么?

var a = {},
    b = {key:'b'},   
    c = {key:'c'};
a[b] = 123;
a[c] = 456;
console.log(a[b]);

不少人可能会以为答案是 123 ,但结果是 456 ,为什么会是这样子的呢。

原因是我们忽略了一个知识点:JavaScript在设置对象的属性的时候,会暗中字符串化参数值。

在这里例子中,由于 bc 都是对象,把它们设置为对象 a 的参数,它们都将被转换为 "[object Object]"

结果就是, a[b]a[c] 都相当于 "[object Object]" ,而后者会将前者的值覆盖。

因此,设置或引用 a[c] 和设置或引用 a[b] 完全相同。所以得到的答案是 456

0

评论区