伪值是
false在布尔上下文中计算时转换为的值. https://developer.mozilla.org/en-US/docs/Glossary/Falsy
究竟以下值在Javascript是falsy: ,false,0,"",null,undefined和NaN.
现在我看到这种奇怪的行为:只有假值false,0和""彼此相等,但不等于其他假值.
另外null,undefined并不等于除了他们自己以外的任何虚假值.
最后但并非最不重要的NaN是,不等于任何虚假的价值,甚至不是自己!
然而他们所有人都false在布尔表达式中评估if (value) { ... }
这种看似不一致的行为的好处或用例是什么?
注意: "相等"是指==运算符定义的(松散)相等,而不是===运算符定义的严格相等性.
为什么JavaScript中的虚假值不相等?
因为当用作布尔值时,两个值之间的差异会强制为相同的值,并且这两个值彼此相等.
这种看似不一致的行为的好处或用例是什么?
在那里,我们进入了主要的主观领域,这对于SO来说并不是真正的主题.让我们说,JavaScript的松散平等规则长期以来一直是争论和混乱的主题.人们必须记住,他们是由布兰登·艾希(Brendan Eich)在1995年5月疯狂的10天中创造的,他创造了JavaScript,在那里有一些"clangers"并不奇怪.并且记住他的任务是为非程序员编写一个宽容,宽容的语言.因此,自动分号转换,松散的等式,等等.这是是为了让你从一抢值的语言input,并把它当作一个数字,即使value的input始终是一个字符串.这些规则是否达到了这个目标是一个意见问题(我不是在这里推进一个:-)).
大多数"怪异"都是作为规则的副产品出现的,这些规则大多看起来是合理的(再次,有几个因素).让我们考虑一下"" == 0真实的事情:
规则==是抽象相等比较算法,它表示如果第一个操作数(x)是一个字符串而第二个操作数(y)是一个数字,我们返回结果ToNumber(x) == y.撇开强制平等操作符是否是一个好主意的问题,如果你想要一个,这似乎是一种合理的方法string == number.因此,我们查看ToNumber算法,该算法表示ToNumber(string)使用ToNumber应用于字符串类型算法将字符串解释为数字,其中包括空字符串变为的其他内容0.
所以问题不在于"为什么""等于0",而是"为什么在被视为数字时""强迫价值0?" 只有Eich可以回答这个问题.:-)
主ToNumber算法中还有一些其他有趣的算法,例如undefined=> NaN但null=> 0.同样,只有艾希可以解释为什么他认为null应该等同于0而是undefined等同于NaN.
值得注意的是,他可能不会随意选择这些东西.他研究了其他几种语言并根据这些知识做出了选择.回想起来,其中一些选择对我们来说可能看起来很奇怪(隐式全局?真的吗?),但是,大多数人有超过10天的时间来创建一种语言,他们可以在这段时间内寻求同事和社区的意见.而且,还有那种"宽容"的设计标准.
我可能在那里误入了一些主观性.如果是这样的道歉; 我尽力不去.:-)
最后的注意事项:如果您发现规则是任意且难以记忆的,那么您并不孤单.处理这种情况的一种方法是确保明确地执行所有类型强制.但需要注意的是,即使你试图做到这一点,你坚持宽松的比较,因为虽然有一个全等运算符(===)和不全等运算符(!==),有没有严格的版本>,<,>=,或<=.因此,如果您错过了明确的强制,那么如果您正在执行其他任何关系,您的代码似乎仍然有用.我不是在鼓吹这一点(也不是我提倡反对它),我已经看到了由明确的类型强制和没有明确的类型强制引起的错误.只是说这是处理棘手规则的一种方法.
| 归档时间: |
|
| 查看次数: |
147 次 |
| 最近记录: |