Минимизирането на Javascript защо е false заменено с !1 и true с !0

Пиша приложение, използвайки Enyo2, което идва с инструмент за минимизиране, базиран на UglifyJS. Забелязах, че:

var t = false

се заменя с

var t=!1

По същия начин true се заменя с !0. Сигурен съм, че има добро обяснение за това, но не мога да го намеря. Някаква идея?


person Arek S    schedule 13.12.2013    source източник


Отговори (4)


Явно има такъв. Ако използвате 1 или 0 за превод на true или false, то ще бъде по-кратко, но ще се разглежда като цели числа. Ако добавите! отпред и обратното им, то ще бъде обединено в булеви стойности и пак ще бъде кратко.

person Pierre    schedule 13.12.2013

Това е най-малкият недвусмислен начин за изразяване на стойността.

true използва 4 знака в проводника, а false използва 5 знака. !1 и !0 използват 2 знака.

person Jason    schedule 13.12.2013
comment
Така че защо просто не използвате 1 като вярно и 0 като невярно? - person Arek S; 13.12.2013
comment
Тъй като 1 и 0 също могат да бъдат числови стойности. Затова добавих недвусмислено - person Jason; 13.12.2013
comment
@ArekS 1 и 0 не са булеви; те са числа. Сравненията потенциално могат да бъдат объркани - person Ian; 13.12.2013
comment
@Jason би било хубаво, ако добавите този коментар към отговора ;-) - person Salvatorelab; 17.12.2013
comment
защо просто не използваме const T = !0, F= !1 по време на минимизиране и използваме T и F навсякъде вместо !0 и !1. това ще спести още повече място. - person sanjeev; 26.09.2018

В JavaScript 0 е falsy стойност. Това означава, че 0 се равнява на false, когато е представено като булев тип. 1 от друга страна; или всяко друго положително число по този въпрос, не е фалшива стойност и ще се равнява на true.

Тук можем просто да зададем:

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

Проблемът с това е, че тези стойности са цели числа (числа), а не булеви стойности (true или false). Използвайки стриктна проверка за равенство (===), ще намерим:

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

Операторът ! изпълнява логическа операция НЕ върху стойността и може да се използва като бърз начин за преобразуване на всяка стойност в булева:

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

От гледна точка на производителността, няма няма голяма разлика между if (!t) и if (t == true), но в минимизирането условия, това намалява нашия JavaScript със 7 байта, което позволява да бъде изтеглен дори малко по-бързо.

person James Donnelly    schedule 13.12.2013
comment
хубав отговор. но какво да кажем за изпълненията? по-ефективно ли е да напишете !0 или false? - person Cyril; 04.11.2016

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

Изпълних това в инструментите за разработчици на Chrome:

> !1
false
> !0
true

Следователно !1 е взаимозаменяемо с false, а !0 е взаимозаменяемо с true. Сега, когато знаем, че е безопасно да го променим, следващият въпрос е защо. Е, защото има по-малко байтове. Целта на минимизирането е кодът да бъде по-малък, но съвместим.

Накратко, това е безопасен начин за компресиране на литералите true и false, така че да заемат по-малко място при предаване по жицата.

person Brandon    schedule 13.12.2013