如何打破 Javascript 中的不矛盾定律?
Posted
技术标签:
【中文标题】如何打破 Javascript 中的不矛盾定律?【英文标题】:How can I break the law of non-contradiction in Javascript? 【发布时间】:2011-10-26 13:39:51 【问题描述】:law of non-contradiction 规定两个相互矛盾的陈述不能同时为真。这意味着表达式
(a && !a)
(a == !a)
(a === !a)
应该总是评估为假值,并且
(a || !a)
应始终评估为真实值。
幸运的是,javascript 是一种有趣的语言,allows you to doall sorts ofsick things。我向某人打赌,有可能说服 Javascript 违反不矛盾定律,或者至少令人信服地让它看起来违反了不矛盾定律。现在我正在尝试让上述所有四个代码示例都给出意想不到的结果。
什么是解决这个问题的好方法?
【问题讨论】:
@djhaskin 这听起来像是一个只喜欢实用程序的程序员会问的问题。 您可以在 C++ 中定义一个类并重载 && 以始终返回 true。没有? @Patrick,是的,在 C 中,但 Javascript 没有运算符重载。 哦,你的意思是 JavaScript。明白了。 这是一个有趣的三值逻辑练习:(!(((0/0) && !(0/0)) == false) && !(((0/0) && !(0/0)) == true)) === true
。换句话说,(0/0) && !(0/0)
是一个 a
st !(a==false) && !(a==true)
。与===
一样有效。不会像你问的那样破坏逻辑,但仍然......
【参考方案1】:
我能做的最好的就是:
[] == ![] // true
或
var a = [];
a == !a
当然,这确实是在做[] == false // true
和!![] == ![] // false
。这真的只是一个技术问题。
编辑:这真是个笑话,但确实有效:
var a = false; var b = function() return a = !a ;
console.log(!!(b() && !b())); // true
console.log(b() == !b()); // true
console.log(b() === !b()); // true
console.log(b() || !b()); // true
【讨论】:
所以[] == false
但!![] == true
。感谢分享。
只要您使用“==”,JavaScript 就会尝试将值转换为相同的类型。所以在你的例子中![] 将被转换为 false,然后 JavaScript 将空数组转换为 '',这是 JavaScript 中的虚假值。【参考方案2】:
这个可以解决问题:
var a = '0';
a == !a
(计算为true
)
在这种情况下,a == false
和 !a == false
。
【讨论】:
不,它没有。您不将 a 与 a 进行比较,而是将 a 与 !a 进行比较。在 JavaScript 中,!a 将转换为 false,因为它是 String,因此它是一个 true 值,您可以使用 ! 将其转换为 flase。然后将 false 与“0”进行比较。这将通过首先将其转换为一个数字 0 来转换为 false,这在 JavaScript 中是一个虚假值。所以最后你比较 false 和 false 而不是 '0' 到它自己。 @eskimoblood 通过您描述的过程,javascript引擎将使用==
(相等)运算符比较a
和!a
,发现两者不相等。动态类型转换是原因,像这样的 javascript 表达式似乎违反了简单的逻辑,我认为这就是 @Peter 正在寻找的示例。
据我了解,只有当“==”会比较两个对象本身而不是转换后的类型时,它才会中断。【参考方案3】:
a=NaN;
var a=NaN,
A=[(a && !a), (a == !a),(a === !a),(a || !a)];
alert(A)
/* returned value: (Array)
NaN,false,false,true
*/
【讨论】:
这些都是预期值。【参考方案4】:我还没有找到任何可以破坏 &&
和 ===
的东西,但这是 ==
和 ||
的一个:
Object.prototype.toString = function()
return false;
;
a = ;
b = (a || !a);
alert(a || !a); //alerts false
alert(b == !b); //alerts true
【讨论】:
这并没有真正破坏||
。 a || !a
的结果是
,它仍然是一个真值。此外,您正在添加一个将真值等同于假值的公理。产生的不一致是你创建的,而不是 JS 中存在的。
@outis 是的,是的,我知道。实际上打破不矛盾定律当然是不可能的,所以你必须要有创意,让它看起来像它。以上是关于如何打破 Javascript 中的不矛盾定律?的主要内容,如果未能解决你的问题,请参考以下文章
开源“摩尔定律”即将打破,《2022开源大数据热力报告》重磅发布
开源“摩尔定律”即将打破,《2022开源大数据热力报告》重磅发布
打破“双十定律”,华为云AI推动超级抗菌药Drug X研发加速