来看看这这个基础面试题? 会么?能具体解释下么?

63 阅读2分钟

最近招聘面试,问了两个小问题,能回答清楚的

。。。。。。 当然不清楚这个,也没 多大 影响。 解释下,看看你看完了之后能否回答清楚。

第一题:

//打印结果?为什么(怎么转换的)?
console.log([] == ![]);
console.log({} == !{});

具体解释:

1.运算符说明
  • '==' : 转换 比较
  • '===': 比较 转换
2.转换规则
  1. 如果其中一个操作数是布尔值,则在比较前先将其转为数值(false:0, true: 1)
  2. 如果其中一个操作数是字符串,另一个操作数是数值,比较前先将字符串转为数字。
  3. 如果其中一个操作数是对象,另一个不是,这会调用对象的valueOf toString, 得到的基本类型后再按照前面两条规则比较。

valueOf 方法用于返回指定对象的原始值,没有原始值,则返回对象本身。

3.具体如何转换的
  • [] == ![]
  1. 首先,因为 ! 操作符,满足其中一个是布尔值, ![] => false => 0.

  2. 左侧 [] 为数组对象,按照上面第三条,数组的valueOf()返回本身,在调用 toString() => ''(空字符串)。这时就变成了 '' == 0 => 0 == 0

    最终转换过程: [] == ![] => [] == 0 => '' == 0 => 0 == 0 => true

  • {} == !{}
  1. 同理,空对象 toString() 后 返回 [object, Object] ,在通过第二条规则,得到 NaN。

    最终转换过程: {} == !{} => {} == 0 => NaN == 0 => false

第二题:

说明字符串截取的方法,以及它们的区别。(主要想知道参数为负数的情况,方法是怎么处理的)

解答:

三种方法:

  • slice(start, [end]) , 参数为负数时,从字符串尾部开始算,-1指最后一个字符。如果start在end后,返回空字符串, start默认为 0
  • substring(start, [stop]), 参数为非负整数,如果是负数,会变成 0, 如果 start 比 end 大,会交换位置。返回 start 到 stop-1 之间的字符。
  • substr(start, [length]), 参数为负,变成 0