您现在的位置是:首页 > 技术学习 > javascript 网站首页 技术学习 javascript
JS函数前面加!、+、-、~符号以及;是什么意思、按位取反
- 技术学习
- 2019-04-06
- 2580已阅读
- 16
简介
JS函数前面加!、+、-、~符号以及;分别代表什么意思,在使用中起什么作用,按位取反什么意思,如何计算按位取反。
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 各个符号的含义
()、!、+、-、~这些符号写在函数前代表不同的含义,但是本质上是对函数的返回值进行相应的操作。
- 没返回值的函数默认返回undefined
console.log((function() {})()); // undefind;
console.log((function() {
return;
})()); // undefind;
- 各个符号的含义
<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>
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。
上一篇:PS的一些基本操作以及快捷键
下一篇:JS中的数据类型