经典面试题

1.问:使用 typeof bar === "object" 来确定 bar 是否是对象的潜在陷阱是什么?如何避免这个陷阱?



想对函数返回 true 的话

想对数组返回 false 时


2.下面的代码将输出什么到控制台,为什么?


答案:true、false


3.关于this指向的常见面试题




4.NaN 是什么?如何测试一个值是否等于 NaN ?



ES6提供了一个新的 Number.isNaN() 函数

5.JavaScript(ECMAScript)是一种弱类型语言,它可对值进行自动类型转换,以适应正在执行的操作。



解析: 1 + +"2" + "2" 输出: "32" 说明:根据运算的顺序,要执行的第一个运算是 +"2" (第一个 "2" 前面的额外 + 被视为一元运算符)


因此,JavaScript将 "2" 的类型转换为数字,然后应用一元 + (即将其视为一个正数)。其结果就是得到一个数字 2 ,接下来的运算就是 1 + 2 ,这当然是 3 


然后我们需要在一个数字和一个字符串之间进行运算(即, 3 和 "2"),同样的,JavaScript会将数值类型转换为字符串,并执行字符串的连接,产生 "32" 





6.关于逻辑运算符,下面代码运行的结果是什么?

 || 运算符。在 X||Y 的表达式中,首先计算 X 并将其解释执行为一个布尔值。


如果这个布尔值true,那么返回true(1),不再计算 ,因为“或”的条件已经满足。


如果这个布尔值为false,那么我们仍然不能知道 X||Y 是真是假,直到我们计算 ,并且也把它解释执行为一个布尔值。

 && 运算符。在 X&&Y 的表达式中,首先计算 X  并将其解释执行为一个布尔值。


如果这个布尔值为 false,那么返回 false(0),不再计算 ,因为“与”的条件已经失败。


如果这个布尔值为true,但是,我们仍然不知道 X&&是真是假,直到我们去计算 ,并且也把它解释执行为一个布尔值。 .


不过,关于 && 运算符有趣的地方在于,当一个表达式计算为“true”的时候,那么就返回表达式本身。


7.以下代码将输出什么?


JavaScript在设置对象的属性的时候,会暗中字符串化参数值

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

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

因此,设置或引用 a[c] 和设置或引用 a[b] 完全相同。

所以得到的答案是  456  。


8.关于this指向,以下代码将输出什么?

代码运行的结果是:


在执行 sayHello() 的时候,当访问到 this._name 时,此时的this已经不再是 person  对象,而是全局窗口对象,也就是 widnow 对象。


与此同时, widnow 对象并不存在 _name  属性,所以返回的是 undefined 


9.关于变量提升,以下代码将输出什么?

这段代码的执行结果是undefined 和2

10.关于事件循环,以下代码将输出什么?


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


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


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

因此,即使 setTimeout() 回调被延迟0毫秒,它仍然会被排队,并且直到函数中其他非延迟的语句被执行完了之后,才会执行。所以运行的结果是:1 4 3 2。


11.如何理解和应用JavaScript闭包?


闭包应用举例:模拟类的私有属性。



12.关于delete 操作符,以下代码将输出什么?



 delete 操作符是将 object 对象的属性删去的操作。但是这里的 x 是并不是对象的属性,  delete 操作符并不能作用,所以打印的出的结果仍然是 x 的值。

13.以下代码将输出的结果是什么?


 x 虽然是全局变量,但是它是一个 object  delete 作用在 x.foo 上,成功的将 x.foo 删去。所以返回 undefined 


14.以下代码将输出的结果是什么?


答案: x 虽然是全局变量,但是它是一个 object  delete 作用在 x.foo 上,成功的将 x.foo 删去。所以返回 undefined 

答案 :Goodbye jack

IIFE 变量提升

14.以下代码将输出的结果是什么?


[1,NaN,NaN]

首先,我们了解了数组中map的作用,map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理的后值。也就是map会把数组["1", "2", "3"]遍历一遍,并传入parseInt函数中去进行处理。

那么很多人就觉得,把数组中的"1","2","3"进行parseInt处理之后,不就是得到数字1,2,3了吗?

但我们忽略了,map给处理函数传的参数不是简单地把数组的每个元素传进去,实际上它会传3个参数(value,index,array)。分别是数组的元素,索引和整个数组。如果忽略了这一点,就很容易答错这道题。

了解了上面这点,那下面的问题是parseInt函数返回的结果是什么了?需要注意的是:在这里,parseInt(value,index,array)接收了三个参数,实际起作用的只有前2个。

实际上是parseInt('1',0)和parseInt('2',1)和parseInt('3',2);得到的结果是[1,NaN,NaN]。为什么是这个结果,因为第二个参数作为解析的数字的基数。该值介于 2 ~ 36 之间,如果参数为 0,则数字将以 10 为基础来解析。所以第一次遍历得到1,如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。

15.以下代码将输出的结果是什么?


["object",false]

16.以下代码将输出的结果是什么?

在进行if判断的时候只有以下几种情况会返回false

1."" 空的字符串

2.为0的数字

3.undefined

4.null

5.false

本身其余的情况都会都会返回true

综上所述,if语句为真,进如执行console.log(a == true)这个语句

在执行这个语句的时候由于类型不一样,所以会先转换类型首先会去调用数组的toString方法,将a转换成字符串,结果为:"0"由于"0"是字符串,所以还得转换成数字,调用Number("0") 得到的结果是 0

我们上面说了,数字0是false,所以false == true 不成立,结果为false

解析为一行代码就是:console.log(Number(a.toString()) == true)执行结果:console.log(false == true) 输出false

17.以下代码将输出的结果是什么?



18.以下代码将输出的结果是什么?


1.对于console.log(a=b);因为a和b都是数组,是object类型,object类型在进行=比较的时候,比较的对象的引用地址是否相同,很明显,a和b不是同一个对象,所以引用地址不同,故返回false;

2.对于console.log(a===b);===运算符要求两边值和数据类型都要相同,a和b的数据类型都是object/Array,但是由于上面的分析可知,a和b的值并不相同,所以也是返回false.

3.对于console.log(a>c);数组进行>或者<运算比较的时候,首先要调用valueOf()方法进行转换成基本类型的值,因为valueOf()方法返回的仍然是数组,所以要继续调用toString()方法进行转换,返回值为数组元素用逗号连接的字符串,是基本类型的值可以用于比较,所以console.log(a>c)等价于console.log(a.toString()>c.toString())等价于console.log("1,2,3">"1,2,4")相当于是两个字符串在比较大小,而字符串比较大小的时候,是字符串从左到右依次转换成ASII码进行比较,前面1,2,相同所以实际上是比较3和4的ASII码值的大小,很明显3的ASII码比4的ASII码小,所以返回false.

4.对于console.log(a<c)同3分析,故返回true.

19.以下代码将输出的结果是什么?


false、false




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值