如何打破 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研发加速

打破摩尔定律:谷歌与腾讯的下一代计算平台选择是?

清华团队率先抵达摩尔定律最后节点,0.34nm栅长晶体管研究登Nature,打破斯坦福纪录...

如何打破 Java 中的嵌套循环?