全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货  >  html5技术干货  >  详情

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

来源:千锋教育
发布人:wjy
2022-12-29

推荐

在线提问>>

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

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

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

  我们现在开始吧。

  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 与字符串进行比较,它会让您陷入困境。

相关文章

js获取class属性的值

什么是事件委托?javascript事件委托的实现原理

9个JSON.stringify的秘密大多数开发人员却不知道

TypeScript中必须知道的6个泛型方法

如何在JavaScript中将十进制转换为十六进制

开班信息 更多>>

课程名称
全部学科
咨询

HTML5大前端

Java分布式开发

Python数据分析

Linux运维+云计算

全栈软件测试

大数据+数据智能

智能物联网+嵌入式

网络安全

全链路UI/UE设计

Unity游戏开发

新媒体短视频直播电商

影视剪辑包装

游戏原画

    在线咨询 免费试学 教程领取