<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-KRS8CM');</script>

JavaScriptで!!(エクスクラメーションマーク2つ)

ブラウザ内でカメラを使うデモの中で、「!!」というのを目にしました。
「!」一つはよく使いますが、二つは使ったことがありません。
ググってみたところ、Stack OverflowでWhat is the !! (not not) operator in JavaScript?という記事を発見。
回答がいろいろありますが、一番上のをみると、

Converts it to boolean!
!oObject  //Inverted boolean(真偽値を反転する)
!!oObject //Non inverted boolean so true boolean representation(真偽値を反転しない、つまりtrueが返る)

ブーリアン(真偽値)に変換する、とあります。
……って、言われてみるとそうですよねぇ。

	return !!(
		navigator.getUserMedia ||
		navigator.webkitGetUserMedia ||
		navigator.mozGetUserMedia ||
		navigator.msGetUserMedia
	);

先の例だと、!!がない場合、returnされるのは()内で該当する(この場合存在する)オブジェクトです。
該当するものが何もない場合はundefinedが返ります。
consoleで試してみると、

Boolean(undefined)
// false
!undefined
// true
!!undefined
// false

undefinedをブール値にすると、falseなんですねぇ。
だからこの場合は、真偽値を反転せずに返すよう「!!」を使っていると。


タグ:JavaScript
<script type="text/javascript" id="zsiqchat">var $zoho=$zoho || {};$zoho.salesiq = $zoho.salesiq || {widgetcode: "siq61aecceb7ad0c24af4e4670187f03564ddd615eb71422e1b7169309fa9b25e89", values:{},ready:function(){}};var d=document;s=d.createElement("script");s.type="text/javascript";s.id="zsiqscript";s.defer=true;s.src="https://salesiq.zohopublic.com/widget";t=d.getElementsByTagName("script")[0];t.parentNode.insertBefore(s,t);</script>