你真的不知道的JavaScript

本文探讨了JavaScript中的void操作符及其用途,如何使用它来获取纯正的undefined值,以及位移运算符(左移、无符号右移、有符号右移)在二进制操作中的应用。

前言

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

更多笔记


目录

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

void

目录

1. void 是什么

void 是 JavaScript 中非常重要的关键字,该操作符指定要计算一个表达式但是不返回值。

是否还记得 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值