JavaScript
Paradigma | orientado a eventos , funcional , imperativo |
---|---|
Projetado por | Brendan Eich da Netscape inicialmente; outros também contribuíram para o padrão ECMAScript |
Apareceu pela primeira vez | 4 de dezembro de 1995 [1] |
Versão estável | |
Versão de visualização | |
Disciplina de digitação | Dinâmico , fraco , pato |
Extensões de nome de arquivo |
|
Local na rede Internet | www |
Implementações principais | |
V8 , JavaScriptCore , SpiderMonkey , Chakra | |
Influenciado por | |
Java , [5] [6] Esquema , [6] AWK , [7] HyperTalk [8] | |
Influenciado | |
TypeScript , CoffeeScript , AssemblyScript , ActionScript , Dart , Objective-J , Opa , Haxe | |
|
JavaScript ( / dʒ ɑː v do ə ˌ s k r ɪ p t / ), [9] , muitas vezes abreviado como JS , é uma linguagem de programação que está em conformidade com o ECMAScript especificação. [10] JavaScript é de alto nível , frequentemente compilado just-in-time e multiparadigma . Possui sintaxe de chaves , tipagem dinâmica , orientação a objetos baseada em protótipo e funções de primeira classe.
Junto com HTML e CSS , JavaScript é uma das principais tecnologias da World Wide Web . [11] Mais de 97% dos sites usam -no do lado do cliente para comportamento de página da web , [12] frequentemente incorporando bibliotecas de terceiros . [13] A maioria dos navegadores da web tem um mecanismo JavaScript dedicado para executar o código no dispositivo do usuário .
Como uma linguagem multiparadigma, o JavaScript oferece suporte a estilos de programação orientados a eventos , funcionais e imperativos . Possui interfaces de programação de aplicativos (APIs) para trabalhar com texto, datas, expressões regulares , estruturas de dados padrão e o Document Object Model (DOM).
O padrão ECMAScript não inclui nenhuma entrada / saída (E / S), como rede , armazenamento ou recursos gráficos . Na prática, o navegador da web ou outro sistema de tempo de execução fornece APIs JavaScript para E / S.
Os mecanismos JavaScript eram originalmente usados apenas em navegadores da web, mas agora são componentes principais de outros sistemas de software, principalmente servidores e uma variedade de aplicativos .
Embora existam semelhanças entre JavaScript e Java , incluindo o nome da linguagem, sintaxe e respectivas bibliotecas padrão , as duas linguagens são distintas e diferem muito em design.
História
Criação da Netscape
O navegador Mosaic foi lançado em 1993. Como o primeiro navegador com uma interface gráfica de usuário acessível a pessoas não técnicas, ele desempenhou um papel proeminente no rápido crescimento da nascente World Wide Web . [14] Os principais desenvolvedores do Mosaic fundaram a corporação Netscape , que lançou um navegador mais sofisticado, o Netscape Navigator , em 1994. O Navigator rapidamente se tornou o navegador mais usado. [15]
Durante esses anos de formação da Web, as páginas da Web só podiam ser estáticas, sem a capacidade de comportamento dinâmico depois que a página era carregada no navegador. Havia um desejo no crescente cenário de desenvolvimento da Web de remover essa limitação, então, em 1995, a Netscape decidiu adicionar uma linguagem de script ao Navigator. Eles seguiram duas rotas para conseguir isso: colaborar com a Sun Microsystems para incorporar a linguagem de programação Java , enquanto também contratou Brendan Eich para incorporar a linguagem Scheme . [6]
O gerenciamento da Netscape logo decidiu que a melhor opção era para Eich criar uma nova linguagem, com sintaxe semelhante a Java e menos como Scheme ou outras linguagens de script existentes. [5] [6] Embora a nova linguagem e sua implementação de interpretador fossem chamadas de LiveScript quando lançadas pela primeira vez como parte de uma versão beta do Navigator em setembro de 1995, o nome foi alterado para JavaScript para o lançamento oficial em dezembro. [6] [1] [16] Eich afirma que a sintaxe do HyperTalk e os nomes dos manipuladores influenciaram o JavaScript. [17]
A escolha do nome JavaScript causou confusão, implicando que ele está diretamente relacionado ao Java. Já que Java era a nova linguagem de programação quente na época, isso foi caracterizado como uma jogada de marketing da Netscape para dar seu próprio cachet de nova linguagem. [18]
Adopção pela Microsoft
A Microsoft estreou o Internet Explorer em 1995, levando a uma guerra de navegadores com o Netscape. No front do JavaScript, a Microsoft fez a engenharia reversa do interpretador Navigator para criar o seu próprio, chamado JScript .
JScript foi lançado pela primeira vez em 1996, junto com o suporte inicial para CSS e extensões para HTML . Cada uma dessas implementações era visivelmente diferente de suas contrapartes no Navigator. [19] [20] Essas diferenças dificultaram para os desenvolvedores fazerem seus sites funcionarem bem em ambos os navegadores, levando ao uso generalizado dos logotipos "melhor visualizado no Netscape" e "melhor visualizado no Internet Explorer" por vários anos. [19] [21]
A ascensão do JScript
Em novembro de 1996, a Netscape submeteu o JavaScript à Ecma International , como ponto de partida para uma especificação padrão que todos os fornecedores de navegadores poderiam seguir. Isso levou ao lançamento oficial da primeira especificação de linguagem ECMAScript em junho de 1997.
O processo de padronização continuou por alguns anos, com o lançamento do ECMAScript 2 em junho de 1998 e do ECMAScript 3 em dezembro de 1999. O trabalho no ECMAScript 4 começou em 2000.
Enquanto isso, a Microsoft conquistou uma posição cada vez mais dominante no mercado de navegadores. No início dos anos 2000, a participação de mercado do Internet Explorer atingiu 95%. [22] Isso significa que o JScript se tornou o padrão de fato para scripts do lado do cliente na Web.
A Microsoft participou inicialmente do processo de padronização e implementou algumas propostas em sua linguagem JScript, mas eventualmente parou de colaborar no trabalho da Ecma. Assim, o ECMAScript 4 foi desativado.
Crescimento e padronização
Durante o período de domínio do Internet Explorer no início dos anos 2000, os scripts do lado do cliente estavam estagnados. Isso começou a mudar em 2004, quando o sucessor do Netscape, o Mozilla , lançou o navegador Firefox . O Firefox foi bem recebido por muitos, conquistando uma fatia de mercado significativa do Internet Explorer. [23]
Em 2005, a Mozilla ingressou na ECMA International e o trabalho começou no padrão ECMAScript for XML (E4X). Isso levou a Mozilla a trabalhar em conjunto com a Macromedia (posteriormente adquirida pela Adobe Systems ), que estava implementando o E4X em sua linguagem ActionScript 3, que era baseada em um ECMAScript 4 draft. O objetivo passou a ser padronizar o ActionScript 3 como o novo ECMAScript 4. Para esse fim, a Adobe Systems lançou a implementação do Tamarin como um projeto de código aberto . No entanto, Tamarin e ActionScript 3 eram muito diferentes dos scripts do lado do cliente estabelecidos e, sem a cooperação da Microsoft , o ECMAScript 4 nunca se concretizou.
Enquanto isso, desenvolvimentos muito importantes estavam ocorrendo em comunidades de código aberto não afiliadas ao trabalho da ECMA. Em 2005, Jesse James Garrett lançou um white paper no qual cunhou o termo Ajax e descreveu um conjunto de tecnologias, das quais o JavaScript era o backbone, para criar aplicativos da web onde os dados podem ser carregados em segundo plano, evitando a necessidade de página inteira recarrega. Isso deu início a um período de renascimento do JavaScript, liderado por bibliotecas de código aberto e as comunidades que se formaram em torno delas. Muitas novas bibliotecas foram criadas, incluindo jQuery , Prototype , Dojo Toolkit e MooTools .
O Google estreou seu navegador Chrome em 2008, com o motor V8 JavaScript mais rápido que seus concorrentes. [24] [25] A principal inovação foi a compilação just-in-time (JIT), [26] então outros fornecedores de navegadores precisaram revisar seus motores para JIT. [27]
Em julho de 2008, essas partes díspares se reuniram para uma conferência em Oslo . Isso levou a um eventual acordo no início de 2009 para combinar todo o trabalho relevante e levar o idioma adiante. O resultado foi o padrão ECMAScript 5, lançado em dezembro de 2009.
Server-side JavaScript e Node.js
Em 2009, Ryan Dahl lançou a primeira versão do Node.js , que combinava o motor V8 do Google, um loop de eventos e uma API de I / O de baixo nível [28] para fornecer um ambiente de programação JavaScript baseado em eventos e do lado do servidor completo. Isso simplificou o compartilhamento de dados entre o código do lado do cliente e do servidor, permitindo que os desenvolvedores da Web com experiência em JavaScript do lado do cliente transferissem suas habilidades para o desenvolvimento do lado do servidor. [29] Isso eventualmente resultou em uma comunidade de vários milhões de desenvolvedores [30] , bem como no npm , o maior registro de pacotes de software do mundo. [31]
Atingir a maturidade
O trabalho ambicioso na linguagem continuou por vários anos, culminando com uma extensa coleção de adições e refinamentos sendo formalizados com a publicação do ECMAScript 6 em 2015. [32]
A especificação preliminar é mantida abertamente no GitHub , e as edições ECMAScript são produzidas por meio de instantâneos anuais regulares. [33] As possíveis revisões do idioma são examinadas por meio de um processo de proposta abrangente. [34] [35] Agora, em vez de números de edição, os desenvolvedores verificam o status dos próximos recursos individualmente. [33]
O ecossistema JavaScript atual tem muitas bibliotecas e estruturas , práticas de programação estabelecidas e maior uso de JavaScript fora dos navegadores da web. Além disso, com o aumento de aplicativos de página única e outros sites pesados em JavaScript, vários transpiladores foram criados para auxiliar o processo de desenvolvimento. [36]
Marca Registrada
"JavaScript" é uma marca comercial da Oracle Corporation nos Estados Unidos. [37] [38]
Uso do lado do cliente do site
JavaScript é a linguagem de script do lado do cliente dominante na Web, com 97% dos sites usando-o para essa finalidade. [12] Scripts são embutidos ou incluídos em documentos HTML e interagem com o DOM . A maioria dos navegadores da web, incluindo a grande maioria dos navegadores do Android e todos os navegadores do iPad, tem um mecanismo JavaScript integrado que executa o código no dispositivo do usuário.
Exemplos de comportamento guião
- Carregar o novo conteúdo da página da web sem recarregar a página, via Ajax ou um WebSocket . Por exemplo, os usuários de mídia social podem enviar e receber mensagens sem sair da página atual.
- Animações de página da Web, como o aparecimento e desaparecimento de objetos, redimensionamento e movimentação.
- Jogar jogos de navegador .
- Controlando a reprodução de mídia de streaming .
- Gerando anúncios pop-up .
- Validar os valores de entrada de um formulário da web antes que os dados sejam enviados a um servidor da web .
- Registrar dados sobre o comportamento do usuário e enviá-los a um servidor. O proprietário do site pode usar esses dados para análises , rastreamento de anúncios e personalização .
- Redirecionando um usuário para outra página.
Bibliotecas e frameworks
Mais de 80% dos sites usam uma biblioteca JavaScript de terceiros ou estrutura da web para seus scripts do lado do cliente. [13]
jQuery é de longe a biblioteca mais popular, usada por mais de 75% dos sites. [13] O Facebook criou a biblioteca React para seu site e mais tarde a lançou como código aberto ; outros sites, incluindo o Twitter , agora o usam. Da mesma forma, a estrutura Angular criada pelo Google para seus sites, incluindo YouTube e Gmail , agora é um projeto de código aberto usado por terceiros. [13]
Em contraste, o termo "Vanilla JS" foi cunhado para sites que não usam nenhuma biblioteca ou estrutura, em vez disso, contam inteiramente com a funcionalidade JavaScript padrão. [39]
Outro uso
O uso de JavaScript se expandiu além das raízes do navegador da web . Os mecanismos JavaScript agora estão incorporados em uma variedade de outros sistemas de software, tanto para implantações de sites do lado do servidor quanto para aplicativos sem navegador .
As tentativas iniciais de promover o uso de JavaScript no lado do servidor foram o Netscape Enterprise Server e o Internet Information Services da Microsoft , [40] [41] mas eram pequenos nichos. [42] O uso do lado do servidor finalmente começou a crescer no final dos anos 2000, com a criação do Node.js e outras abordagens . [42]
Electron , Cordova , React Native e outras estruturas de aplicativos foram usadas para criar muitos aplicativos com comportamento implementado em JavaScript. Outros aplicativos que não são do navegador incluem suporte do Adobe Acrobat para scripts de documentos PDF [43] e extensões GNOME Shell escritas em JavaScript. [44]
O JavaScript começou a aparecer recentemente em alguns sistemas embarcados , geralmente aproveitando o Node.js. [45] [46] [47]
Características
Os recursos a seguir são comuns a todas as implementações ECMAScript em conformidade, a menos que seja explicitamente especificado de outra forma.
Imperativo e estruturado
JavaScript suporta grande parte da sintaxe de programação estruturada de C (por exemplo, if
instruções, while
loops, switch
instruções, do while
loops, etc.). Uma exceção parcial é o escopo : originalmente, o JavaScript só tinha o escopo de função com var
; em seguida, o escopo do bloco foi adicionado no ECMAScript 2015 com as palavras let
- chave e const
. Como C, JavaScript faz uma distinção entre expressões e instruções . Uma diferença sintática de C é a inserção automática de ponto-e-vírgula , que permite que pontos-e-vírgulas (que encerram as instruções) sejam omitidos. [48]
Fracamente tipado
JavaScript é fracamente tipado , o que significa que certos tipos são implicitamente convertidos dependendo da operação usada. [49]
- O
+
operador binário converte ambos os operandos em uma string, a menos que ambos sejam números. Isso ocorre porque o operador de adição também funciona como um operador de concatenação - O
-
operador binário sempre converte ambos os operandos em um número - Ambos os operadores unários (
+
,-
) sempre convertem o operando em um número
Os valores são convertidos em strings como o seguinte: [49]
- Strings são deixadas como estão
- Os números são convertidos para sua representação em string
- As matrizes têm seus elementos convertidos em strings, após as quais são unidos por vírgulas (
,
) - Outros objetos são convertidos para a string
[object Object]
ondeObject
é o nome do construtor do objeto
Os valores são convertidos em números, convertendo em strings e, em seguida, convertendo as strings em números. Esses processos podem ser modificados definindo toString
e valueOf
funções no protótipo para string e número de conversão, respectivamente.
JavaScript tem recebido críticas pela maneira como implementa essas conversões, pois a complexidade das regras pode ser confundida com inconsistência. [50] [49] Por exemplo, ao adicionar um número a uma string, o número será convertido em uma string antes de realizar a concatenação, mas ao subtrair um número de uma string, a string é convertida em um número antes de realizar a subtração.
operando esquerdo | operador | operando certo | resultado |
---|---|---|---|
[] (array vazio)
|
+
|
[] (array vazio)
|
"" (string vazia)
|
[] (array vazio)
|
+
|
{} (objeto vazio)
|
"[object Object]" (fragmento)
|
false (boleano)
|
+
|
[] (array vazio)
|
"false" (fragmento)
|
"123" (fragmento)
|
+
|
1 (número)
|
"1231" (fragmento)
|
"123" (fragmento)
|
-
|
1 (número)
|
122 (número)
|
Freqüentemente, também mencionado {} + []
resulta em 0
(número). Isso é enganoso: o {}
é interpretado como um bloco de código vazio em vez de um objeto vazio, e a matriz vazia é convertida em um número pelo +
operador unário restante . Se você envolver a expressão entre parênteses, ({} + [])
as chaves são interpretadas como um objeto vazio e o resultado da expressão é "[object Object]"
o esperado. [49]
Dinâmico
- Digitando
- JavaScript é dinamicamente tipado como a maioria das outras linguagens de script . Um tipo está associado a um valor em vez de uma expressão. Por exemplo, uma variável inicialmente ligada a um número pode ser reatribuída a uma string . [51] JavaScript suporta várias maneiras de testar o tipo de objetos, incluindo a digitação de pato . [52]
- Avaliação de tempo de execução
- JavaScript inclui uma
eval
função que pode executar instruções fornecidas como strings em tempo de execução.
Orientação a objetos (com base em protótipo)
A herança prototípica em JavaScript é descrita por Douglas Crockford como:
Você faz objetos de protótipo e então… cria novas instâncias. Os objetos são mutáveis em JavaScript, então podemos aumentar as novas instâncias, dando-lhes novos campos e métodos. Estes podem atuar como protótipos para objetos ainda mais recentes. Não precisamos de classes para fazer muitos objetos semelhantes ... Objetos herdam de objetos. O que poderia ser mais orientado a objetos do que isso? [53]
Em JavaScript, um objeto é uma matriz associativa , aumentada com um protótipo (veja abaixo); cada chave fornece o nome de uma propriedade de objeto e há duas maneiras sintáticas de especificar esse nome: notação de ponto ( obj.x = 10
) e notação de colchetes ( obj['x'] = 10
). Uma propriedade pode ser adicionada, rebote ou excluída em tempo de execução. A maioria das propriedades de um objeto (e qualquer propriedade que pertença à cadeia de herança de protótipo de um objeto) pode ser enumerada usando um for...in
loop.
- Protótipos
- JavaScript usa protótipos onde muitas outras linguagens orientadas a objetos usam classes para herança . [54] É possível simular muitos recursos baseados em classe com protótipos em JavaScript. [55]
- Funciona como construtores de objetos
- As funções funcionam também como construtores de objetos, junto com sua função típica. Prefixar uma chamada de função com new criará uma instância de um protótipo, herdando propriedades e métodos do construtor (incluindo propriedades do
Object
protótipo). [56] ECMAScript 5 oferece oObject.create
método, permitindo a criação explícita de uma instância sem herdar automaticamente doObject
protótipo (ambientes mais antigos podem atribuir o protótiponull
). [57] Aprototype
propriedade do construtor determina o objeto usado para o protótipo interno do novo objeto. Novos métodos podem ser adicionados modificando o protótipo da função usada como construtor. Construtores integrados do JavaScript, comoArray
ouObject
, também têm protótipos que podem ser modificados. Embora seja possível modificar oObject
protótipo, geralmente é considerado uma prática ruim porque a maioria dos objetos em JavaScript herdará métodos e propriedades doObject
protótipo e eles podem não esperar que o protótipo seja modificado. [58] - Funções como métodos
- Ao contrário de muitas linguagens orientadas a objetos, não há distinção entre uma definição de função e uma definição de método . Em vez disso, a distinção ocorre durante a chamada de função; quando uma função é chamada como um método de um objeto, o local da função, esta palavra-chave, é vinculado a esse objeto para essa invocação.
Funcional
Uma função é de primeira classe ; uma função é considerada um objeto. Como tal, uma função pode ter propriedades e métodos, como .call()
e .bind()
. [59] Uma função aninhada é uma função definida dentro de outra função. Ele é criado sempre que a função externa é chamada. Além disso, cada função aninhada forma um fechamento léxico : o escopo léxico da função externa (incluindo qualquer constante, variável local ou valor de argumento) torna-se parte do estado interno de cada objeto de função interna, mesmo após a conclusão da execução da função externa . [60] JavaScript também suporta funções anônimas .
Delegativo
JavaScript oferece suporte à delegação implícita e explícita .
- Funções como papéis (traços e mixins)
- JavaScript suporta nativamente várias implementações baseadas em funções de padrões de papéis [61] como Traits [62] [63] e Mixins . [64] Tal função define o comportamento adicional por pelo menos um método vinculado à
this
palavra - chave dentro de seufunction
corpo. Uma função, então, deve ser delegada explicitamente por meio decall
ouapply
para objetos que precisam apresentar comportamento adicional que não é compartilhado por meio da cadeia de protótipo. - Composição e herança de objetos
- Enquanto a delegação baseada em função explícita cobre a composição em JavaScript, a delegação implícita já acontece toda vez que a cadeia de protótipos é percorrida para, por exemplo, encontrar um método que pode estar relacionado, mas não é propriedade direta de um objeto. Uma vez que o método é encontrado, ele é chamado dentro do contexto deste objeto. Assim, a herança em JavaScript é coberta por um automatismo de delegação que está vinculado à propriedade de protótipo das funções do construtor.
Diversos
JS é uma linguagem de índice zero .
- Ambiente de execução
- JavaScript normalmente depende de um ambiente de tempo de execução (por exemplo, um navegador da web ) para fornecer objetos e métodos pelos quais os scripts podem interagir com o ambiente (por exemplo, um DOM de página da web ). Esses ambientes são de thread único . JavaScript também depende do ambiente de tempo de execução para fornecer a capacidade de incluir / importar scripts (por exemplo, elementos HTML
<script>
). Este não é um recurso de linguagem em si, mas é comum na maioria das implementações de JavaScript. JavaScript processa mensagens de uma fila, uma de cada vez. JavaScript chama uma função associada a cada nova mensagem, criando um quadro de pilha de chamadas com os argumentos da funçãoe variáveis locais . A pilha de chamadas diminui e aumenta com base nas necessidades da função. Quando a pilha de chamadas está vazia após a conclusão da função, o JavaScript prossegue para a próxima mensagem na fila. Isso é chamado de loop de evento , descrito como "executar até a conclusão" porque cada mensagem é totalmente processada antes que a próxima mensagem seja considerada. No entanto, o modelo de simultaneidade da linguagem descreve o loop de eventos como sem bloqueio : a entrada / saída do programa é realizada usando eventos e funções de retorno de chamada . Isso significa, por exemplo, que o JavaScript pode processar um clique do mouse enquanto espera que uma consulta ao banco de dados retorne informações. [65]
- Funções variáveis
- Um número indefinido de parâmetros pode ser passado para uma função. A função pode acessá-los por meio de parâmetros formais e também por meio do
arguments
objeto local . Funções variáveis também podem ser criadas usando obind
método.
- Literais de matriz e objeto
- Como muitas linguagens de script, arrays e objetos ( arrays associativos em outras linguagens) podem ser criados com uma sintaxe de atalho sucinta. Na verdade, esses literais formam a base do formato de dados JSON .
- Expressões regulares
- JavaScript também oferece suporte a expressões regulares de maneira semelhante ao Perl , que fornece uma sintaxe concisa e poderosa para manipulação de texto que é mais sofisticada do que as funções de string integradas. [66]
- Promessas
- JavaScript também suporta promessas, que são uma forma de lidar com operações assíncronas. Há um objeto Promise embutido que dá acesso a várias funcionalidades para lidar com promessas e define como elas devem ser feitas. Ele permite associar manipuladores a um eventual valor de sucesso ou motivo de falha de uma ação assíncrona. Isso permite que os métodos assíncronos retornem valores como os métodos síncronos: em vez de retornar imediatamente o valor final, o método assíncrono retorna uma promessa de fornecer o valor em algum ponto no futuro. Recentemente, métodos combinatórios foram introduzidos na especificação do JavaScript, o que permite aos desenvolvedores combinar várias promessas do JavaScript e fazer operações com base em diferentes cenários. Os métodos introduzidos são: Promise.race, Promise.all, Promise.allSettled e Promise.any.
Extensões específicas do fornecedor
Historicamente, alguns mecanismos JavaScript suportavam esses recursos não padrão:
catch
cláusulas condicionais (como Java)- compreensões de array e expressões geradoras (como Python)
- expressões de função concisas (
function(args) expr
; esta sintaxe experimental funciona com setas anteriores) - ECMAScript para XML (E4X), uma extensão que adiciona suporte XML nativo ao ECMAScript (não suportado no Firefox desde a versão 21 [67] )
Sintaxe
Exemplos simples
Variáveis em JavaScript podem ser definidas usando as palavras-chave var
, [68] let
[69] ou const
[70] .
// Declara uma variável com escopo de função chamada `x`, e atribui implicitamente o
// valor especial` undefined` a ela. Variáveis sem valor são automaticamente
// definidas como indefinidas.
var x ;
// Variáveis podem ser definidas manualmente para `undefined` assim
var x2 = undefined ;
// Declara uma variável com escopo de bloco chamada `y`, e a define implicitamente como
//` undefined`. A palavra-chave `let` foi introduzida no ECMAScript 2015.
let y ;
// Declara uma variável com escopo de bloco e não reatribuível chamada `z`, e a define como
// um literal de string. A palavra-chave `const` também foi introduzida no ECMAScript 2015,
// e deve ser explicitamente atribuída a.
// A palavra-chave `const` significa constante, portanto, a variável não pode ser reatribuída
// pois o valor
é` constante`. const z = "este valor não pode ser reatribuído!" ;
// Declara uma variável chamada `myNumber` e atribui um literal de número (o valor
//` 2`) a ela.
deixe meuNumero = 2 ;
// Reatribui `myNumber`, configurando-o para uma string literal (o valor` "foo" `).
// JavaScript é uma linguagem tipada dinamicamente, então isso é legal.
meuNumero = "foo" ;
Observe os comentários no exemplo acima, todos precedidos por duas barras .
Não há funcionalidade de entrada / saída integrada em JavaScript; o ambiente de tempo de execução fornece isso. A especificação ECMAScript na edição 5.1 menciona: [71]
na verdade, não há disposições nesta especificação para entrada de dados externos ou saída de resultados calculados.
No entanto, a maioria dos ambientes de execução tem um console
objeto [72] que pode ser usado para imprimir a saída. Aqui está um programa Hello World minimalista em JavaScript:
console . log ( "Olá, mundo!" );
Uma função recursiva simples :
função fatorial ( n ) {
if ( n === 0 )
return 1 ; // 0! = 1
retornar n * fatorial ( n - 1 );
}
fatorial ( 3 ); // retorna 6
Uma função anônima (ou lambda):
contador de função () {
deixar contar = 0 ;
função de retorno () {
retornar ++ contagem ;
};
}
deixe fechamento = contador ();
fechamento (); // retorna 1
closure (); // retorna 2
closure (); // retorna 3
Este exemplo mostra que, em JavaScript, encerramentos de função capturam suas variáveis não locais por referência.
As funções de seta foram introduzidas pela primeira vez na 6ª Edição - ECMAScript 2015 . Eles encurtam a sintaxe para escrever funções em JavaScript. As funções das setas são anônimas por natureza; uma variável é necessária para se referir a eles a fim de invocá-los após sua criação.
Exemplo de função de seta:
// As funções de seta nos permitem omitir a palavra-chave `function`.
// Aqui, `long_example` aponta para um valor de função anônima.
const long_example = ( input1 , input2 ) => {
console . log ( "Olá, mundo!" );
saída const = entrada1 + entrada2 ;
saída de retorno ;
};
// Se não houver colchetes, a função de seta simplesmente retorna a expressão
// Então aqui está (input1 + input2)
const short_example = ( input1 , input2 ) => input1 + input2 ;
long_example ( 2 , 3 ); // Imprime "Hello, World!" e retorna 5
exemplo_curto ( 2 , 5 ); // Retorna 7
// Se uma função de seta tiver apenas um parâmetro, os parênteses podem ser removidos.
const no_parentheses = input => input + 2 ;
no_parentheses ( 3 ); // Retorna 5
Em JavaScript, os objetos são criados da mesma maneira que as funções; isso é conhecido como um objeto de função .
Exemplo de objeto:
função Ball ( r ) {
this . raio = r ; // o argumento "r" é local para o objeto bola
this . área = matemática . PI * ( r ** 2 ); // parênteses não fazem nada além de esclarecer
// objetos podem conter funções ("método")
isso . show = function () {
drawCircle ( this . radius ); // faz referência a outra função (que desenha um círculo)
};
}
deixe minhaBola = nova Bola ( 5 ); // cria uma nova instância do objeto bola com raio 5
myBall . radius ++ ; // as propriedades do objeto geralmente podem ser modificadas de fora de
myBall . show (); // usando a função herdada "show"
Demonstração da função variável ( arguments
é uma variável especial ): [73]
função sum () {
deixe x = 0 ;
para ( seja i = 0 ; i < argumentos . comprimento ; ++ i )
x + = argumentos [ i ];
return x ;
}
soma ( 1 , 2 ); // retorna 3
sum ( 1 , 2 , 3 ); // retorna 6
Expressões de função imediatamente invocadas são freqüentemente usadas para criar fechamentos. Os fechamentos permitem reunir propriedades e métodos em um namespace e torná-los privados:
let counter = ( function () {
let i = 0 ; // propriedade privada
return { // métodos públicos
get : function () {
alert ( i );
},
definir : função ( valor ) {
i = valor ;
},
incremento : function () {
alert ( ++ i );
}
};
}) (); // módulo
contador . get (); // mostra 0
contador . conjunto ( 6 );
contador . incremento (); // mostra 7
contadores . incremento (); // mostra 8
Exportando e importando módulos em JavaScript [74]
Exemplo de exportação:
/ * mymodule.js * /
// Esta função permanece privada, pois não é exportada
let sum = ( a , b ) => {
return a + b ;
}
// Exportar variáveis
export let name = 'Alice' ;
idade de locação de exportação = 23 ;
// Exportar funções nomeadas
exportar função add ( num1 , num2 ) {
return num1 + num2 ;
}
// Exportar classe
exportar classe Multiplicação {
construtor ( num1 , num2 ) {
this . num1 = num1 ;
isso . num2 = num2 ;
}
add () {
return sum ( this . num1 , this . num2 );
}
}
Exemplo de importação:
// Importar uma
importação de propriedade { add } de './mymodule.js' ;
console . log ( adicionar ( 1 , 2 )); // 3
// Importar propriedades múltiplas
import { name , age } from './mymodule.js' ;
console . log ( nome , idade );
//> "Alice", 23
// Importar todas as propriedades de uma
importação de módulo * do console './module.js'
. log ( nome , idade ); //> "Alice", 23 console . log ( adicionar ( 1 , 2 )); //> 3
Exemplo mais avançado
Este código de amostra exibe vários recursos de JavaScript.
/ * Encontra o menor múltiplo comum (LCM) de dois números * /
função LCMCalculator ( x , y ) { // função do construtor
let checkInt = function ( x ) { // função interna
if ( x % 1 ! == 0 )
jogar new TypeError ( x + "não é um inteiro" ); // var a = mouseX
return x ;
};
isso . a = checkInt ( x )
// semicolons ^^^^ são opcionais, uma nova linha é suficiente
este . b = checkInt ( y );
}
// O protótipo de instâncias de objeto criadas por um construtor é
// a propriedade "protótipo" desse construtor.
LCMCalculator . prototype = { //
construtor literal do objeto : LCMCalculator , // ao reatribuir um protótipo, defina a propriedade do construtor apropriadamente
gcd : function () { // método que calcula o maior divisor comum
// algoritmo euclidiano:
let a = Math . abs ( este . a ), b = Matemática . abs ( este . b ), t ;
if ( a < b ) {
// variáveis de troca
// t = b; b = a; a = t;
[ a , b ] = [ b , a ]; // troca usando atribuição de desestruturação (ES6)
}
enquanto ( b ! == 0 ) {
t = b ;
b = a % b ;
a = t ;
}
// Só precisa calcular o GCD uma vez, então "redefina" este método.
// (Na verdade, não é redefinição - é definido na própria instância,
// para que this.gcd se refira a esta "redefinição" em vez de LCMCalculator.prototype.gcd.
// Observe que isso leva a um resultado errado se os membros do objeto LCMCalculator "a" e / ou "b" são alterados posteriormente.)
// Além disso, 'gcd' === "gcd", this ['gcd'] === this.gcd
this [ 'gcd' ] = function () {
return a ;
};
return a ;
},
// Os nomes das propriedades do objeto podem ser especificados por strings delimitadas por aspas duplas (") ou simples (').
Lcm : function () {
// Os nomes das variáveis não colidem com as propriedades do objeto, por exemplo, | lcm | não é | isso. lcm |.
// não usando | this.a * this.b | para evitar problemas de precisão do FP,
deixe lcm = this . a / this . gcd () * this . b ;
// Só precisa calcular lcm uma vez, então "redefina" este método.
isso . lcm = função () {
lcm de retorno ; };
return lcm ;
},
toString : function () {
return "LCMCalculator: a =" + this . a + ", b =" + isso . b ;
}
};
// Definir função de saída genérica; esta implementação só funciona para
saída de função de navegadores da Web ( x ) { documento . corpo . appendChild ( document . createTextNode ( x )); documento . corpo . appendChild ( document . createElement ( 'br' )); }
// Observação: map () e forEach () da matriz são definidos em JavaScript 1.6.
// Eles são usados aqui para demonstrar a natureza funcional inerente do JavaScript.
[
[ 25 , 55 ],
[ 21 , 56 ],
[ 22 , 58 ],
[ 28 , 56 ]
]. map ( function ( pair ) { // array literal + função de mapeamento
return new LCMCalculator ( pair [ 0 ], pair [ 1 ]);
}).sort (( a , b ) => a . lcm () - b . lcm ()) // classificar com esta função comparativa; => é uma forma abreviada de uma função, chamada "função de seta"
. forEach ( printResult );
função printResult ( obj ) {
output ( obj + ", gcd =" + obj . gcd () + ", lcm =" + obj . lcm ());
}
A seguinte saída deve ser exibida na janela do navegador.
LCMCalculator: a = 28, b = 56, gcd = 28, lcm = 56
LCMCalculator: a = 21, b = 56, gcd = 7, lcm = 168
LCMCalculator: a = 25, b = 55, gcd = 5, lcm = 275
LCMCalculator: a = 22, b = 58, gcd = 2, lcm = 638
Segurança
JavaScript e o DOM fornecem o potencial para autores mal-intencionados entregarem scripts para serem executados em um computador cliente através da web. Os autores do navegador minimizam esse risco usando duas restrições. Primeiro, os scripts são executados em uma caixa de proteção na qual podem realizar apenas ações relacionadas à Web, não tarefas de programação de propósito geral, como a criação de arquivos. Em segundo lugar, os scripts são restringidos pela política de mesma origem : os scripts de um site da Web não têm acesso a informações como nomes de usuário, senhas ou cookies enviados a outro site. A maioria dos bugs de segurança relacionados ao JavaScript são violações da política de mesma origem ou da sandbox.
Existem subconjuntos de JavaScript geral - ADsafe, Secure ECMAScript (SES) - que fornecem maiores níveis de segurança, especialmente em código criado por terceiros (como anúncios). [75] [76] O Closure Toolkit é outro projeto para incorporação e isolamento seguros de JavaScript e HTML de terceiros. [77]
A Política de Segurança de Conteúdo é o principal método pretendido para garantir que apenas o código confiável seja executado em uma página da web.
Vulnerabilidades cross-site
Um problema comum de segurança relacionado ao JavaScript é o cross-site scripting (XSS), uma violação da política de mesma origem . As vulnerabilidades de XSS ocorrem quando um invasor consegue fazer com que um site de destino, como um site de banco online, inclua um script malicioso na página apresentada à vítima. O script neste exemplo pode acessar o aplicativo bancário com os privilégios da vítima, potencialmente divulgando informações secretas ou transferindo dinheiro sem a autorização da vítima. Uma solução para vulnerabilidades XSS é usar HTML escaping sempre que exibir dados não confiáveis.
Alguns navegadores incluem proteção parcial contra ataques XSS refletidos , nos quais o invasor fornece um URL incluindo script malicioso. No entanto, mesmo os usuários desses navegadores são vulneráveis a outros ataques XSS, como aqueles em que o código malicioso é armazenado em um banco de dados. Apenas o design correto de aplicativos da Web no lado do servidor pode impedir totalmente o XSS.
Vulnerabilidades de XSS também podem ocorrer devido a erros de implementação pelos autores do navegador. [78]
Outra vulnerabilidade entre sites é a falsificação de solicitação entre sites (CSRF). No CSRF, o código no site de um invasor engana o navegador da vítima e faz com que ele execute ações que o usuário não pretendia no site de destino (como transferir dinheiro em um banco). Quando os sites de destino dependem exclusivamente de cookies para autenticação de solicitação, as solicitações originadas do código do site do invasor podem ter as mesmas credenciais de login válidas do usuário inicial. Em geral, a solução para o CSRF é exigir um valor de autenticação em um campo de formulário oculto, e não apenas nos cookies, para autenticar qualquer solicitação que possa ter efeitos duradouros. Verificar o cabeçalho HTTP Referrer também pode ajudar.
"JavaScript hijacking" é um tipo de ataque CSRF no qual uma <script>
tag no site de um invasor explora uma página no site da vítima que retorna informações privadas, como JSON ou JavaScript. As soluções possíveis incluem:
- exigindo um token de autenticação nos parâmetros POST e GET para qualquer resposta que retorne informações privadas.
Confiança equivocada no cliente
Os desenvolvedores de aplicativos cliente-servidor devem reconhecer que clientes não confiáveis podem estar sob o controle de invasores. O autor do aplicativo não pode presumir que seu código JavaScript será executado conforme pretendido (ou de todo) porque qualquer segredo incorporado no código pode ser extraído por um determinado adversário. Algumas implicações são:
- Os autores de sites não podem esconder perfeitamente como seu JavaScript opera porque o código-fonte bruto deve ser enviado ao cliente. O código pode ser ofuscado , mas a ofuscação pode ser submetida a engenharia reversa.
- A validação do formulário JavaScript fornece apenas conveniência para os usuários, não segurança. Se um site verifica se o usuário concordou com seus termos de serviço, ou filtra caracteres inválidos de campos que devem conter apenas números, deve fazê-lo no servidor, não apenas no cliente.
- Os scripts podem ser desabilitados seletivamente, portanto, não se pode confiar em JavaScript para impedir operações como clicar com o botão direito do mouse em uma imagem para salvá-la. [79]
- É considerada uma prática muito ruim incorporar informações confidenciais, como senhas, em JavaScript, porque elas podem ser extraídas por um invasor. [80]
Confiança equivocada no desenvolvedores
Os sistemas de gerenciamento de pacotes, como npm e Bower, são populares entre os desenvolvedores de JavaScript. Esses sistemas permitem que um desenvolvedor gerencie facilmente as dependências de seus programas das bibliotecas de programas de outros desenvolvedores. Os desenvolvedores confiam que os mantenedores das bibliotecas as manterão seguras e atualizadas, mas nem sempre é o caso. Uma vulnerabilidade surgiu por causa dessa confiança cega. As bibliotecas confiáveis podem ter novos lançamentos que causam o aparecimento de bugs ou vulnerabilidades em todos os programas que dependem das bibliotecas. Inversamente, uma biblioteca pode ficar sem correção com vulnerabilidades conhecidas à solta. Em um estudo feito examinando uma amostra de 133 mil sites, os pesquisadores descobriram que 37% dos sites incluíam uma biblioteca com pelo menos uma vulnerabilidade conhecida. [81]"O intervalo médio entre a versão da biblioteca mais antiga usada em cada site e a versão mais recente disponível dessa biblioteca é de 1.177 dias na ALEXA, e o desenvolvimento de algumas bibliotecas ainda em uso foi encerrado anos atrás." [81] Outra possibilidade é que o mantenedor de uma biblioteca pode removê-la completamente. Isso ocorreu em março de 2016, quando Azer Koçulu removeu seu repositório do npm . Isso fez com que dezenas de milhares de programas e sites que dependiam de suas bibliotecas quebrassem. [82] [83]
Navegador e erros de codificação do plugin
JavaScript fornece uma interface para uma ampla gama de recursos do navegador, alguns dos quais podem ter falhas, como estouro de buffer . Essas falhas podem permitir que os invasores escrevam scripts que executariam qualquer código que desejassem no sistema do usuário. Este código não está, de forma alguma, limitado a outro aplicativo JavaScript. Por exemplo, uma exploração de saturação de buffer pode permitir que um invasor obtenha acesso à API do sistema operacional com privilégios de superusuário.
Essas falhas afetaram os principais navegadores, incluindo Firefox, [84] Internet Explorer, [85] e Safari. [86]
Plug-ins, como reprodutores de vídeo, Adobe Flash e a ampla gama de controles ActiveX habilitados por padrão no Microsoft Internet Explorer, também podem ter falhas exploráveis via JavaScript (essas falhas foram exploradas no passado). [87] [88]
No Windows Vista, a Microsoft tentou conter os riscos de bugs, como estouros de buffer, executando o processo do Internet Explorer com privilégios limitados. [89] O Google Chrome confina de forma semelhante seus renderizadores de página em sua própria "caixa de areia".
Erros de implementação Sandbox
Os navegadores da Web são capazes de executar JavaScript fora da sandbox, com os privilégios necessários para, por exemplo, criar ou excluir arquivos. Esses privilégios não se destinam a ser concedidos a códigos da web.
A concessão incorreta de privilégios para JavaScript da Web tem desempenhado um papel nas vulnerabilidades tanto no Internet Explorer [90] quanto no Firefox. [91] No Windows XP Service Pack 2, a Microsoft rebaixou os privilégios do JScript no Internet Explorer. [92]
O Microsoft Windows permite que os arquivos de origem do JavaScript no disco rígido de um computador sejam iniciados como programas de uso geral, sem área restrita (consulte: Windows Script Host ). Isso torna o JavaScript (como o VBScript ) um vetor teoricamente viável para um cavalo de Tróia , embora os cavalos de Tróia JavaScript sejam incomuns na prática. [93] [ falha na verificação ]
Vulnerabilidades de hardware
Em 2015, uma implementação de prova de conceito baseada em JavaScript de um ataque de martelo de remo foi descrita em um artigo por pesquisadores de segurança. [94] [95] [96] [97]
Em 2017, um ataque baseado em JavaScript via navegador foi demonstrado que poderia contornar o ASLR . É chamado de "ASLR⊕Cache" ou AnC. [98] [99]
Em 2018, o jornal que anunciou os ataques Spectre contra a execução especulativa na Intel e outros processadores incluiu uma implementação de JavaScript. [100]
Ferramentas de desenvolvimento
Ferramentas importantes evoluíram com a linguagem.
- Todos os principais navegadores da web possuem ferramentas de desenvolvimento da web integradas , incluindo um depurador de JavaScript .
- Ferramentas de análise de programa estático , como ESLint e JSLint , varrem o código JavaScript para conformidade com um conjunto de padrões e diretrizes.
- Alguns navegadores têm perfis integrados . Bibliotecas de perfis independentes também foram criadas, como benchmark.js e jsbench. [101] [102]
- Muitos editores de texto têm suporte de realce de sintaxe para código JavaScript.
Tecnologias relacionadas
Java
Um equívoco comum é que o JavaScript é semelhante ou intimamente relacionado ao Java . É verdade que ambos têm uma sintaxe semelhante a C (a linguagem C sendo sua linguagem ancestral comum mais imediata). Eles também são normalmente colocados em sandbox (quando usados dentro de um navegador), e o JavaScript foi projetado com a sintaxe Java e a biblioteca padrão em mente. Em particular, todas as palavras-chave Java foram reservadas no JavaScript original, a biblioteca padrão do JavaScript segue as convenções de nomenclatura do Java e os JavaScript Math
e Date
objetos são baseados em classes do Java 1.0, [103] mas as semelhanças terminam aí.
Java e JavaScript apareceram pela primeira vez em 1995, mas Java foi desenvolvido por James Gosling da Sun Microsystems e JavaScript por Brendan Eich da Netscape Communications.
As diferenças entre as duas línguas são mais proeminentes do que suas semelhanças. Java possui tipagem estática , enquanto a digitação de JavaScript é dinâmica . Java é carregado a partir do bytecode compilado, enquanto o JavaScript é carregado como código-fonte legível por humanos. Os objetos do Java são baseados em classes , enquanto os do JavaScript são baseados em protótipos . Por fim, o Java não oferecia suporte à programação funcional até o Java 8, enquanto o JavaScript o fazia desde o início, sendo influenciado pelo Scheme .
JSON
JSON , ou JavaScript Object Notation, é um formato de intercâmbio de dados de propósito geral que é definido como um subconjunto da sintaxe literal do objeto JavaScript.
WebAssembly
Desde 2017, os navegadores da web têm suporte para WebAssembly , um formato binário que permite que um mecanismo JavaScript execute partes críticas de desempenho de scripts de página da web próximos à velocidade nativa. [104] O código WebAssembly é executado na mesma sandbox que o código JavaScript normal.
asm.js é um subconjunto do JavaScript que serviu como o precursor do WebAssembly. [105]
Transpilers
JavaScript é a linguagem dominante do lado do cliente na Web, e muitos sites usam muitos scripts. Assim, transpiladores foram criados para converter códigos escritos em outras linguagens, o que pode auxiliar no processo de desenvolvimento. [36]
Referências
- ^ a b Comunicado de imprensa anunciando JavaScript , "Netscape and Sun announce JavaScript", PR Newswire, 4 de dezembro de 1995
- ^ "Especificação da linguagem ECMAScript® 2021" . Junho de 2021 . Retirado em 27 de julho de 2021 .
- ^ https://tc39.es/ecma262/ ; recuperado: 27 de julho de 2021; data de publicação: 22 de julho de 2021.
- ^ "nodejs / node-eps" . GitHub . Arquivado do original em 2020-08-29 . Página visitada em 05/07/2018 .
- ^ a b Seibel, Peter (16 de setembro de 2009). Coders at Work: Reflections on the Craft of Programming . ISBN 9781430219484. Arquivado do original em 24 de dezembro de 2020 . Recuperado em 25 de dezembro de 2018 .
Eich: A preocupação imediata da Netscape era que ela se parecesse com o Java.
- ^ a b c d e "Capítulo 4. Como o JavaScript foi criado" . speakjs.com . Arquivado do original em 2020-02-27 . Página visitada em 2017-11-21 .
- ^ "Brendan Eich: Uma introdução ao JavaScript, JSConf 2010" . p. 22m. Arquivado do original em 29 de agosto de 2020 . Recuperado em 25 de novembro de 2019 .
Eich: "função", oito letras, fui influenciado pelo AWK.
- ^ Eich, Brendan (1998). "Prefácio". Em Goodman, Danny (ed.). Bíblia JavaScript (3ª ed.). John Wiley & Sons . ISBN 0-7645-3188-3. LCCN 97078208 . OCLC 38888873 . OL 712205M .
- ^ "JavaScript" . Dictionary.com . Arquivado do original em 9 de agosto de 2021 . Recuperado em 9 de agosto de 2021 .
- ^ "Especificação da linguagem ECMAScript® 2020" . Arquivado do original em 2020-05-08 . Página visitada em 2020-05-08 .
- ^ Flanagan, David. JavaScript - O guia definitivo (6 ed.). p. 1.
JavaScript é parte da tríade de tecnologias que todos os desenvolvedores da Web devem aprender: HTML para especificar o conteúdo das páginas da web, CSS para especificar a apresentação das páginas da web e JavaScript para especificar o comportamento das páginas da web.
- ^ a b "Estatísticas de uso de JavaScript como linguagem de programação do lado do cliente em sites" . w3techs.com . Arquivado do original em 2021-08-13 . Recuperado em 2021-04-09 .
- ^ a b c d "Estatísticas de uso de bibliotecas JavaScript para sites" . w3techs.com . Arquivado do original em 23/09/2018 . Recuperado em 2021-04-09 .
- ^ "Bloomberg Game Changers: Marc Andreessen" . Bloomberg. 17 de março de 2011. Arquivado do original em 16 de maio de 2012 . Recuperado em 7 de dezembro de 2011 .
- ^ Enzer, Larry (31 de agosto de 2018). "A evolução dos navegadores da Web" . Desenvolvedores da Web da Monmouth . Arquivado do original em 31 de agosto de 2018 . Recuperado em 31 de agosto de 2018 .
- ^ "TechVision: Inovadores da Internet: Brendan Eich e JavaScript" . Arquivado do original em 8 de fevereiro de 2008.
- ^ Eich, Brendan (23 de maio de 2013). "@BrendanEich Twitter Feed" . Twitter . Arquivado do original em 4 de agosto de 2021 . Recuperado em 4 de agosto de 2021 .
- ^ Fin JS (17 de junho de 2016), Brendan Eich - CEO da Brave , arquivado do original em 10 de fevereiro de 2019 , recuperado em 7 de fevereiro de 2018
- ^ a b Champeon, Steve (6 de abril de 2001). "JavaScript, como chegamos aqui?" . oreilly.com . Arquivado do original em 19 de julho de 2016 . Recuperado em 16 de julho de 2016 .
- ^ "Microsoft Internet Explorer 3.0 Beta agora disponível" . microsoft.com . Microsoft. 29 de maio de 1996. Arquivado do original em 24 de novembro de 2020 . Recuperado em 16 de julho de 2016 .
- ^ McCracken, Harry (16 de setembro de 2010). "O retorno indesejado de" Melhor visualizado com o Internet Explorer " " . technologizer.com . Arquivado do original em 23 de junho de 2018 . Recuperado em 16 de julho de 2016 .
- ^ Baker, Loren (24 de novembro de 2004). "A participação de mercado do navegador de Internet Mozilla Firefox aumenta para 7,4%" . Jornal do Search Engine . Arquivado do original em 7 de maio de 2021 . Recuperado em 8 de maio de 2021 .
- ^ Weber, Tim (9 de maio de 2005). "O ataque à gigante do software Microsoft" . BBC News . Arquivado do original em 25 de setembro de 2017.
- ^ "Teste de comparação de navegador grande: Internet Explorer x Firefox, Opera, Safari e Chrome" . Hardware de jogos para PC . Computec Media AG. 3 de julho de 2009. Arquivado do original em 1 de maio de 2012 . Recuperado em 28 de junho de 2010 .
- ^ Purdy, Kevin (11 de junho de 2009). "Testes de velocidade do Lifehacker: Safari 4, Chrome 2" . Lifehacker . Arquivado do original em 14 de abril de 2021 . Recuperado em 8 de maio de 2021 .
- ^ "TraceMonkey: JavaScript Lightspeed, Brendan Eich's Blog" . Arquivado do original em 4 de dezembro de 2015 . Recuperado em 22 de julho de 2020 .
- ^ "Mozilla pergunta, 'Já estamos rápidos? ' " . Com fio . Arquivado do original em 22 de junho de 2018 . Recuperado em 18 de janeiro de 2019 .
- ^ Node.js profissional: Criando software escalonável com base em JavaScript arquivado em 2016-24 na Wayback Machine , John Wiley & Sons, 01-out-2012
- ^ Sams Teach Yourself Node.js in 24 Hours Archived 2017-03-23 at the Wayback Machine , Sams Publishing, 05-Set-2012
- ^ Lawton, George (19 de julho de 2018). "A história secreta por trás do sucesso do npm e do Node" . TheServerSide . Arquivado do original em 2 de agosto de 2021 . Retirado em 2 de agosto de 2021 .
- ^ Brown, Paul (13 de janeiro de 2017). “Estado da União: npm” . Linux.com . Arquivado do original em 2 de agosto de 2021 . Retirado em 2 de agosto de 2021 .
- ^ "ECMAScript 6: Novos recursos: Visão geral e comparação" . es6-features.org . Arquivado do original em 18 de março de 2018 . Recuperado em 19 de março de 2018 .
- ^ a b Branscombe, Mary (2016-05-04). "JavaScript Standard muda para cronograma de lançamento anual; aqui estão as novidades do ES16" . A nova pilha . Arquivado do original em 2021-01-16 . Recuperado em 2021-01-15 .
- ^ "O processo TC39" . tc39.es . Ecma International. Arquivado do original em 2021-02-07 . Recuperado em 2021-01-15 .
- ^ "Propostas ECMAScript" . TC39. Arquivado do original em 04-12-2020 . Recuperado em 2021-01-15 .
- ^ a b Ashkenas, Jeremy . "Lista de linguagens que compilam para JS" . Arquivado do original em 31 de janeiro de 2020 . Recuperado em 6 de fevereiro de 2020 .
- ^ "US Trademark Serial No. 75026640" . Escritório de Patentes e Marcas dos Estados Unidos . Arquivado do original em 2021-07-13 . Página visitada em 2021-05-08 .
- ^ "Avisos legais" . Oracle Corporation . Arquivado do original em 2021-06-05 . Página visitada em 2021-05-08 .
- ^ "Vanilla JS" . vanilla-js.com . Arquivado do original em 16 de junho de 2020 . Recuperado em 17 de junho de 2020 .
- ^ "Guia de JavaScript do lado do servidor" . Oracle Corporation . 11 de dezembro de 1998. Arquivado do original em 11 de março de 2021 . Recuperado em 8 de maio de 2021 .
- ^ Clinick, Andrew (14 de julho de 2000). "Apresentando JScript .NET" . Microsoft Developer Network . Microsoft. Arquivado do original em 10 de novembro de 2017 . Recuperado em 10 de abril de 2018 .
[Desde a introdução de 1996 do JScript versão 1.0 ... temos visto um aumento constante no uso de JScript no servidor - particularmente em Active Server Pages (ASP)
- ^ a b Mahemoff, Michael (17 de dezembro de 2009). "JavaScript do lado do servidor, de volta com uma vingança" . readwrite.com . Arquivado do original em 17 de junho de 2016 . Recuperado em 16 de julho de 2016 .
- ^ "JavaScript para Acrobat" . Arquivado do original em 7 de agosto de 2009 . Recuperado em 18 de agosto de 2009 .
- ^ "Respondendo à pergunta:" Como faço para desenvolver um aplicativo para o GNOME? " " . Arquivado do original em 11/02/2013 . Página visitada em 07/02/2013 .
- ^ "Tessel 2 ... Aproveite todas as bibliotecas do Node.JS para criar dispositivos úteis em minutos com o Tessel" . Arquivado do original em 2021-05-26 . Página visitada em 2021-05-08 .
- ^ "Introdução ao Node.js Raspberry Pi GPIO" . Arquivado do original em 2021-08-13 . Página visitada em 2020-05-03 .
- ^ "Espruino - JavaScript para microcontroladores" . Arquivado do original em 2020-05-01 . Página visitada em 2020-05-03 .
- ^ Flanagan, David (17 de agosto de 2006). JavaScript: The Definitive Guide: The Definitive Guide . "O'Reilly Media, Inc.". p. 16. ISBN 978-0-596-55447-7. Arquivado do original em 1º de agosto de 2020 . Recuperado em 29 de março de 2019 .
- ^ a b c d "peculiaridades do JavaScript em uma imagem da Internet" . A Comunidade DEV . Arquivado do original em 28 de outubro de 2019 . Recuperado em 28 de outubro de 2019 .
- ^ "Wat" . www.destroyallsoftware.com . Arquivado do original em 28 de outubro de 2019 . Recuperado em 28 de outubro de 2019 .
- ^ "Tipos de dados e estruturas de dados JavaScript - JavaScript | MDN" . Developer.mozilla.org . 16 de fevereiro de 2017. Arquivado do original em 14 de março de 2017 . Recuperado em 24 de fevereiro de 2017 .
- ^ Flanagan 2006 , pp. 176–178.
- ^ Crockford, Douglas. "Herança prototípica em JavaScript" . Arquivado do original em 13 de agosto de 2013 . Retirado em 20 de agosto de 2013 .
- ^ "Herança e a cadeia de protótipos" . Rede de desenvolvedores Mozilla . Mozilla . Arquivado do original em 25 de abril de 2013 . Recuperado em 6 de abril de 2013 .
- ^ Herman, David (2013). JavaScript eficaz . Addison-Wesley. p. 83. ISBN 978-0-321-81218-6.
- ^ Haverbeke, Marijn (2011). Eloquent JavaScript . Sem Starch Press. pp. 95–97. ISBN 978-1-59327-282-1.
- ^ Katz, Yehuda (12 de agosto de 2011). "Entendendo" Protótipos "em JavaScript" . Arquivado do original em 5 de abril de 2013 . Recuperado em 6 de abril de 2013 .
- ^ Herman, David (2013). JavaScript eficaz . Addison-Wesley. pp. 125–127. ISBN 978-0-321-81218-6.
- ^ "Propriedades do objeto de função" . Es5.github.com. Arquivado do original em 28 de janeiro de 2013 . Recuperado em 26 de maio de 2013 .
- ^ Flanagan 2006 , p. 141
- ^ Os muitos talentos do JavaScript para generalizar abordagens de Programação Orientada a Funções, como Traits e Mixins, arquivados em 2017-10-05 na Wayback Machine , Peterseliger.blogpsot.de, 11 de abril de 2014.
- ^ Traits for JavaScript Archived 2014-07-24 na Wayback Machine , 2010.
- ^ "Home | CocktailJS" . Cocktailjs.github.io . Arquivado do original em 4 de fevereiro de 2017 . Recuperado em 24 de fevereiro de 2017 .
- ^ Angus Croll, Um novo olhar sobre JavaScript Mixins Archived 2020-04-15 na Wayback Machine , publicado em 31 de maio de 2011.
- ^ "Modelo de simultaneidade e loop de eventos" . Rede de desenvolvedores Mozilla . Arquivado do original em 5 de setembro de 2015 . Recuperado em 28 de agosto de 2015 .
- ^ Haverbeke, Marijn (2011). Eloquent JavaScript . Sem Starch Press. pp. 139–149. ISBN 978-1-59327-282-1.
- ^ "E4X - Arquivo de conteúdo obsoleto | MDN" . Rede de desenvolvedores Mozilla . Fundação Mozilla. 14 de fevereiro de 2014. Arquivado do original em 24 de julho de 2014 . Recuperado em 13 de julho de 2014 .
- ^ "var - JavaScript - MDN" . A Rede de Desenvolvedores Mozilla . Arquivado do original em 23 de dezembro de 2012 . Recuperado em 22 de dezembro de 2012 .
- ^ "deixar" . Documentos da web MDN . Mozilla. Arquivado do original em 28 de maio de 2019 . Recuperado em 27 de junho de 2018 .
- ^ "const" . Documentos da web MDN . Mozilla. Arquivado do original em 28 de junho de 2018 . Recuperado em 27 de junho de 2018 .
- ^ "Especificação de linguagem ECMAScript - ECMA-262 Edição 5.1" . Ecma International . Arquivado do original em 26 de novembro de 2012 . Recuperado em 22 de dezembro de 2012 .
- ^ "console" . Rede de desenvolvedores Mozilla . Mozilla . Arquivado do original em 28 de fevereiro de 2013 . Recuperado em 6 de abril de 2013 .
- ^ "argumentos" . Rede de desenvolvedores Mozilla . Mozilla . Arquivado do original em 13 de abril de 2013 . Recuperado em 6 de abril de 2013 .
- ^ "Importar e exportar módulos em javascript" . Learnersbucket.com . Arquivado do original em 23 de abril de 2019 . Recuperado em 23 de abril de 2019 .
- ^ "Tornando o JavaScript seguro para publicidade" . ADsafe. Arquivado do original em 2021-07-06 . Página visitada em 2021-05-08 .
- ^ "Secure ECMA Script (SES)" . Arquivado do original em 15 de maio de 2013 . Recuperado em 26 de maio de 2013 .
- ^ "Projeto Google Caja" . Google . Arquivado do original em 2021-01-22 . Página visitada em 2021-07-09 .
- ^ "Vulnerabilidade de script entre sites Mozilla relatada e corrigida - Talkback do MozillaZine" . Mozillazine.org . Arquivado do original em 22 de agosto de 2011 . Recuperado em 24 de fevereiro de 2017 .
- ^ "Clique com o botão direito em" proteção "? Esqueça" . 17 de junho de 2008. ISSN 1797-1993 . Arquivado do original em 9 de agosto de 2011 . Recuperado em 17 de junho de 2008 . Citar diário requer
|journal=
( ajuda ) - ^ Rehorik, Jan. "Por que você nunca deve colocar dados confidenciais em seu JavaScript" . ServiceObjects Blog . ServiceObjects. Arquivado do original em 3 de junho de 2019 . Recuperado em 3 de junho de 2019 .
- ^ a b Lauinger, Tobias; Chaabane, Abdelberi; Arshad, Sajjad; Robertson, William; Wilson, Christo; Kirda, Engin (21 de dezembro de 2016). "Não dependerás de mim: analisando o uso de bibliotecas JavaScript desatualizadas na Web" (PDF) . Proceedings 2017 Network and Distributed System Security Symposium . arXiv : 1811.00918 . doi : 10.14722 / ndss.2017.23414 . ISBN 978-1-891562-46-4. S2CID 17885720 . Arquivado do original (PDF) em 29 de março de 2017 . Recuperado em 22 de fevereiro de 2017 .
- ^ Collins, Keith (27 de março de 2016). “Como um programador quebrou a internet ao deletar um pequeno pedaço de código” . Quartz . Arquivado do original em 22 de fevereiro de 2017 . Recuperado em 22 de fevereiro de 2017 .
- ^ SC Magazine UK, 11 linhas de código excluído do desenvolvedor 'quebra a internet' Arquivado em 23 de fevereiro de 2017, na Wayback Machine
- ^ Mozilla Corporation, Buffer overflow em crypto.signText () Arquivado 2014-06-04 na Wayback Machine
- ^ Festa, Paul (19 de agosto de 1998). "Bug de estouro de buffer no IE" . CNET . Arquivado do original em 25 de dezembro de 2002.
- ^ SecurityTracker.com, Apple Safari JavaScript Buffer Overflow permite que usuários remotos executem código arbitrário e erro de redirecionamento HTTP permite que usuários remotos acessem arquivos arquivados em 18-02-2010 na máquina de retorno
- ^ SecurityFocus, Vulnerabilidade de estouro de buffer de controle ActiveX do Microsoft WebViewFolderIcon Arquivado em 22/08/2011 no WebCite
- ^ Fusion Authority, Macromedia Flash ActiveX Buffer Overflow Arquivado em 13 de agosto de 2011, na máquina Wayback
- ^ "Modo protegido no Vista IE7 - IEBlog" . Blogs.msdn.com . 9 de fevereiro de 2006. Arquivado do original em 23 de janeiro de 2010 . Recuperado em 24 de fevereiro de 2017 .
- ^ US CERT, nota de vulnerabilidade VU # 713878: O Microsoft Internet Explorer não valida corretamente a fonte do frame redirecionado Arquivado em 30/10/2009 na máquina de retorno
- ^ Mozilla Foundation, Mozilla Foundation Security Advisory 2005–41: Escalonamento de privilégios por meio de substituições de propriedade DOM Arquivado 04/06/2014 na máquina Wayback
- ^ Microsoft Corporation, Alterações na funcionalidade do Microsoft Windows XP Service Pack 2: Parte 5: Segurança de navegação aprimorada arquivada em 03/02/2018 na máquina Wayback
- ^ Para ver um exemplo de um Cavalo de Tróia JavaScript raro, consulte Symantec Corporation, JS.Seeker.K Archived 2011-08-22 at WebCite
- ^ Gruss, Daniel; Maurice, Clémentine; Mangard, Stefan (24 de julho de 2015). "Rowhammer.js: um ataque remoto de falha induzido por software em JavaScript". arXiv : 1507,06955 [ cs.CR ].
- ^ Jean-Pharuns, Alix (30 de julho de 2015). "Rowhammer.js é o hack mais engenhoso que já vi" . Placa-mãe . Vice . Arquivado do original em 27 de janeiro de 2018 . Recuperado em 26 de janeiro de 2018 .
- ^ Goodin, Dan (4 de agosto de 2015). "Exploração DRAM 'Bitflipping' para atacar PCs: Basta adicionar JavaScript" . Ars Technica . Arquivado do original em 27 de janeiro de 2018 . Recuperado em 26 de janeiro de 2018 .
- ^ Auerbach, David (28 de julho de 2015). "Exploração de segurança do Rowhammer: por que um novo ataque à segurança é verdadeiramente assustador" . slate.com . Arquivado do original em 30 de julho de 2015 . Recuperado em 29 de julho de 2015 .
- ^ AnC Arquivado em 2016-03-16 na Wayback Machine VUSec, 2017
- ^ New ASLR-rebentando JavaScript está prestes a fazer drive-by façanhas muito mais desagradável Arquivado 2017/03/16 no Wayback Machine Ars Technica de 2017
- ^ Specter Attack Arquivado em 03/01/2018 na Wayback Machine Specter Attack
- ^ "Benchmark.js" . benchmarkjs.com . Arquivado do original em 19/12/2016 . Página visitada em 06-11-2016 .
- ^ JSBEN.CH. "JSBEN.CH Performance Benchmarking Playground para JavaScript" . jsben.ch . Arquivado do original em 2021-02-27 . Obtido em 2021-08-13 .
- ^ Eich, Brendan (3 de abril de 2008). "Popularidade" . Arquivado do original em 3 de julho de 2011 . Recuperado em 19 de janeiro de 2012 .
- ^ "Edge Browser Alterna WebAssembly para 'On' - Visual Studio Magazine" . Revista Visual Studio . Arquivado do original em 10/02/2018 . Obtido em 09/02/2018 .
- ^ "perguntas frequentes" . asm.js. Arquivado do original em 4 de junho de 2014 . Recuperado em 13 de abril de 2014 .
Outras leituras
- Flanagan, David. JavaScript: o guia definitivo . 7ª edição. Sebastopol, Califórnia: O'Reilly, 2020.
- Haverbeke, Marijn. Eloquent JavaScript . 3ª edição. No Starch Press, 2018. 472 páginas. ISBN 978-1593279509 . (download)
- Zakas, Nicholas. Principles of Object-Oriented JavaScript , 1st edition. No Starch Press, 2014. 120 páginas. ISBN 978-1593275402 .
Ligações externas
- JavaScript
- Invenções americanas
- Software multiplataforma
- Linguagens de programação digitadas dinamicamente
- Linguagens funcionais
- Linguagens de programação baseadas em objetos
- Linguagens de programação de alto nível
- Linguagens de programação criadas em 1995
- Linguagens de programação com um padrão ISO
- Linguagens de programação baseadas em protótipos
- Linguagens de script
- Programação da Web