! оператор в JavaScript

Я сейчас в замешательстве! оператор в JavaScript. Мое понимание было! Оператор работает только на булевых. Но комментарий к одному из моихответы говорит, что может работать с чем угодно и возвращает логическое значение, что оказалось правдой после того, как я провел несколько тестов.

alert(!undefined); //true
alert(!function(){}); //false
alert(!{}); //false
alert(!null); //true
alert(!()); //crash
alert(!"false"); //false
alert(!false)​;​​​​​​​​​​​​ //true​​​​​​​​​​​​​​​​​​

Может кто-нибудь помочь мне обобщить поведение! оператор.

EDIT

Еще более запутанные вещи:

​alert( new String() == ""); //true
alert(!""); //true
alert(! new String()); //false

Как? & # X200B;

Ответы на вопрос(5)

Ваш ответ на вопрос