面试官:为什么“false == []”和“false == ![]”都返回true?

​​

点击上方 前端Q,关注公众号

回复加群,加入前端Q技术交流群

英文 | https://javascript.plainenglish.io/interviewer-why-do-false-and-false-both-return-true-6e7944220337

JavaScript 是一种非常优秀的编程语言,但与此同时,它也常常让我感到困惑。

可能我还不够了解!有时我真的想不通它是如何工作的,看完这5个奇怪的问题,你就知道我为啥这么说了,你知道这些古怪问题的正确答案吗?

我们现在开始吧。

1、为什么“false == []”和“false == ![]”都返回true?

朋友们,请不要惊讶这确实是正确答案。

只要我们有了相等比较和相同的知识,我们就能完全理解它是怎么一回事了。

console.log(false == []) // true
console.log(false == ![]) // true

让我简要解释一下它是如何工作的。

当我们遇到一个布尔值和一个对象进行比较时,会将这两个值转换为数字进行最后的比较。

所以它会经历这些步骤。

// 1. Convert false to a number to get 0
// 2. Convert [] to a number to get 0
// 3. "0 == 0" Returns true
console.log(false == []) // true
// 1. The result of executing "![]" is false
// 2. false == false Returns true
console.log(false == ![]) // true

2. 为什么“[] == ![]”返回true?

“1 == !1”的结果是什么?'fatfish' == !'fatfish' 返回什么?

为什么空数组如此特别?

// 1. The result of executing "![]" is false
// 2. Next, compare "[] == false"
// 3. Convert [] to a number to get 0
// 4. Convert false to a number to get 0
// 5. "0 == 0" Returns true


console.log([] == ![])

朋友们,请用“===”代替“==”,这样会让你的工作轻松很多,否则你可能会做噩梦。

3.关于奇怪的“try catch”

请想一想,getName执行返回的是你的好朋友fatfish,还是我们的好朋友medium?

const getName = () => {
  try {
    return 'fatfish'
  } finally {
    return 'medium'
  }
}
getName() // ?

我想你猜对了,答案是“fatfish”。不,不是!答案是“medium”。

这是因为在“try….catch….finally”语句中,finally子句无论是否抛出异常都会被执行。另外,如果抛出异常,即使没有catch子句处理异常,finally子句中的语句也会被执行。

4.关于箭头功能?

是的,问题很简单,你会看到fatfish被打印出来了。

const fn = () => 'fatfish'
console.log(fn()) // fatfish

但我想请你尝试回答这段代码会输出什么?

const fn = () => {}


console.log(fn()) // ?

请问‘{}’是最终结果吗?

不幸的是,这不是我们想象的那样。未定义的是最后的赢家。

因为‘{}’是fn函数的一个包含块,所以它等价于下面的代码。

const fn = () = {
}


console.log(fn()) // understand

5. 为什么 JSON.stringify('fatfish') ! ==‘fatfish’?

name1 会等于 name2 吗?

const name1 = JSON.stringify('fatfish')
const name2 = 'fatfish'


console.log(name1 === name2) // ?

我真的很困惑,为什么name1不等于name2?

const name1 = JSON.stringify('fatfish') // => '"fatfish"'
const name2 = 'fatfish'


console.log(name1 === name2) // '"fatfish"' === 'fatfish'  => false

请小心使用 JSON.stringify 与字符串进行比较,它会让您陷入困境。

最后

谢谢您的阅读,并期待您的关注,您将会阅读到更多我们推送的优质文章内容。

e7a2073ade8b25262227554bb4b6680d.png

往期推荐

前端文件下载的正确打开方式

7a6369d6823a978d9a1d680aa8e60039.png

从理解路由到实现一套Router(路由)

62345d8da92f17d74f14a8762485609c.png

送书!狼书三卷终大成,狼叔亲传Node神功

dae38f96732bde9b879839d87c542dab.png


最后

  • 欢迎加我微信,拉你进技术群,长期交流学习...

  • 欢迎关注「前端Q」,认真学前端,做个专业的技术人...

​​

764160e0ac3a50feb36e17cf9332ecc9.jpeg

2da018a01878409dc98b7b42a9315f53.png

点个在看支持我吧

c4abd19b6b9cc66e93726c2bd063497d.gif

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值