面试题:你真的懂js吗?

128 阅读2分钟

面试题:你真的懂js吗?

首先我们来看下题目,问最后打印的x结果是啥。

var x = 1;
if(function f(){}){
    x+= typeof f;
};
console.log(x)

代码很短,粗略一看。

这不报错吗?? 报错!!它不报错谁报错?

不是if判断那里报错就是typeof那里报错

那这就恭喜你,完美答错了

接下来我们一起分析一下这道题

关于if判断

首先我们要知道,在js中if()判断括号中的表达式只要不是false都会执行的

if语句会自动执行相应的Boolean转换将括号里里的转化为Boolean

而对应转换为false的值仅有6个:fales,""(空字符串),0,null,undefined

所以说,只要不是以上六个值,if都会进入执行

if(0){
    console.log('我来了~')
}else{
    console.log('我走了~')
}

比如运行这个示例,就会打印"我走了~",因为 0 被自动转换成了对应的 Boolean 值 (false)。

关于函数括号问题

贴一下原题:

if(function f(){})

题目中的函数是被()给给包裹起来,所以!!

这里的f其实已经消失了,变成了表达式function(){}

这样的,有人认为f都没有了,你跟着typeof f不报错吗?

当然不报错,typeof在js中永远不会报错的,如果未定义,就会返回undefined。

关于typeof的问题

经过以上结果分析,if成功进入判断,typeof返回undefined

再根据js中1与undefined相加

得到 NaN没错了,所以答案就是NaN!!!

那很遗憾,你再次答错了,

正确答案是1undefined,这是为什么呢?

我们上面说到,js中typeof不会报错,但我们也应该知道他另一个知识点

typeof虽然给我们返回的是数据类型,但他是以字符串形式返回的

所以这里发生了字符串的拼接

最终答案 1undefined