为什么“false == []”和“false == ![]”都返回true?
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 与字符串进行比较,它会让您陷入困境。
相关推荐HOT
9个JSON.stringify的秘密大多数开发人员却不知道
stringify() 可以返回 undefined。Date实例通过返回字符串实现toJSON()函数(同date.因此,它们被视为字符串。所有其他对象实例(包括 Map、Set、...详情>>
2023-01-31 17:45:00为什么“false == []”和“false == ![]”都返回true?
JavaScript 是一种非常优秀的编程语言,但与此同时,它也常常让我感到困惑。 可能我还不够了解!有时我真的想不通它是如何工作的,看完这5个奇...详情>>
2022-12-29 11:25:00零基础教你学前端——初识图片标签
今天继续学:图片——网页中重要的一员。一个成熟的网站,除了有文本内容,还会有大量的图片展示,好让我们的网站变得丰富多彩。例如千锋教育官...详情>>
2022-11-07 11:17:50零基础教你学前端——标题和段落标签
这节课学习页面中的标题和段落标签。为了丰富页面中的内容,需要用到各种各样不同的标签这里面出现了三个不同的标题类型,他们的大小和加粗情况...详情>>
2022-11-07 11:07:00热门推荐
js获取class属性的值
沸什么是事件委托?javascript事件委托的实现原理
热css绝对定位和相对定位
热9个JSON.stringify的秘密大多数开发人员却不知道
新TypeScript中必须知道的6个泛型方法
如何在JavaScript中将十进制转换为十六进制
如何在JavaScript中将数字四舍五入到小数点后两位
为什么“false == []”和“false == ![]”都返回true?
说说Vuex原理
vuex怎么拿数据
零基础教你学前端——超链接之页面跳转
零基础教你学前端——图片标签拓展
零基础教你学前端——图片标签进阶
零基础教你学前端——初识图片标签