【问题标题】:trouble with truthy/falsey真/假的麻烦
【发布时间】:2021-05-21 00:09:03
【问题描述】:

简要介绍一下,我是一个学习 JS 的菜鸟,感觉进展顺利,但是我现在正在做一个简单的练习,但我对某件事感到很困惑。

我了解到: 假值是在布尔上下文中遇到时被认为是假的值 例如:false、0、-0、0n、""、null、未定义、NaN(不是数字) truthy 是除 falsey 之外的所有内容(例如字符串、布尔值 true、非 0 的任何数字等)

所以在下面的示例中,如果有人可以帮助我理解为什么 value => value == true,那么当我的数组中有一个字符串值(“Angela”)时,会打印出 false(就像这种情况一样)。谢谢!

let values = [11, NaN, [], "Angela"]

function checkForFalsey() {
  if (values.some(value => value == true)) {
    console.log("At least one item is falsey")
  }
}
checkForFalsey()

【问题讨论】:

  • some 将在条件为真时立即返回。它不会达到Angeladeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 另请注意,即使使用草率相等 (==/!=),并非所有虚假值都被视为等于 false
  • 您问“在下面的示例中,如果有人可以帮助我理解为什么 value => value == true 会打印出 false”,但您的示例显示 value => value == false。那么......你的问题是什么?
  • 很有趣,但是既然我在数组中的第一个值是一个整数,为什么我仍然会得到一个假值?
  • 您的代码中没有任何内容“打印出错误”。请提供能准确重现您感到困惑的结果的代码。

标签: javascript truthy


【解决方案1】:

一个字符串既不是真的也不是假的。发生的事情称为类型强制。由于 string 和 Boolean 不是同一种类型,JavaScript 会强制其中一种类型匹配另一种类型,然后检查相等性(高级解释)。详细解释见这里:https://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/

因此,当您执行"abc" == true 时,JavaScript 会将这两个值强制转换为数字类型。字符串不是数字,所以toNumber("abc") 返回NaN。它还将true 强制转换为一个数字,在这种情况下返回1(如您所述,1 为真,0 为假)。

对于它的价值,NaN 也不是真假。将其与 true 或 false 进行比较总是会导致 false

【讨论】:

  • 添加细节:NaN 不等于 anthing,甚至本身也不等于:NaN==NaNNaN===NaN 都是 false。
【解决方案2】:

编辑:

由于 sn-p,这个问题有点令人困惑,我知道您正在尝试寻找虚假值。

原因:

value => value == true

会打印出 false 这是因为数组中没有一个元素等于 true

您对什么是虚假值是正确的,但这并不意味着真实值是 ==true

您可以在这里阅读更多相关信息:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness

检查真实值的一种方法是:

(values.some(value => value != false)) 

(values.some(value => !!value === true)) 

旧答案:

因为您使用的方法测试数组中至少有一个元素与条件匹配。

您可以阅读更多here

如果要检查数组的所有元素是否都符合条件,那么可以使用.every()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every

let values = [11, NaN, [], ""]

function checkForFalsey() {
  if (values.every(value => value == false)) {
    console.log("All values are falsey");
  } else {
    console.log("NOT all values are falsey");
  }
}
checkForFalsey()

【讨论】:

  • 原始问题有点令人困惑,但这不是我理解的正确答案。如果 OP 使用value == true 作为some(...) 条件,结果仍然是错误的,他们想知道原因。
  • 谢谢!由于sn-p,我误解了这个问题。所以我更新了答案。
猜你喜欢
  • 2016-07-16
  • 1970-01-01
  • 2014-05-23
  • 2012-02-03
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多