最近招聘面试,问了两个小问题,能回答清楚的
。。。。。。 当然不清楚这个,也没 多大 影响。 解释下,看看你看完了之后能否回答清楚。
第一题:
//打印结果?为什么(怎么转换的)?
console.log([] == ![]);
console.log({} == !{});
具体解释:
1.运算符说明
- '==' : 先 转换 再 比较
- '===': 仅 比较 不 转换
2.转换规则
- 如果其中一个操作数是布尔值,则在比较前先将其转为数值(false:0, true: 1)
- 如果其中一个操作数是字符串,另一个操作数是数值,比较前先将字符串转为数字。
- 如果其中一个操作数是对象,另一个不是,这会调用对象的
valueOf
toString
, 得到的基本类型后再按照前面两条规则比较。
valueOf 方法用于返回指定对象的原始值,没有原始值,则返回对象本身。
3.具体如何转换的
[] == ![]
-
首先,因为 ! 操作符,满足其中一个是布尔值,
![]
=> false => 0. -
左侧
[]
为数组对象,按照上面第三条,数组的valueOf()
返回本身,在调用toString()
=> ''(空字符串)。这时就变成了'' == 0
=>0 == 0
最终转换过程:
[] == ![]
=>[] == 0
=>'' == 0
=>0 == 0
=>true
{} == !{}
-
同理,空对象
toString()
后 返回[object, Object]
,在通过第二条规则,得到 NaN。最终转换过程:
{} == !{}
=>{} == 0
=>NaN == 0
=>false
第二题:
说明字符串截取的方法,以及它们的区别。(主要想知道参数为负数的情况,方法是怎么处理的)
解答:
三种方法:
slice(start, [end])
, 参数为负数时,从字符串尾部开始算,-1指最后一个字符。如果start在end后,返回空字符串, start默认为 0substring(start, [stop])
, 参数为非负整数,如果是负数,会变成 0, 如果 start 比 end 大,会交换位置。返回 start 到 stop-1 之间的字符。substr(start, [length])
, 参数为负,变成 0