Parece que o caractere que você está usando é realmente maior do que o sinal de menos real (um hífen).
-
A parte superior é o que você está usando, a parte inferior é o que o sinal de menos deve ser. Você já sabe disso, então agora vamos ver por que o Javascript faz isso.
O caractere que você usa é, na verdade, a marca de espaço ogham, que é um caractere de espaço em branco; portanto, é basicamente interpretado como a mesma coisa que um espaço, o que significa que sua declaração se parece comalert(2+ 40)
com Javascript.
Existem outros caracteres como este em Javascript. Você pode ver uma lista completa aqui na Wikipedia .
Algo interessante que notei sobre esse personagem é a maneira como o Google Chrome (e possíveis outros navegadores) o interpreta na barra superior da página.
É um bloco com 1680
dentro dele. Na verdade, esse é o número unicode da marca de espaço ogham. Parece ser apenas minha máquina fazendo isso, mas é uma coisa estranha.
Decidi tentar isso em outros idiomas para ver o que acontece e esses são os resultados que obtive.
Idiomas em que não funciona:
Python 2 e 3
>> 2+ 40
File "<stdin>", line 1
2+ 40
^
SyntaxError: invalid character in identifier
Rubi
>> 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>'
Java (dentro do main
método)
>> 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
Vai
>> 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.
Idiomas em que trabalha:
Esquema
>> (+ 2 40)
=> 42
C #
(dentro do Main()
método)
Console.WriteLine(2+ 40);
Output: 42
Perl 6
>> ./perl6 -e'say 2+ 40'
42