Подтвердить что ты не робот

Как я могу нарушить закон непротиворечия в Javascript?

Закон о несогласии диктует, что два противоречивых утверждения не могут одновременно быть истинными одновременно. Это означает, что выражения

(a && !a)
(a == !a)
(a === !a)

всегда следует оценивать значение ложности, а

(a || !a)

всегда должна оцениваться по правде.

К счастью, Javascript - забавный язык, который позволяет вам делать всевозможные больные вещи. Бьюсь об заклад, кому-то удача, что можно убедить Javascript нарушить закон непротиворечия или, по крайней мере, убедить его в том, что он нарушает закон непротиворечия. Теперь я пытаюсь сделать все четыре из приведенных выше примеров кода неожиданным результатом.

Что было бы хорошим способом сделать это?

4b9b3361

Ответ 1

Лучшее, что я могу сделать, это:

[] == ![] // true

или

var a = []; 
a == !a

Конечно, это действительно делает [] == false // true и !![] == ![] // false. Это действительно просто техничность.

EDIT: Это действительно шутка, но работает:

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

Ответ 2

Это сделает трюк:

var a = '0';
a == !a

(оценивается как true)

В этом случае a == false и !a == false.

Ответ 3

а = 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