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.