Как я могу нарушить закон непротиворечия в Javascript?
Закон о несогласии диктует, что два противоречивых утверждения не могут одновременно быть истинными одновременно. Это означает, что выражения
(a && !a)
(a == !a)
(a === !a)
всегда следует оценивать значение ложности, а
(a || !a)
всегда должна оцениваться по правде.
К счастью, Javascript - забавный язык, который позволяет вам делать всевозможные больные вещи. Бьюсь об заклад, кому-то удача, что можно убедить Javascript нарушить закон непротиворечия или, по крайней мере, убедить его в том, что он нарушает закон непротиворечия. Теперь я пытаюсь сделать все четыре из приведенных выше примеров кода неожиданным результатом.
Что было бы хорошим способом сделать это?
Ответы
Ответ 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