Estrutura léxica do JavaScript
A estrutura léxica de uma linguagem de programação é o conjunto de regras elemntares que especificam o modo de escrever programas nessa linguagem. É a sintaxe de mais baixo nível de uma linguagem; especificar detalhes de como são os nomes de variáveis, os caracteres delimitadores para comentários e como uma instrução do programa é separada da seguinte.
Conjunto de caracteres
os programas em javascript são escritos com o conjunto de caracteres Unicode. Unicode é um padrão adotado mundialmente que possibilita com que todos os caracteres de todas as linguagens escritas utilizadas no planeta possam ser representados em computadores.
Diferenciação de maiusculas e minúsculas
JavaScript é uma linguagem que diferencia letras maiúsculas de minúsculas. Palavras-chave, variáveis, nomes de funções e outros identificadores da linguagem sempre devem ser digitados corretamente. Por exemplo, a palavra-chave while
não pode ser digitada de outras formas, como While
ou WHILE
. Da mesma forma, online
, Online
, OnLine
e ONLINE
são quatro nomes de variável distintos.
Espaço em branco, quebras de linha e caracteres de controle de formato
o JavaScript ignora os espaços que aparecem entre sinais em programas. De modo geral, JavaScript também ignora quebras de linhas (SALVO EM CERTAS EXCEÇÔES). Como é possível usar espaços e novas linhas, podemos formatar e endentar os programas de modo organizado e mais harmonisoso.
Caracteres que o JavaScript reconhece como espaço:
- \u0020: Espaço normal
- \u0009: Tabulação
- \u000B: Tabulação vertical
- \u000C: Avanço de página
- \u00A0: Espaço não separável
- \uFEFF: Marca de ordem de byte
- Qualquer Unicode da categoria Zs
Caracteres que o JavaScript reconhece como término de linha:
- \u000A: Avanço de linha
- \u000D: Retorno de carro (esse termo vem das antigas máquinas de escrever)
- \u2028: Separador de linha
- \u2029: Separador de parágrafo
Normalmente, em sistemas Unix/Linux, o fim de linha é representado apenas por \u000A, enquanto em sistemas Windows, é uma combinação de \u000D\u000A.
Sequências de escape Unicode
O JavaScript define sequências especiais de seis caracteres ASCCI pare representar qualquer código Unicode de 16 bits. Esses escapes começam com \u
e são seguidos por quatro dígitos hexadecimal. Por exemplo, o escape Unicode para o caractere "É" é \u00E9
.
"café" === "caf\u00E9" // -> true
Normalização
O Unicode permite mais de uma maneira de codificação. Usando o exemplo do 'É', podemos codificá-lo como o caractere Unicode \u00C9
ou como o caractere ASCII 'E' seguido da marca de combinação de acento agudo \u0301.
O JavaScript presume que o código-fonte que está interpretando e que já foi normalizado e não tenta normalizar identificadores, strings ou expressões regulares.
Comentários
JavaScript aceita dois estilos de comentários.
// Este é um comentário de uma linha.
/* Este também é um comentário */ // e aqui está outro comentário.
/*
* Este é ainda outro comentário.
* Ele tem várias linhas.
*/
Literais
São dados que aparecem diretamente no programa, como por exemplo:
12
1.2
"Olá Mundo"
"Oi"
true
false
/javascript/gi
null
Identificadores e palavras reservadas
Um identificador pode ser qualquer nome. Em JavaScript, esses identificadores podem ser usados para nomear variáveis e funções, bem como para fornecer rótulos para certos laços de código. Exemplo de idenficadores válidos:
i
my_variable_name
v13
_dummy
$str
Os dígitos não são permitidos como primeiro caractere.
Por padrão, utilizam-se apenas letras e dígitos ASCII, embora o JavaScript permita o uso de qualquer letra e dígito dos caracteres Unicode. Dessa forma, o JavaScript possibilita que os programadores utilizem símbolos matemáticos, como, por exemplo:
var π = 3.14;
Palavras reservadas
Alguns desses identificadores são reservados para uso interno do JavaScript, ou seja, não podemos atribuir variáveis ou funções com o mesmo conjunto de caracteres. Por Exemplo:
- break
- case
- catch
- continue
- debugger
- default
- delete
- do
- else
- false
- finally
- for
- function
- if
- in
- instanceof
- new
- null
- return
- switch
- this
- throw
- true
- typeof
- var
- void
- while
- with
Para dificultar ainda mais, alguns identificadores são reservados para o modo restrito,Mas permanecem utilizáveis no modo 'normal'. Por exemplo:
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
O modo restrito também impõe restrições sobre o uso dos identificadores a seguir:
- arguments
- eval
Além disso, o JavaScript predefine diversas variáveis e funções globais:
- Array
- Boolean
- Date
- Error
- EvalError
- Function
- Infinity
- JSON
- Math
- NaN
- Number
- Object
- RangeError
- ReferenceError
- RegExp
- SyntaxError
- TypeError
- URIError
- arguments
- decodeURI
- decodeURIComponent
- encodeURI
- encodeURIComponent
- eval
- isFinite
- isNaN
- parseFloat
- parseInt
- undefined
- String
Pontos e vírgulas opcionais
O JavaScript utliza ponto e virgula (;) para separar instruções. Por exemplo:
a = 3;
b = 4;
Por estarem em linhas diferentes, o uso da vírgula acaba sendo opcional, mas ainda assim recomendado.
Já neste codigo:
a = 3; b = 4;
O uso da vírgula é obrigatório.
Existem duas exceções à regra geral de que JavaScript interpreta quebras de linha como pontos e vírgulas quando não consegue analisar a segunda linha como uma continuação da instrução da primeira linha. Por exemplo:
return
true;
JavaScript presume que você quis dizer:
return; true;
Contudo, você provavelmente quis dizer:
return true;
Isso significa que não se deve inserir uma quebra de linha entre return, break ou continue e a expressão que vem após a palavra-chave.
A segunda exceção envolve os operadores ++ e −−. por exemplo:
x
++
y
Ele é analisado como x; ++y; e não como x++; y.
Usei como referência o livro: JavaScript: O Guia Definitivo.
Ótimo conteúdo. Cobriu bastante o assunto.
Não sei se já viu esse caso aqui:
x = [0, 1, 4, 6, 19]
y = 0;
x[y++]
Nesse primeiro caso, o x[y++]
retorna 0, pois primeiro ele fez x[y]
e depois ele fez y= y+1
.
Já nesse outro caso:
x = [0, 1, 4, 6, 19]
y = 0;
x[++y]
Agora o retorno de x[y++]
é 1, pois primeiro ele fez y=y+1
e depois, com o resultado de y=1
, ele faz x[y]
.
Existem identificadores que não são mais usados, mas ainda sim o JavaScript reserva seu conjunto de caracteres.
Peraí, class
, const
e os outros desta lista são usados sim. A exceção é o enum
, que de fato está "reservado para uso futuro". Mas é perfeitamente possível usar class
, const
e os demais.
Isso está bem descrito na documentação e também na especificação da linguagem:
ReservedWord :: one of await break case catch class const continue debugger default delete do else enum export extends false finally for function if import in instanceof new null return super switch this throw true try typeof var void while with yield
enum is not currently used as a keyword in this specification. It is a future reserved word, set aside for use as a keyword in future language extensions.