Javascript minification, почему ложь заменена на! 1 и true с! 0

Я пишу приложение, используя Enyo2, который поставляется с инструментом миниатюризации на основе UglifyJS. Я заметил, что:

var t = false

заменяется на

var t=!1

Точно так же true заменяется на! 0. Я уверен, что для этого есть хорошее объяснение, я просто не могу его найти. Любая идея?

Ответы

Ответ 1

Есть, по-видимому, один. Если вы используете 1 или 0 для перевода true или false, это будет короче, но будет рассматриваться как целые числа. Если вы добавите! спереди и наоборот, он будет объединен в булевы и все еще будет коротким.

Ответ 2

Это наименьший недвусмысленный способ выразить значение.

true использует 4 символа на проводе, а false - 5 символов. !1 и !0 используйте 2 символа.

Ответ 3

В JavaScript 0 - значение ложности. Это означает, что 0 приравнивается к false при представлении в виде булева типа. 1 с другой стороны; или любое другое положительное число в этом отношении, не является ложным значением и будет равно true.

Здесь мы могли бы просто установить:

t = 0; // false
t = 1; // true

Проблема заключается в том, что эти значения представляют собой целые числа (числа), а не логические значения (true или false). Используя строгую проверку равенства (===), мы найдем:

t = 0;
t == false; // true
t === false; // false

Оператор ! выполняет логическую операцию NOT по значению и может быть использован как быстрый способ преобразования любого значения в boolean:

t = !1;
t == false; // true
t === false; // true

Эффективность, не очень большая разница между if (!t) и if (t == true), однако в терминах минимизации это сокращает наш JavaScript на 7 байт, что позволяет чтобы быть загруженными еще немного быстрее.

Ответ 4

Отрицание преобразует небулево, но истинное значение в чисто булево.

Я запустил это в инструментах разработчика Chrome:

> !1
false
> !0
true

Следовательно, !1 является взаимозаменяемым с false, а !0 является взаимозаменяемым с true. Итак, теперь, когда мы знаем, что это безопасно изменить, возникает следующий вопрос. Ну, потому что это меньше байтов. Пункт минимизации состоит в том, чтобы сделать код меньшим, но совместимым.

Короче говоря, это безопасный способ сжать буквальные true и false, чтобы они занимали меньше места при передаче по проводу.