Why does Math.min([]) evaluate to 0?
为什么Math.min([])对0进行评价?
我预计它将对NaN进行评估,因为mdn的math.min手册页中指出,"如果至少有一个参数无法转换为数字,则返回nan。"
所以我想,这个精致的问题是为什么[]要强制为0?特别是考虑到[]是真实的(即!![] === true和Math.min(true) === 1。我想的不对?
在节点V7.0.0上测试
- 空数组可以转换为数字tho….数字是零。
- jsfiddle.net/xq3185ym
- …因为规格说明是这样说的。
- 网址:sitepoint.com/javascript-truthy-falsy
- 我认为这是因为[].toString()生成"",规范中说将""转换为数字会生成0。
- 真的。。。你说得对。这种遗留行为是为了向后兼容还是有用途?
- @JTpeterson这样的东西有什么用?JavaScript中的隐式和非递归转换是所有地狱的根源。是的,由于向后兼容性,它将永远存在。
- @怪胎:有几个规则并不是那么复杂,真的,对不起,它把你弄糊涂了。
- @实际上,能够传递可以隐式转换为数字或字符串的对象对于函数式编程算法非常有用。隐式转换是一种工具,就像螺丝刀。如果你的问题需要一个钉子,这个工具是没有帮助的,但这既不坏也不坏。由开发人员决定哪些工具适合使用。
- @ZZZZBOV语言可以让编码人员的生活更轻松。组件也是螺丝刀。但是我向你保证使用这个工具并不有趣。你需要的时候就去做。Javascript IMO也是一样的。你使用它是因为你必须这样做。你说这些转换是有用的。首先,我不知道这与函数式编程有什么关系。第二,我坚信"先显后隐"。我真的很想看到真正的代码使用这些隐式转换,并且易于维护、理解和扩展。
- @丹达维斯,我觉得你很困惑。我在哪里说过这些规则很复杂?规则"让我们把一切都抛到字符串xyz"也很简单,不具有逻辑性和无用性。
- 我以前关于这种强制的有用性的问题,现在我更彻底地理解了,并没有真正的意义。"所有对象的默认提示是字符串"真的为我拉开了帷幕"。…它在转换为数字之前转换为字符串。谢谢大家的意见。
Why does Math.min([]) evaluate to 0?
因为规格说明是这样说的:
Math.min使用……
ToNumber使用……
ToPrimitive使用…
[[Default Value]]内部方法根据提示参数将对象转换为原语。
所有对象的默认提示是字符串。这意味着数组被转换成一个字符串,对于[]是""。
然后,根据记录的算法,将""转换为0。
Math.min然后接受唯一的参数并根据其算法返回它。
- 啊…因此,为什么只有长度为0或1的数组会被强制执行,像Math.min([1,42])这样的数组会导致NaN。
这是因为[]是强制0的。
您可以通过以下调用看到:
1
| (new Number([])).valueOf(); // 0 |
因此,调用Math.min([])与调用Math.min(0)相同,后者给出0。
我认为,new Number([])将[]视为0的原因是:
Number(value)构造函数的规范使用了ToNumber函数。
ToNumber(value)函数的规范规定,对object类型(数组是)使用ToPrimitive。
数组的原值等于数组的联接,如[]变为"",[0]变为"0",[0, 1]变为"0,1"。
因此,数字构造函数将[]转换为"",然后将其解析为0。
上面的行为是一个包含一个或两个数字的数组可以传递到Math.min(...)中的原因,但是一个以上的数组不能:
- Math.min([])等于Math.min("")或Math.min(0)。
- Math.min([1])等于Math.min("1")或Math.min(1)。
- Math.min([1, 2])等于Math.min("1,2")不能转换成数字。
- 最初的问题承认了这一点:"所以我猜这个精炼的问题是为什么[]强制为0"。我想手术室想知道为什么会发生这种强迫。
- 谢谢。长度为0或1的数组将强制为数字。算了吧。下面是一个链接,在底部有一个有用的表,其中有一些比较奇怪的地方:w3schools.com/js/js_type_conversion.asp