当前位置:   article > 正文

JS函数前面加!、+、-、~符号以及;是什么意思、按位取反_~ js

~ js

1. 函数定义和调用

1-1 常见的函数定义和调用

  1. // 匿名函数:
  2. function() {}; // 会报错,
  3. var fn = function() {}; // 不会报错
  4. fn();
  5. // 普通函数:
  6. function myFn() {};
  7. myFn();

1-2 错误的直接调用

  1. function() {}();
  2. function myFn(){}();
  3. // 这样的直接调用方法解析器无法理解,因此会报错。

1-3 正确的直接调用方法

  1. //常见的直接调用
  2. (function() {})();
  3. var fn = function() {}();
  4. (function myFn() {})();
  5. // 特殊直接调用(有强制执行的感觉)
  6. (function() {}())
  7. (function myFn() {}())

原理:将函数用括号包括起来,解析器会把函数解析为函数表达式,而函数表达式可以直接调用。因此,其他能将函数体变成函数表达式的方法,都可以让解析器正确调用定义函数,比如上面的第二种调用方法。以及其他的一些符号,如:!、+、-、~

  1. <script type="text/javascript">
  2. (function() {
  3. console.log('()');
  4. })(); // ()
  5. // console.log()中的()也可以让函数解析为表达式。
  6. console.log(function() {
  7. console.log('()'); // () 可正常输出
  8. }); // 函数无返回值,所以输出undefined;
  9. !function() {
  10. console.log('!');
  11. }(); // !
  12. +function() {
  13. console.log('+');
  14. }(); // +
  15. -function() {
  16. console.log('-');
  17. }(); // -
  18. ~function() {
  19. console.log('~');
  20. }(); // ~
  21. // 可见上面的函数都执行了。
  22. </script>

1-4 各个符号的含义

()、!、+、-、~这些符号写在函数前代表不同的含义,但是本质上是对函数的返回值进行相应的操作。
  1. 没返回值的函数默认返回undefined
  1. console.log((function() {})()); // undefind;
  2. console.log((function() {
  3. return;
  4. })()); // undefind;
  1. 各个符号的含义
  1. <script type="text/javascript">
  2. // () 没什么实际意义,不操作返回值
  3. console.log((function() {
  4. return 'aa';
  5. })()); // aa
  6. // ! 对返回值的真假取反
  7. console.log(!function() {
  8. return;
  9. }()); // true undefined属于false
  10. console.log(!function() {
  11. return "a";
  12. }()); // false 字符串a属于真,
  13. console.log(!function() {
  14. return 0;
  15. }()); // true 数字0属于假,
  16. console.log(!function() {
  17. return "0";
  18. }()); // false 字符串0属于真,
  19. // +、- 是对返回值进行数学运算
  20. console.log(+function() {
  21. return 5.1;
  22. }()); // 5.1
  23. console.log(-function() {
  24. return 5.1;
  25. }()); // -5.1
  26. console.log(+function() {
  27. return "5.1";
  28. }()); // 5.1 可见返回值不是数字类型的时候 +、- 会将返回值进行强制转换
  29. console.log(-function() {
  30. return "-5.1";
  31. }()); // 5.1 强制转化
  32. console.log(+function() {
  33. return "a5.1";
  34. }()); // NaN 强制转化后为非数字NaN
  35. console.log(+function() {
  36. return;
  37. }()); // NaN undefined强制转化也为NaN
  38. // ~ 对返回值进行按位取反
  39. // 所有正整数的按位取反是其本身+1的负数,
  40. // 所有负整数的按位取反是其本身+1的绝对值,
  41. // 零的按位取反是 -1
  42. // 按位取反原理详见下面
  43. console.log(~function() {
  44. return 5;
  45. }()); // -6
  46. console.log(~function() {
  47. return -5;
  48. }()); // 4
  49. console.log(~function() {
  50. return 0;
  51. }()); // -1
  52. console.log(~function() {
  53. return "5";
  54. }()); // -6 按位取反也会对返回值进行强制转换,将字符串5转化为数字5,然后再按位取反
  55. console.log(~function() {
  56. return "-5";
  57. }()); // 4
  58. console.log(~function() {
  59. return true;
  60. }()); // -2 ture会被转化为1
  61. console.log(~function() {
  62. return false;
  63. }()); // -1 false被转化为0
  64. console.log(~function() {
  65. return "a";
  66. }()); // -1 其他非数字或不能转化为数字类型的返回值,统一当做0处理
  67. </script>

1-5 分号 ; 的含义

function前写 ; 是为了防止代码压缩时,前面代码没写 ; 造成报错。

1-6 按位取反 ~

二进制数在内存中是以补码的形式存放的。
计算机中的符号数有三种表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。

例:(四位二进制表示)原码
+4: 0100 其中第一个0是符号位,代表符号+;后面的数字是数值位
-4: 1100 其中第一个1是符号位,代表符号-;后面的数字是数值位

三种形式的转化方法:

  1. 正数:(正数原码、反码、补码、三者相等)
  2. 原码:符号位0(即代表+号),加上数字的二进制形式。
  3. 反码 = 原码
  4. 补码 = 原码
  5. 负数:
  6. 原码:符号位1(即代表-号),加上数字的二进制形式
  7. 反码:相对于原码,符号位不变,数值位依次取反(0110)。
  8. 补码:相对于原码,符号位不变,数值位依次取反,然后再加1。(即补码 = 反码 + 1)
  9. 零:
  10. 0+0 和 -0两种形式,分别按照上面的进行计算即可。

按位取反原理:

对数字的补码(即内存中的存储形式),进行依次取反,得取反后数字的补码,然后将其转化为10进制,即可得取反后数值。

计算示例:(四位二进制表示)

  1. +5
  2. 1. 计算原码: 0101
  3. 2. 计算补码:0101,正数补码和原码相同,
  4. 3. 对补码依次取反:1010,(取反后的数字的补码,由符号位可知为负数)
  5. 4. 取反后数字反码:1001,负数的反码 = 补码减1
  6. 5. 取反后数字原码:1110,相对于反码,符号位不变,数值位依次取反,
  7. 6. 转化为十进制:-6
  8. -4
  9. 1. 计算原码:1100,由符号位可知为负数,
  10. 2. 计算反码:1011,负数反码 = 相对于原码符号位不变,数值位依次取反,
  11. 3. 计算补码:1100,负数补码 = 反码 + 1
  12. 4. 对补码依次取反:0011,得取反后数字补码,可知为正数,
  13. 5. 取反后数字原码:0011,正数原码和补码相同。
  14. 6. 转化为10进制:+3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/484280
推荐阅读
相关标签
  

闽ICP备14008679号