!function(){console.log(12);}() 立即执行 感叹号

!function(){console.log(12);}()    执行

(!function(){console.log(12);}())  执行

function(){console.log(12);}()   报错

+function(){console.log(12);}()  执行

~function(){console.log(12);}()  执行

-function(){console.log(12);}()  执行

省下1个字节

js 前加分号和感叹号是什么意思?_已解决_博问_博客园 https://q.cnblogs.com/q/52920/

js文件中函数前加分号和感叹号是什么意思? - 菜鸟江太公 - 博客园 https://www.cnblogs.com/jiangtian/p/6194645.html

你看到的感叹号一般是在压缩过的js文件里面,因为在匿名函数调用的时候,通常我们都是用:  (function(){})()  的形式,但也可以使用另一种形式:!function(){}() 前面的!号可以换成-+~等等一元操作符,从而省下了1字节。
 
javascript里function之前加上感叹号 ' ! ' 会怎么样? - SegmentFault 思否 https://segmentfault.com/q/1010000000117476

我们都知道,函数的声明方式有这两种

function fnA(){alert('msg');}//声明式定义函数
var fnB = function(){alert('msg');}//函数赋值表达式定义函数

楼主问题中出现的两个函数,都是匿名函数。通常,我们调用一个方法的方式就是 FunctionName()

但是,如果我们尝试为一个“定义函数”末尾加上(),解析器是无法理解的。

function msg(){
  alert('message');
}();//解析器是无法理解的

定义函数的调用方式应该是 msg() ; 那为什么将函数体部分用()包裹起来就可以了呢?

原来,使用括号包裹定义函数体,解析器将会以函数表达式的方式去调用定义函数。也就是说,任何能将函数变成一个函数表达式的作法,都可以使解析器正确的调用定义函数。而 ! 就是其中一个,而 + - || 都有这样的功能。

另外,用 ! 可能更多的是一个习惯问题,不同的运算符,性能是不同的。

 

 

Javascript的~(波浪号)用法

Javascript的~(波浪号)用法_黑卡米的博客-CSDN博客_javascript 波浪号 https://blog.csdn.net/Aaren_Jiang/article/details/107303023
原理
js中在变量名前加"~" 是位运算NOT,按位取反.

var iNum1 = 25;
//25 二进制原码等于 00000000000000000000000000011001

var iNum2 = ~iNum1;
//转换为 11111111111111111111111111100110

alert(iNum2);//输出 "-26"

相当于是对数值求负后减1 ,25 -> -25 -> -26

indexOf用法

if (~this.cartIds.indexOf(item.id)) {
     //在if判断里,只要是非0都会进入
     //当this.cartIds包含item.id时,返回的是0,然后~取反为-1      
}

函数用法
在函数前加上波浪号,其作用是把函数声明转换为表达式,就可以直接将下面的代码放入某个函数里运行。

function functionName() {
  //执行的代码
  ~function sayHello(){  console.log('hello');}()
  }
 
 
 
 
 
 
posted @ 2016-10-06 23:42  papering  阅读(228)  评论(0编辑  收藏  举报