阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

76次阅读
没有评论

共计 1823 个字符,预计需要花费 5 分钟才能阅读完成。

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

JavaScript 是一种非常优秀的编程语言,但与此同时,它也常常让我感到困惑。为什么“false == []”和“false == ![]”都返回 true?可能我还不够了解!有时我真的想不通它是如何工作的,看完这 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 与字符串进行比较,它会让您陷入困境。

最后

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

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计1823字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中