你真的不知道的JavaScript

前言

最近一直在反编译一些有趣的微信小程序的源码来学习。在看了那些比较难看的源码中发现了不少我所不知道的js中的知识,so,此文章记录一下。javascript

更多笔记html


目录

目录
void
位移运算符(<<,>>,>>>)

void

目录java

1. void 是什么git

void 是 JavaScript 中很是重要的关键字,该操做符指定要计算一个表达式可是不返回值。github

是否还记得 javascript:void(0) 这个写法:小程序

<a href="javascript:void(0);"></a>
复制代码

其实我一直不知道前面的那个javascript:是什么意思,有知道的小伙伴欢迎在下方评论告诉我,谢谢。微信小程序

不过我本身认为是执行一段js脚本,由于下面这段代码是直接能够弹出123123。浏览器

<script type="text/javascript"> function fn(){ alert(123123) } </script>
<body>
    <a href="javascript:fn()">点我!</a>
</body>
复制代码

因此这里还有一个技巧就是,不须要监听a标签的onClick时间就能够实现点击执行js方法。微信

回归正题。经过下面的打印咱们知道,咱们证明了。void能够将一个表达式变成不返回值,也就是undefind函数

2. 为何不直接使用undefined

undefined在JavaScript中并不属于保留字/关键字,所以在IE5.5~8中咱们能够将其看成变量那样对其赋值(IE9+及其余现代浏览器中赋值给undefined将无效)

var undefinedBackup = undefined;
undefined = 1;
// 显示"undefined"
console.log(typeof undefinedBackup);  
// 在IE5.5~8中显示"number",其余浏览器中则显示"undefined"
console.log(typeof undefined);
复制代码

3. 获得一个纯正的undefined

除了 void 咱们还能够经过如下形式来获取纯正的undefined

  • 未赋值的变量

    var myUndefined;
    console.log(typeof myUndefined); // 显示"undefined"
    复制代码
  • 无返回值函数

    var getUndefined = function(){};
    var myUndefined = getUndefined();
    复制代码
  • 未定义的属性

    var myUndefined1 = {}[''];
    var myUndefined2 = [][0];
    复制代码

参考文章:从void 0 === undefined提及


位移运算符

目录

js中位移运算有3种:左移(<<)、无符号右移(>>>)、有符号右移(>>)

为何没有有符号左移运算符:由于,左移是在后面补0,因此不会产生符号问题。

0. 前景摘要

首先咱们得先说说二进制。

  • 引言

    bit(位):数据存储的最小单元。在计算机二进制系统中,位,简记为b,也称为比特(bit),每一个二进制数字0或1就是一个位(bit),其中每 8bit = 1 byte(字节);

  • 什么是二进制

    不是计算机相关专业的同窗可能对这块不太熟悉,生活中咱们有不少进制,如时钟60进制,咱们用10进制来计数,一天24小时24进制。二进制在计算机技术中普遍应用。二进制数用0和1两个数字及其组合来表示任何数,二进制的进位规则是:“逢2进1”。数字1在不一样的位上表明不一样的值,按从右至左的次序,这个值以2倍递增。

具体详情请查阅二进制的资料,本文再也不叙述。

1. 左移运算(<<)

好比咱们要左移一个2。2在二进制中用 0010 表示,左移一位以后得 0100 表示 4(其实操做的是补码)


2. 有符号右移(>>)

原理和左移相同。咱们主要看下面的无符号右移

3. 无符号右移(>>>)

咱们先看 -1 无符号右移 1 位


打印出了 2147483647

2147483647 是32位操做系统中最大的符号型整型常量

在计算机系统中,数值一概用补码来表示,第一位为符号位,因此-1 在计算器中表示的二进制是

原码为 1000 0001

反码为 11111 1110 (符号位不变,其余值取反)

补码为 1111 1111

补码全部的位置都向右移动变成这样子:


前面空了一位补0 变成 0111 1111 符号位变成了 0 也就是正数,正数的源码和补码都相同,因此最终返回 1111 1111

相关文章
相关标签/搜索