为什么 JavaScript 没有严格的大于/小于比较运算符
Why doesn't JavaScript have strict greater/less than comparison operators?
虽然JavaScript的类型严格比较运算符(===
,!==
)很好,但它没有相应的大于/小于的严格比较。
var x = 10;
x <= 20; // true
x <= '20'; // true
x <== 20; // true (or would be, if JS had such an operator)
x <== '20'; // false (ditto)
为什么不呢? 我问这个问题完全期望答案是"呃,因为它没有",但我还是在问,以防有一个有趣和/或令人沮丧的历史原因被省略这样的运算符。
我只能猜测-
如果
a === b
是假的,那么
a !== b
是真的。总是。
但是,这种暗示不会持续<==
如果
x <== 20
是假的,我们不能推断结果 x >== 20
因为它可能是由于类型检查或关系检查而为假的。
我认为这有点令人困惑,尽管语言中有很多东西要糟糕得多(一般的类型胁迫,仅举一例)。
但是,我认为严格的<
或>
会始终如一地表现。
由于 a === b
是 typeof a == typeof b && a == b
的简写,因此您可以将此扩展用于不等式:例如typeof a == typeof b && a <= b
。
我不确定你的问题有答案。我的猜测是,预期用途是将数字与字符串(也许还有布尔值)进行比较。它实际上适用于这些情况,就像非严格相等运算符一样。无论如何,其他任何东西都受任意类型强制规则的约束。[] < {}
的"正确"输出是什么? false
?也许undefined
?请注意,类型甚至不需要不同,({foo: 1}) < {bar : 2}
也没有任何意义。
在我看来,他们(Brendan Eich,以及后来的 ECMAScript 委员会)只是决定相信开发人员只会比较有意义的东西。或者甚至没有考虑到开发人员会尝试疯狂的比较。创建额外的运算符进行比较只会使语言混乱。不要忘记,在处理类型强制时,比较并不是唯一的陷阱,还有加法、减法等。所以我想他们只是决定忠于他们允许不同类型之间操作的决定。他们认为当人们知道自己在做什么时,这会有所帮助,但也许没有预料到由此产生的所有混乱。
为了说明为什么拥有它没有意义,请考虑...
var x = 10
var less = (x <= 5)
现在,两者都
x <== 5
和
x <== '5'
将是错误的,但出于不同的原因。首先,您可以使用 x> 5 的假设,但在后一种情况下则不然。为了避免错误的假设,最好先使用 === 或 !==,然后再进行比较。
我想说的是,问题在于可以为不同类型的(不是相同的类型,然后不是等于)很好地定义严格相等,但关系运算符不能为不同的类型很好地定义。
假设我们定义了一个严格的比较器a <== b
typeof a == typeof b && a <= b
。a >== b
也是如此.然后我们比较 a = "3" 和 b = 3,结果a <== b
为假,a >== b
假和a === b
假。恭喜,你刚刚创造了一个悖论!
这种严格的比较器仍然会搞砸排序算法或比较意外值之类的事情。例如:
for (var i; i <== list.count; i++) {
doStuff(i);
}
请注意,该示例错误地使用了 list.count
而不是 list.length
,这将只返回 undefined
,与i <== undefined
相比,它只会返回 false,因此 for 循环将完全跳过,这让程序员感到惊讶。
如果 JavaScript 在 Undefined 属性的list.count
上引发错误,以及比较不同类型的错误,我会好得多。
这就是我能说的,跨类型比较应该会引发一个例外,就像任何其他体面的语言一样。但事实并非如此。
这意味着,实际可行的解决方案是开始使用预处理器,或者只是说"哦,好吧"并继续键入JavaScript ¯'_(ツ)_/¯
- Javascript平等三重等于,但是大于和小于呢?
- RegEx接受小于-50.0或大于80.0的数字
- 在选择更改时显示大于/小于的隐藏字段集
- 为什么对象大于/小于或等于不同的对象
- 大于或小于gujarati数的检查
- Javascript 大于或小于
- ASP.NET 如果文本在“大于”和“小于”符号之间给出,则无法保存文本框
- 值大于(小于)变量的 jQuery 过滤器选项
- 大于 0 且小于或等于 100 的百分比的正则表达式
- 如何在 javascript 中对自定义对象执行小于/大于比较
- 当输入类型文本小于 0 或大于 24 时,如何禁用输入类型按钮
- TaffyDB,过滤同一字段 2 次(大于和小于小于)
- 使用“”对字符串进行排序;小于/大于“;比较器中的比较运算符
- 如何使用angularjs检查所选日期和时间是否小于当前日期或大于当前日期和时间
- Jquery或Javascript:如何查找图像大于500px且小于2000px的所有html元素
- Regex检测到大于“>"并且小于“0”<"在字符串中
- Javascript -大于/小于4位数字,可以从0开始
- 大于/小于运算符在Q承诺上的行为与等于运算符不同
- Switch大于/小于语句
- 为什么 JavaScript 没有严格的大于/小于比较运算符