JS函数前面加!、+、-、~符号以及;是什么意思、按位取反
来源:互联网 发布:二进制算法口诀 编辑:程序博客网 时间:2024/04/29 18:48
在开始写之前我不得不吐槽下markdown编辑器,这篇文章已经是我第三遍重写了,之前两次都被覆盖了。
第一次是在快写完的时候,发现以前博客有点小问题,然后就去修改了下,修改完回到这个正在编辑的markdown,提示由于新打开markdown,内容被覆盖了。
第二次更加离谱,我这个文章已经发表了,过了两天,想写新文章,就点击“写新文章”,然后弹出的markdown界面是这篇文章的内容,当时没怎么在意,想着已经发表了,应该没什么问题,结果,新写的内容直接把这篇文章内容替换了,而且新内容是出于发表状态。这个移花接木我服,双击666。
同时提醒大家,写好的文章尽量做一个本地的备份,以防出现什么问题导致自己辛苦写的东西丢失了。
进入正题
1. 函数定义和调用
1-1 常见的函数定义和调用
匿名函数: function() {}; // 会报错, var fn = function() {}; // 不会报错 fn();普通函数: function myFn() {}; myFn();
1-2 错误的直接调用
function() {}();function myFn(){}();这样的直接调用方法解析器无法理解,因此会报错。
1-3 正确的直接调用方法
//常见的直接调用(function() {})();var fn = function() {}();(function myFn() {})();// 特殊直接调用(有强制执行的感觉)(function() {}()) (function myFn() {}())原理:将函数用括号包括起来,解析器会把函数解析为函数表达式,而函数表达式可以直接调用。因此,其他能将函数体变成函数表达式的方法,都可以让解析器正确调用定义函数,比如上面的第二种调用方法。以及其他的一些符号,如:!、+、-、~
<script type="text/javascript"> (function() { console.log('()'); })(); // () // console.log()中的()也可以让函数解析为表达式。 console.log(function() { console.log('()'); // () 可正常输出 }); // 函数无返回值,所以输出undefined; !function() { console.log('!'); }(); // ! +function() { console.log('+'); }(); // + -function() { console.log('-'); }(); // - ~function() { console.log('~'); }(); // ~ // 可见上面的函数都执行了。</script>
1-4 各个符号的含义
()、!、+、-、~这些符号写在函数前代表不同的含义,但是本质上是对函数的返回值进行相应的操作。
1. 没返回值的函数默认返回undefined
console.log((function() {})()); // undefind;console.log((function() { return;})()); // undefind;
2. 各个符号的含义
<script type="text/javascript"> // () 没什么实际意义,不操作返回值 console.log((function() { return 'aa'; })()); // aa // ! 对返回值的真假取反 console.log(!function() { return; }()); // true undefined属于false, console.log(!function() { return "a"; }()); // false 字符串a属于真, console.log(!function() { return 0; }()); // true 数字0属于假, console.log(!function() { return "0"; }()); // false 字符串0属于真, // +、- 是对返回值进行数学运算 console.log(+function() { return 5.1; }()); // 5.1 console.log(-function() { return 5.1; }()); // -5.1 console.log(+function() { return "5.1"; }()); // 5.1 可见返回值不是数字类型的时候 +、- 会将返回值进行强制转换 console.log(-function() { return "-5.1"; }()); // 5.1 强制转化 console.log(+function() { return "a5.1"; }()); // NaN 强制转化后为非数字NaN console.log(+function() { return; }()); // NaN undefined强制转化也为NaN // ~ 对返回值进行按位取反(所有正整数的按位取反是其本身+1的负数,所有负整数的按位取反是其本身+1的绝对值,零的按位取反是 -1) (按位取反原理详见下面) console.log(~function() { return 5; }()); // -6 console.log(~function() { return -5; }()); // 4 console.log(~function() { return 0; }()); // -1 console.log(~function() { return "5"; }()); // -6 按位取反也会对返回值进行强制转换,将字符串5转化为数字5,然后再按位取反 console.log(~function() { return "-5"; }()); // 4 console.log(~function() { return true; }()); // -2 ture会被转化为1 console.log(~function() { return false; }()); // -1 false被转化为0 console.log(~function() { return "a"; }()); // -1 其他非数字或不能转化为数字类型的返回值,统一当做0处理</script>
JS中数据类型不了解的可以参考JS数据类型
1-5 分号 ; 的含义
function前写 ; 是为了防止代码压缩时,前面代码没写 ; 造成报错。
1-6 按位取反 ~
二进制数在内存中是以补码的形式存放的。
计算机中的符号数有三种表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
例:(四位二进制表示)原码 +4 : 0100 其中第一个0是符号位,代表符号+;后面的数字是数值位 -4 : 1100 其中第一个1是符号位,代表符号-;后面的数字是数值位
三种形式的转化方法:
正数:(正数原码、反码、补码、三者相等) 原码:符号位0(即代表+号),加上数字的二进制形式。 反码 = 原码 补码 = 原码 负数: 原码:符号位1(即代表-号),加上数字的二进制形式 反码:相对于原码,符号位不变,数值位依次取反(0变1,1变0)。 补码:相对于原码,符号位不变,数值位依次取反,然后再加1。(即补码 = 反码 + 1)零: 0有 +0 和 -0两种形式,分别按照上面的进行计算即可。
按位取反原理:
对数字的补码(即内存中的存储形式),进行依次取法,得取反后数字的补码,然后将其转化为10进制,即可得取反后数值。
计算示例:(四位二进制表示)
+5: 1. 计算原码: 0101, 2. 计算补码:0101,正数补码和原码相同, 3. 对补码依次取反:1010,(取反后的数字的补码,由符号位可知为负数) 4. 取反后数字反码:1001,负数的反码 = 补码减1, 5. 取反后数字原码:1110,相对于反码,符号位不变,数值位依次取反, 6. 转化为十进制:-6。-4: 1. 计算原码:1100,由符号位可知为负数, 2. 计算反码:1011,负数反码 = 相对于原码符号位不变,数值位依次取反, 3. 计算补码:1100,负数补码 = 反码 + 1, 4. 对补码依次取反:0011,得取反后数字补码,可知为正数, 5. 取反后数字原码:0011,正数原码和补码相同。 6. 转化为10进制:+3。
阅读全文
0 0
- JS函数前面加!、+、-、~符号以及;是什么意思、按位取反
- MFC有的函数前面加::是什么意思
- JS函数前面的感叹号是什么意思?
- c++中的函数前面加个LRESULT是什么意思啊?
- php函数前面加&符号 和 变量前面加&符号的意义
- php函数前面加&符号 和 变量前面加&符号的意义
- 函数名称前面加引用“&”或指针符号“*”的意思
- PHP在变量前面加&是什么意思
- PHP在变量前面加&是什么意思?
- php函数前面加&符号的意思是函数的引用
- php函数前面的&符号
- PHP函数前面的&符号
- js里function前面加!
- php程序中代码前面加上@符号是什么意思
- PHP代码中函数前面的@是什么意思
- python 的函数前面带个杠是什么意思?
- c#中class前面加一个public具体是什么意思
- js函数前加分号和感叹号是什么意思?有什么用?
- Vuforia实现触屏原地旋转物体的功能
- ios 画圆环进度条
- CSS3响应式布局
- MySQL数据库从windows迁移到linux
- SpringMVC学习笔记(十)
- JS函数前面加!、+、-、~符号以及;是什么意思、按位取反
- 剑指offer(1)—二维数组的查找
- spark-submit
- WM_MOUSEWHEEL 在PreTranslateMessage(MSG* pMsg)中MSG 的说明
- Android.mk 添加第三方静态库模板
- 发现一个问题,十分蛋疼。 我们项目是由N个工程组成的,外围工程是web工程,内部的工程打包成jar,放入外围工程的WEB-INF/lib 内部的工程用到了spring的注解,例如@Service、
- Section 2.3-nocows
- 常用的shell脚本
- [JAVAWEB]8.JSP中的JavaBean和动作元素(一)