!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');}()
}