如何用 JavaScript 实现 2+2=5?
我大学毕业找工作时,经常做一些稀奇古怪的面试题。这不,给大家分享一道整蛊的面试题,它其实不能算一道正式的面试题,大家可以用它来捉弄你们那些程序员朋友。
题目:如何用 JavaScript 实现 2+2=5?
答案如下。
新建一个 txt 文件,然后把后缀名改为.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 服务器上。
我测试用的是 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 的原创技术文章,请关注公众号"汪子熙".
版权声明: 本文为 InfoQ 作者【Jerry Wang】的原创文章。
原文链接:【http://xie.infoq.cn/article/2aedebbd0b1ce76b336744b5b】。文章转载请联系作者。
评论