For my understanding the unary !
operator performs implicit type conversions, and are sometimes used for type conversion.
So basically the !
operator converts its operand to a boolean and negates it.
Now:
!!x // Same as Boolean(x)
In fact:
!!'true' === Boolean('true') // true
So I am assuming both !!x
and Boolean(x)
perform the same action.
I would like to know:
- Do you know any caveats making my assumptions wrong?
- Which way should be preferred in term of good practice?
- Do you know any differences to be aware among different ECMAScript versions or Browser vendors?
For my understanding the unary !
operator performs implicit type conversions, and are sometimes used for type conversion.
So basically the !
operator converts its operand to a boolean and negates it.
Now:
!!x // Same as Boolean(x)
In fact:
!!'true' === Boolean('true') // true
So I am assuming both !!x
and Boolean(x)
perform the same action.
I would like to know:
- Do you know any caveats making my assumptions wrong?
- Which way should be preferred in term of good practice?
- Do you know any differences to be aware among different ECMAScript versions or Browser vendors?
- 1 Why do you keep referring to it as unary? Is there a binary ! operator? – BoltClock Commented Jul 1, 2015 at 7:53
- 1 @BoltClock thanks for your ment, for my understanding ! is a unary operator. I found this reference in JavaScript: The Definitive Guide, 6th Edition. – GibboK Commented Jul 1, 2015 at 7:58
-
5
IMO it doesn't matter. They are the same in this case. I would prefer double-negate operator
!!
because it is less typing. Just bang bang and you are done. But some would say thatBoolean()
casting function is more human readable. – Blago Eres Commented Jul 1, 2015 at 8:15 -
1
the same thing is true for
!!'false' === true
because as far as I know strings with a value other than''
are always true – nils Commented Jul 1, 2015 at 8:40 -
2
@Anand it's not "the same as not using it".
var k = 'hey you'; console.log(k === !!k);
will print "false". This is all about type, the point is to get a boolean value based on the content of the operand, which might be anything from a number to an arbitrary object. – ttzn Commented Jul 1, 2015 at 9:28
2 Answers
Reset to default 7Your assumptions are correct. That is exactly how it works and I'm not aware of any special care to be taken when using this.
Speaking of good practice, you'll probably have as many people supporting the quick 'n "dirty"
!!
way as there are who would advocate using theBoolean
function ; however, from my experience, it appears that!!
is way more mon in library code (look at the jQuery source, you have a lot of stuff likereturn !!locked;
). IMHO, it is sufficiently recognizable to be used without degrading code readability.This has all been standard for a very long time in ECMAScript ; I can't speak for old versions of Internet Explorer (before IE 8), but you can pretty much trust all modern browsers to behave the same in this case.
Useful references in the standard :
- http://www.ecma-international/ecma-262/5.1/#sec-11.4.9
- http://www.ecma-international/ecma-262/5.1/#sec-9.2
Do you know any caveats making my assumptions wrong?
Your assumption is correct. Both Boolean
function and !!
has the same functionality.
Which way should be preferred in term of good practice?
In terms of performance, Boolean is now globally faster than unary operators
JS fiddle link: https://jsfiddle/vj593auw/1/
Do you know any differences to be aware among different ECMAScript versions or Browser vendors?
Boolean and unary operators are implemented from JavaScript 1.0, so they should be available in all browsers that supports JavaScript.