I have always thought ngShow and ngHide act as boolean counterpart to each other. That belief, however, is shaken by the unexpected behaviour of
ngShow
ngHide
ng-if and ng-show mistreats "[]" (empty array)
See: this link
[] == true false [] != true true (![]) == true false [''] == true false (!['']) == true false "" == true false "[]" == true false (!"[]") == true false
Sounds its by design.