【问题标题】:How can I break the law of non-contradiction in Javascript?如何打破 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)。与=== 一样有效。不会像你问的那样破坏逻辑,但仍然......

标签: javascript logic


【解决方案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 是的,是的,我知道。实际上打破不矛盾定律当然是不可能的,所以你必须要有创意,让它看起来像它。
猜你喜欢
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 2017-11-06
  • 2016-02-21
相关资源
最近更新 更多