世界是非常奇妙的,我们总以为我们看到的是整个世界,其实只是世界的一部分而已,我们的造物主远比我们所想象的还要厉害。虽然这一段介绍有些跑题,但是我还是想情不自禁的介绍一种动物,椰子蟹。这玩意会从水里爬到树上吃椰子,它可以用它的钳子把椰子夹断然后喝椰汁,真是佩服大自然的创造力。

同样,在前端的世界里也隐藏着各种类似椰子蟹这样令我们惊奇但是不知道的东西,当然,这个是要大家自己积累的,我也只是知道一部分而已,一旦我们了解,就会对它们赞叹不已。

一个类似分号的符号

先来看看下面的js,看看有没有什么问题:

不管你说答案是1还是2,都是不对的,为啥?你复制代码到浏览器里面运行一下就知道了,因为根本无法运行,直接报错。

那么是哪里报错了呢?其实是分号的问题,就是上面代码中的分号根本就是一个假分号,不是一个真分号。

零宽空白

看看下面的js结果是多少:

结果是4,奇不奇怪?其实那个''里面包含了4个零宽空白,它是由四个零宽度的符号相加而成的,'\u200b'+'\u200c'+'\u200d'+'\ufeff',大家可以将这个代码复制运行,虽然看不到任何东西,但其实真的包含了4个字符。

零宽空白简单来说就是一个宽度为0的空白符号,由'\u200b','\u200c','\u200d','\ufeff'等组成。利用这个可以做一个简单的加密揭秘小玩意。

这个实现的原理很简单,我们首先获取一个字符的Unicode 编码,范围在 0 - 65535,其中字母等占一个字节,中文占两个字节。

为了统一,我们将所有的Unicode 编码均用2个字节表示,例如'a'的Unicode 编码为97,二进制为0000000001100001,'我'的Unicode 编码为25105,二进制为0110001000010001。

然后我们规定'\u200b'代表00,'\u200c'代表01,'\u200d'代表10,'\ufeff'代表11,对二进制进行编码,解码的时候进行逆操作还原出0和1,再根据二进制还原Unicode编码,紧接着还原出字符就好了。

特殊空白字符

这是一个特殊字符,和零宽空白和类似,但不是空白字符,为'\uffa0',大家可以测试一下"aᅠ ​"的长度,结果为4。

如何区别它和零宽空白呢?在你复制粘贴带有零宽空白的字符串的时候可以看到区别:

这个乍一看是js中的竖线,其实这个是一个中文,拼音为gun。var a='江西丨南昌'这种写法非常具有迷惑性,别人会用|分割,其实无法分割,因为这个不是js中的竖线。

'\u212A'

'\u004B'和'\u212A'看起来都是大写的K,但是后者是前者的非规范字体,可以通过u识别,/[a-z]/iu.test('\u212A')。

DEMO下载

点击下载 [0积分]一共下载0

其他文章

0
我要评论

评论

返回
×

我要评论

回复:

昵称:(昵称不超过20个字)

图片:

提交
还可以输入500个字