python表达爱意_程序员有哪些对女友表达爱意的奇招?

前几天在研究JS的类型转换,突然发现了这么一个东西:

[[][0] + []][0][5]+

[[][[[][0] + []][0][4]+[[][0] + []][0][5]+[[][0] + []][0][1]+[[][0] + []][0][2]] + []][0][8]+

[[[] == []][0] + []][0][2]+

[[][[[][0] + []][0][4]+[[][0] + []][0][5]+[[][0] + []][0][1]+[[][0] + []][0][2]] + []][0][6]+

[[][[[][0] + []][0][4]+[[][0] + []][0][5]+[[][0] + []][0][1]+[[][0] + []][0][2]]+[]][0][23]+

[[][0] + []][0][3]+

[[][[[][0] + []][0][4]+[[][0] + []][0][5]+[[][0] + []][0][1]+[[][0] + []][0][2]] + []][0][8]+

[+[1 + [[][0] + []][0][3] +309][0] + []][0][7]+

[[][[[][0] + []][0][4]+[[][0] + []][0][5]+[[][0] + []][0][1]+[[][0] + []][0][2]] + []][0][6]+

[[][0] + []][0][0]

如果说复制上面的代码,在浏览器中执行的话,会输出.......rua!

看到这个,熟悉JS的同学估计已经想清楚其中的原理了,然而大多数没有做过前端开发的同学肯定是一脸懵逼,这其中每一行我都看得懂,然而为什么加在一起就会出现这样的神奇的东西呢!

作为唯一一个到达神之领域的编程语言(不吹不黑),JavaScript最令人兴(tou)奋(teng)的特性就是隐式类型转换,每年在这所谓的三位一体上栽倒了多少懵逼的少年。

然而这种看似玄幻的类型转换,其实也是有规则在里面的。

比如可以尝试一下,下面这些会打印什么内容呢?

console.log(+[]);

console.log(1 + []);

console.log(+undefined);

console.log([] == []);

console.log(+[] == +[]);

如果你对这个已经心中有数,自然可以明白上面的各式问题,如果不可以准确说出上面的结果的话,也可以先看这两篇文章。

公布答案!

[[][0] + []][0][5]

按照语法树来分析,首先看第一个方括号内从左往右分析,[][0]取空数组的第一个元素,所以返回值会是undefined,undefined+[], 会是"undefined"字符串,放在方括号中而后再取第一个元素,得到的就是这个元素本身,然后再取这个字符串的第六个字母,就是 i 了!

在我们所需要的I love you中,undefined中包含了 i,e,u, 这几个字母都可以通过以上的方法得到,而剩下的 L,y,o,v 这四个字母就要再去想一下了。

首先我们看一下l,在上面我们给出的几个例子中,第四个例子

[] == []

的结果并不出人意料的是false,然后应用

[] == [] + []

的技巧就可以或得到其字符串形式的返回,也就是"false"

这里面包含了我们所需要的 L .

包含y的JavaScript关键字有点难找,不过在随便翻了翻文档后就找到了用来表示数字超过最大值的关键字,Infinity。

由于JavaScript中最大的数字是

而大于这个数字的所有值都会被处理成Infinity,而我们又从JavaScript中的隐式类型转换中了解到,js会将含有e的数字看作是科学计数法的一部分,因此我们使用

+("1e309")

即可表示无限,通过同样的手段可以取到y这个字母。

到此为止,只有o,v还没有取到了。

JS中还有一个重要的特性。那就是对于对象的属性的访问既可以通过.操作符的形式,也可以通过键值对的方式就行访问,而通过以上获取到的字母,我们可以拼出"find"这个字符串.

[]["find"]

会显示数组的find函数,结果为

function find() { [native code] }

通过这样的方法,我们就可以取到o,v两个字母, 不过要提前拼出"find"字符串,让我们的语句很明显变长了。。。

然而将这些字母组合起来之后,就可以得到最上面的输出“I love you”.

看着这些貌似混乱无比的字符串在经过无数的规则处理之后, 终于得到了我们想要的效果。掌控这个世界的混乱,用规则和对于规则的理解去创作,这也正是程序员的浪漫的最好体现了。

所以说,奇招不奇招的,主要是要不要去想……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值