写点什么

如何用 JavaScript 实现 2+2=5?

作者:Jerry Wang
  • 2021 年 11 月 30 日
  • 本文字数:1580 字

    阅读完需:约 5 分钟

如何用JavaScript实现2+2=5?


我大学毕业找工作时,经常做一些稀奇古怪的面试题。这不,给大家分享一道整蛊的面试题,它其实不能算一道正式的面试题,大家可以用它来捉弄你们那些程序员朋友。


题目:如何用 JavaScript 实现 2+2=5?


答案如下。


新建一个 txt 文件,然后把后缀名改为.html, 再用浏览器打开。


<html>
<script>
g = function () {
H = 3
return H + H
}
f = function () {
Η = 2
return Η + H
}
// 3 + 3 = 6
alert(g())
// 2 + 2 = 5
alert(f())
</script>
</html>
复制代码



会先后弹出两个对话框,依次显示 6,5。


但是,第二个函数 f 里面,明明变量 H 被赋成了 2, 2 + 2 应该等于 4 才对,为什么答案是 5????


我们用 Chrome 开发者工具调试一下,看看到底有什么玄虚。


为什么函数 f 里有两个看起来一模一样的 H,但是一个值为 2,一个值为 3?



到现在,肉眼已经不能帮助我们了。那么我们就请出 winHex 这款 16 进制文件编辑与磁盘编辑神奇出马。


先从百度上搜索 ASCII,得知大写字母的 H 的十六进制编码为 48.



然后我们用 WinHex 打开上述代码文件,果然发现了这个 48 的 16 进制编码对应了大写 H。



同样,加号“+”的 16 进制编码是 2B:




空格为 20。


所以谜底在这里,加号前面肉眼看起来像大写字母 H 的变量“H",其实并不是 H,其 16 进制编码为 CE 97。它的值在函数 f 里赋为 2,而大写 H 赋为 3,2 + 3 = 5,所以弹出窗里我们看到的结果是 5。



这道题其实并没有考察 JavaScript 里闭包等知识点,而是一个障眼法,恶作剧。


有没有想过给您的网站增添语音识别的功能?比如您的用户不用点鼠标,仅仅通过电脑或者手机的麦克风发布命令,比如"下拉到页面底部”,或者“跳转到下一页”,您的网站就会执行对应命令。听起来很酷对么?然而为了实现这个功能,必须得让您网站的 JavaScript 脚本能够识别到这些语音输入。



这里介绍一个开源的 JavaScript 语言输入库,名叫 annyang。


Github 地址:https://github.com/TalAter/annyang


截至到 2018 年 7 月 12 日,这个 github 仓库已经有 4833 个 Star 了。



annyang 实际上就是一个只有 2KB 大小的 JavaScript 脚本文件,使用起来非常方便。


下面就跟着我一起做一个 Hello World 应用吧,看看您通过麦克风说话的声音是如何被这个 JavaScript 库文件识别到的。


新建一个 html 文件,将下面的代码复制进去。将它部署到您本地的 Tomcat 或者 nodejs 服务器上。


<html>
<script src="annyang.min.js"></script>
<script>
if (annyang) {
var commands = {
"Hello": function() {
alert(" I have heard your voice!");
}
};
var commands2 = {
"Bye": function(){
alert("再见!");
}
}
annyang.addCommands(commands);
annyang.addCommands(commands2);
annyang.start();
}
</script>
</html>
复制代码


我测试用的是 Chrome。


当您第一次在浏览器里访问这个网页时,会弹出下面的 Chrome 对话框,提示您这个应用要使用您电脑上的麦克风。点 Allow 按钮即可。



这个应用有两个地方向您提示它可以接受语音输入。第一处是下图 1 的红色小圆圈。



第二处是一个小的麦克风图标,点击之后,可以设置允许或者禁止麦克风。我们当然是要选择允许啦,否则如何接受语音输入呢?



如果您的笔记本电脑本身也有麦克风,可以从这个下拉菜单里选择用笔记本自带的麦克风,还是用外接的麦克风。我用的是后者。



现在可以测试了。



因为代码里我给 Hello 这个语音绑定的执行函数是一个 alert 弹出对话框,所以当我对着麦克风说了一句“Hello"之后,我的浏览器立即弹出了这个对话框。



同样,说了"Bye"后,会弹出“再见”。我在响应“Bye”这个语音的函数设置了一个断点,大家通过调用栈也可以观察到 annyang 的处理逻辑。



从 annyang 的 github 上能看出,中文也在支持的语音之列,所以大家放心大胆地使用吧!


https://github.com/TalAter/annyang/blob/master/docs/FAQ.md


连粤语都支持,厉害了!



更多细节,请查阅 annyang 的官网。


https://www.talater.com/annyang/



要获取更多 Jerry 的原创技术文章,请关注公众号"汪子熙".


发布于: 4 小时前阅读数: 7
用户头像

Jerry Wang

关注

个人微信公众号:汪子熙 2017.12.03 加入

SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。

评论

发布
暂无评论
如何用JavaScript实现2+2=5?