【问题标题】:Array.every returns false instead of type errorArray.every 返回 false 而不是类型错误
【发布时间】:2015-04-03 14:31:12
【问题描述】:

在练习各种 JavaScript 代码 katas 时,我遇到了这个问题:

用下面的签名写一个函数 isIntArray

function isIntArray(arr) {
    return true;
}
  • 如果数组中的每个元素都是整数,则返回 true
  • 如果数组为空则返回真。
  • 每隔一个输入返回 false。

我已经为此制定了自己的解决方案,但接受的解决方案之一如下:

function isIntArray(arr) {
  return Array.isArray(arr) && arr.every(function (x) { return Math.floor(x)=== x });
}

现在我明白了 Math.floor 部分在确定 x 是否为小数时是如何工作的,但我不明白的是它在遇到以下情况时如何不会倒下:

var arr = [1,2,"asd",NaN,5];

我尝试阅读有关 Math.floor 和 Array.prototype.every 的一些指南,但我找不到任何可以解释这一点的东西。当然,如果 x 是一个字符串,那么 Math.floor(x) === x 应该返回一个 TypeError 吗?

【问题讨论】:

  • 你是不是刚刚尝试Math.floor("asd")并看到你得到NaN作为返回值,而NaN === "asd"仍然是假的。
  • JavaScript === 运算符永远不会给您任何类型的“类型错误”。
  • 我试过 Math.floor("asd") 并得到 undefined is not a function in the console
  • 好的,很好,但这不是=== 运算符抛出错误的示例。 (另外,Math.floor("asd") 在我的浏览器中运行良好。)
  • 该错误是您将“floor”拼写为“Floor”的结果。

标签: javascript arrays ecmascript-5


【解决方案1】:

当然,如果x 是一个字符串,那么Math.floor(x) === x 应该返回一个TypeError

不。如果其中一个操作数无法转换为数字然后对其进行操作,则大多数数学函数和运算都会返回 NaN

所以,它变成Math.floor("asd") === "asd"本质上是

NaN === "asd" // which is obviously false

【讨论】:

  • 啊,我明白了,这是我听到人们在讨论 JavaScript 时经常谈论的怪癖之一吗?
  • @jbailie1991 绝对不是。 NaN 是“Not A Number”的首字母缩写,所以它是有道理的。 javascript 中还有很多其他的怪癖,但实际上它就是这样设计的。
  • 对,我现在明白这个过程了。还清楚了它如何评估数组中的 NaN,谢谢
  • @jbailie1991 干得好!也很高兴能帮助你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 2021-06-04
  • 2023-03-20
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多