为什么2+ 40等于42?

2020/09/30 13:41 · javascript ·  · 0评论

当一位同事向我展示这一行JavaScript警告42时,我感到困惑。

alert(2+ 40);

很快发现,看起来像减号的实际上是一个语义明显不同的奥秘Unicode字符。

这让我想知道为什么在解析表达式时该字符不会产生语法错误。我还想知道是否还有更多这样的字符。

该字符是“ OGHAM SPACE MARK”,这是一个空格字符。因此,代码等同于alert(2+ 40)

我还想知道是否还有更多这样的字符。

Zs类中的任何Unicode字符在JavaScript中都是空格字符但似乎没有那么多

但是,JavaScript还允许标识符中使用Unicode字符,这使您可以使用有趣的变量名,例如ಠ_ಠ

阅读完其他答案后,我写了一个简单的脚本来查找U + 0000–U + FFFF范围内的所有Unicode字符,它们的行为类似于空格。看起来,取决于浏览器,其中有26或27个,但对U + 0085和U + FFFE的意见不同。

请注意,大多数这些字符看起来就像是常规空格。

看来您正在使用的字符实际上比实际的负号(连字符)长。


-

顶部是您正在使用的内容,底部是负号应该是什么。您似乎确实已经知道这一点,所以现在让我们看看为什么Javascript会这样做。

您使用的字符实际上是ogham空格标记,它是一个空白字符,因此它基本上被解释为与空格相同,这意味着您的语句看起来像alert(2+ 40)Javascript。

Javascript中还有其他类似的字符。您可以在Wikipedia上查看完整列表


我注意到此字符的有趣之处在于Google Chrome(以及其他可能的浏览器)在页面顶部栏中解释该字符的方式。

在此处输入图片说明

这是一个1680内部的这实际上是ogham空格标记的unicode号。看来这只是我的机器在做,但是这很奇怪。


我决定用其他语言尝试一下,看看会发生什么,这些就是我得到的结果。


无法使用的语言:

Python 2和3

>> 2+ 40
  File "<stdin>", line 1
    2+ 40
        ^
SyntaxError: invalid character in identifier

红宝石

>> 2+ 40
NameError: undefined local variable or method ` 40' for main:Object
    from (irb):1
    from /home/michaelpri/.rbenv/versions/2.2.2/bin/irb:11:in `<main>'

Javamain方法内)

>> System.out.println(2+ 40);
Main.java:3: error: illegal character: \5760
            System.out.println(2+?40);
                                 ^
Main.java:3: error: ';' expected
            System.out.println(2+?40);
                                  ^
Main.java:3: error: illegal start of expression
            System.out.println(2+?40);
                                    ^
3 errors

的PHP

>> 2+ 40;
Use of undefined constant  40 - assumed ' 40' :1

C

>> 2+ 40
main.c:1:1: error: expected identifier or '(' before numeric constant
 2+ 40
 ^
main.c:1:1: error: stray '\341' in program
main.c:1:1: error: stray '\232' in program
main.c:1:1: error: stray '\200' in program

exit status 1

>> 2+ 40
can't load package: package .: 
main.go:1:1: expected 'package', found 'INT' 2
main.go:1:3: illegal character U+1680

exit status 1

Perl 5

>> perl -e'2+ 40'                                                                                                                                   
Unrecognized character \xE1; marked by <-- HERE after 2+<-- HERE near column 3 at -e line 1.

它可以使用的语言:

方案

>> (+ 240)
=> 42

C#
Main()方法内)

Console.WriteLine(2+ 40);

Output: 42

Perl 6

>> ./perl6 -e'say 2+ 40' 
42

我想它必须与以下事实有关:出于某种奇怪的原因,它归类为空格:

$ unicode  
U+1680 OGHAM SPACE MARK
UTF-8: e1 9a 80  UTF-16BE: 1680  Decimal: &#5760;
  ( )
Uppercase: U+1680
Category: Zs (Separator, Space)
Bidi: WS (Whitespace)

我还想知道是否还有更多这样的字符。

我似乎还记得前一段时间读过一篇有关用U + 037E(希腊问号)巧妙地替换某人代码中的分号(U + 003B)的文章。

它们看上去都一样(就我所相信的希腊人而言,他们使用的是U + 003B),但本文指出,另一种则行不通。

来自Wikipedia的一些更多信息在这里:https : //en.wikipedia.org/wiki/Question_mark#Greek_question_mark

关于将其用作SO本身的恶作剧的一个(封闭的)问题。虽然不是我最初阅读的地方:
JavaScript恶作剧/开玩笑

本文地址:http://javascript.askforanswer.com/weishenme2-40dengyu42.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!