JavaScript
JavaScript (), muitas vezes abreviado como JS, é uma linguagem de programação que é uma das principais tecnologias da World Wide Web, ao lado de HTML e CSS. A partir de 2022, 98% dos sites usam JavaScript no lado do cliente para o comportamento da página da web, muitas vezes incorporando bibliotecas de terceiros. Todos os principais navegadores da web têm um mecanismo JavaScript dedicado para executar o código no navegador dos usuários. dispositivos.
JavaScript é uma linguagem compilada de alto nível, geralmente just-in-time, em conformidade com o padrão ECMAScript. Possui tipagem dinâmica, orientação a objetos baseada em protótipo e funções de primeira classe. É multiparadigma, suportando 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 instalações gráficas. Na prática, o navegador da Web ou outro sistema de tempo de execução fornece APIs JavaScript para E/S.
Os mecanismos JavaScript foram originalmente usados apenas em navegadores da Web, mas agora são componentes centrais de alguns servidores e uma variedade de aplicativos. O sistema de tempo de execução mais popular para esse uso é o Node.js.
Embora Java e JavaScript sejam semelhantes em nome, sintaxe e respectivas bibliotecas padrão, as duas linguagens são distintas e diferem muito em design.
História
Criação no Netscape
O primeiro navegador da Web popular com uma interface gráfica do usuário, o Mosaic, foi lançado em 1993. Acessível a pessoas não técnicas, ele desempenhou um papel proeminente no rápido crescimento da nascente World Wide Web. Os principais desenvolvedores do Mosaic fundaram a corporação Netscape, que lançou um navegador mais sofisticado, o Netscape Navigator, em 1994. Isso rapidamente se tornou o mais usado.
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 na florescente cena 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 dois caminhos para conseguir isso: colaborar com a Sun Microsystems para incorporar a linguagem de programação Java, ao mesmo tempo em que contrataram Brendan Eich para incorporar a linguagem Scheme.
A gerência do Netscape logo decidiu que a melhor opção era Eich criar uma nova linguagem, com sintaxe semelhante a Java e menos como Scheme ou outras linguagens de script existentes. Embora a nova linguagem e sua implementação de interpretador fossem chamadas de LiveScript quando lançadas pela primeira vez como parte de um beta do Navigator em setembro de 1995, o nome foi alterado para JavaScript para o lançamento oficial em dezembro.
A escolha do nome JavaScript tem causado confusão, dando a entender que está diretamente relacionado ao Java. Na época, o boom das pontocom havia começado e Java era a nova linguagem quente, então Eich considerou o nome JavaScript uma jogada de marketing da Netscape.
Adoção pela Microsoft
A Microsoft lançou o Internet Explorer em 1995, levando a uma guerra de navegadores com o Netscape. Na frente do JavaScript, a Microsoft fez engenharia reversa do interpretador Navigator para criar o seu próprio, chamado JScript.
O JScript foi lançado pela primeira vez em 1996, juntamente com o suporte inicial para CSS e extensões para HTML. Cada uma dessas implementações era visivelmente diferente de suas contrapartes no Navigator. Essas diferenças tornaram difícil para os desenvolvedores fazerem seus sites funcionarem bem em ambos os navegadores, levando ao uso generalizado de "melhor visualizado no Netscape" e "melhor visualizado no Internet Explorer" logotipos por vários anos.
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 à qual todos os fornecedores de navegadores poderiam obedecer. Isso levou ao lançamento oficial da primeira especificação da 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 ganhou 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%. Isso significava que o JScript se tornou o padrão de fato para scripts do lado do cliente na Web.
A Microsoft inicialmente participou do processo de padronização e implementou algumas propostas em sua linguagem JScript, mas acabou deixando de colaborar no trabalho da Ecma. Assim 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 participação de mercado significativa do Internet Explorer.
Em 2005, a Mozilla ingressou na ECMA International e começou a trabalhar 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, baseada em um rascunho do ECMAScript 4. O objetivo tornou-se 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, o Tamarin e o ActionScript 3 eram muito diferentes dos scripts do lado do cliente estabelecidos e, sem a cooperação da Microsoft, o ECMAScript 4 nunca foi concretizado.
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 a espinha dorsal, para criar aplicações web onde os dados podem ser carregados em segundo plano, evitando a necessidade de página inteira recarrega. Isso desencadeou um período de renascimento do JavaScript, liderado por bibliotecas de código aberto e pelas 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 mecanismo JavaScript V8 que era mais rápido do que a concorrência. A principal inovação foi a compilação just-in-time (JIT), de modo que outros fornecedores de navegadores precisaram revisar seus mecanismos para JIT.
Em julho de 2008, essas partes díspares se reuniram para uma conferência em Oslo. Isso levou ao acordo final no início de 2009 para combinar todo o trabalho relevante e impulsionar o idioma. O resultado foi o padrão ECMAScript 5, lançado em dezembro de 2009.
Atingindo a maturidade
O trabalho ambicioso na linguagem continuou por vários anos, culminando em uma extensa coleção de adições e refinamentos formalizados com a publicação do ECMAScript 6 em 2015.
A criação do Node.js em 2009 por Ryan Dahl provocou um aumento significativo no uso de JavaScript fora dos navegadores da web. O Node combina o mecanismo V8, um loop de eventos e APIs de E/S, fornecendo assim um sistema autônomo de tempo de execução do JavaScript. Em 2018, o Node era usado por milhões de desenvolvedores e o npm tinha o maior número de módulos de qualquer gerenciador de pacotes do mundo.
A especificação preliminar do ECMAScript é atualmente mantida abertamente no GitHub, e as edições são produzidas por meio de instantâneos anuais regulares. As possíveis revisões do idioma são examinadas por meio de um processo de proposta abrangente. Agora, em vez de números de edição, os desenvolvedores verificam o status dos próximos recursos individualmente.
O ecossistema JavaScript atual tem muitas bibliotecas e estruturas, práticas de programação estabelecidas e uso substancial de JavaScript fora dos navegadores da web. Além disso, com o surgimento de aplicativos de página única e outros sites pesados em JavaScript, vários transpilers foram criados para auxiliar no processo de desenvolvimento.
Marca registrada
"JavaScript" é uma marca comercial da Oracle Corporation nos Estados Unidos. A marca registrada foi originalmente emitida para a Sun Microsystems em 6 de maio de 1997 e foi transferida para a Oracle quando eles adquiriram a Sun em 2009.
Uso do lado do cliente do site
JavaScript é a linguagem de script do lado do cliente dominante na Web, com 98% de todos os sites (meados de 2022) usando-o para essa finalidade. Os scripts são incorporados ou incluídos em documentos HTML e interagem com o DOM. Todos os principais navegadores da web têm um mecanismo JavaScript integrado que executa o código no dispositivo do usuário.
Exemplos de comportamento de script
- Carregar novo conteúdo da página da web sem recarregar a página, via Ajax ou um WebSocket. Por exemplo, os usuários de redes sociais podem enviar e receber mensagens sem sair da página atual.
- Animações de páginas web, como desvanecendo objetos dentro e fora, redimensionando e movendo-os.
- Jogando jogos de navegador.
- Controlando a reprodução de mídia de streaming.
- Gerar anúncios pop-up ou caixas de alerta.
- Validar valores de entrada de um formulário web antes que os dados sejam enviados para um servidor web.
- Registrar dados sobre o comportamento do usuário e enviá-lo para um servidor. O proprietário do site pode usar esses dados para análise, rastreamento de anúncios e personalização.
- Redirecionar um usuário para outra página.
- Armazenamento e recuperação de dados no dispositivo do usuário, através dos padrões de armazenamento ou IndexedDB.
Bibliotecas e estruturas
Mais de 80% dos sites usam uma biblioteca JavaScript ou estrutura da web de terceiros para seus scripts do lado do cliente.
jQuery é de longe a biblioteca mais popular, usada por mais de 75% dos websites. O Facebook criou a biblioteca React para seu site e posteriormente a lançou como código aberto; outros sites, incluindo o Twitter, agora o utilizam. 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 outros.
Em contraste, o termo "Vanilla JS" foi cunhado para sites que não usam nenhuma biblioteca ou estrutura, contando inteiramente com a funcionalidade padrão do JavaScript.
Outro uso
O uso do 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 que não são do 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, mas eram nichos pequenos. 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.
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 navegadores incluem o suporte do Adobe Acrobat para scripts de documentos PDF e extensões do GNOME Shell escritas em JavaScript.
JavaScript recentemente começou a aparecer em alguns sistemas embarcados, geralmente aproveitando o Node.js.
Recursos
Os recursos a seguir são comuns a todas as implementações ECMAScript em conformidade, a menos que explicitamente especificado de outra forma.
Imperativo e estruturado
JavaScript suporta grande parte da sintaxe de programação estruturada de C (por exemplo, instruções if
, loops while
, instruções switch
, do loops while
, etc.). Uma exceção parcial é o escopo: originalmente o JavaScript só tinha escopo de função com var
; o escopo de bloco foi adicionado no ECMAScript 2015 com as palavras-chave let
e const
. Como C, JavaScript faz uma distinção entre expressões e declarações. Uma diferença sintática de C é a inserção automática de ponto-e-vírgula, que permite que o ponto-e-vírgula (que finaliza as instruções) seja omitido.
Digitado fracamente
JavaScript é fracamente digitado, o que significa que certos tipos são convertidos implicitamente dependendo da operação usada.
- O binário
+
operador lança ambos os operandos para uma corda a menos que ambos os operandos são números. Isso porque o operador de adição dobra como um operador de concatenação - O binário
-
operador sempre lança ambos operandos para um número - Ambos os operadores unários (
+
,-
) sempre lançar o operando para um número
Os valores são convertidos em strings como o seguinte:
- As cordas são deixadas como-is
- Os números são convertidos em sua representação de string
- Arrays têm seus elementos fundidos a cordas depois que eles são unidos por vírgulas (
,
) - Outros objetos são convertidos na string
[object Object]
Onde?Object
é o nome do construtor do objeto
Os valores são convertidos em números convertendo-os em strings e, em seguida, convertendo as strings em números. Esses processos podem ser modificados definindo as funções toString
e valueOf
no protótipo para conversão de string e número, respectivamente.
O JavaScript recebeu críticas pela forma como implementa essas conversões, pois a complexidade das regras pode ser confundida com inconsistência. Por exemplo, ao adicionar um número a uma string, o número será convertido em uma string antes de executar a concatenação, mas ao subtrair um número de uma string, a string será convertida em um número antes de realizar a subtração.
ópera esquerda | operador | ópera direita | resultado |
---|---|---|---|
[] (dispositivo vazio)
| + | [] (dispositivo vazio)
| "" (corda vazia)
|
[] (dispositivo vazio)
| + | {} (objeto vazio)
| "[object Object]" (string)
|
false (boolean)
| + | [] (dispositivo vazio)
| "false" (string)
|
"123" (string)
| + | 1 (número)
| "1231" (string)
|
"123" (string)
| - | 1 (número)
| 122 (número)
|
"123" (string)
| - | "abc" (string)
| NaN (número)
|
Muitas vezes também é mencionado {} + []
resultando 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ê colocar a expressão entre parênteses ({} + [])
, as chaves serão interpretadas como um objeto vazio e o resultado da expressão será "[object Object]&# 34;
como esperado.
Dinâmico
- Digitação
- JavaScript é digitado dinamicamente como a maioria dos outros idiomas de scripting. 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 transferida para uma string. JavaScript suporta várias maneiras de testar o tipo de objetos, incluindo digitação de pato.
- Avaliação do tempo de execução
- JavaScript inclui um
eval
função que pode executar declarações fornecidas como strings em tempo de execução.
Orientação a objetos (baseada em protótipo)
A herança prototípica em JavaScript é descrita por Douglas Crockford como:
Você faz objetos protótipos, e então... faz novas instâncias. Os objetos são mutáveis em JavaScript, para que possamos aumentar as novas instâncias, dando-lhes novos campos e métodos. Estes podem então atuar como protótipos para objetos ainda mais recentes. Não precisamos de aulas para fazer muitos objetos semelhantes... Os objetos herdam de objetos. O que poderia ser mais orientado a objetos do que isso?
Em JavaScript, um objeto é um array associativo, aumentado com um protótipo (veja abaixo); cada chave fornece o nome de uma propriedade de objeto e há duas formas sintáticas de especificar tal nome: notação de ponto (obj.x = 10
) e notação de colchete (obj['x'] = 10
). Uma propriedade pode ser adicionada, recuperada 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 do protótipo de um objeto) pode ser enumerada usando um loop for...in
.
- Protótipos
- JavaScript usa protótipos onde muitas outras linguagens orientadas a objetos usam classes para herança. É possível simular muitos recursos baseados em classes com protótipos em JavaScript.
- Funções como construtores de objetos
- Funções duplas como construtores de objetos, juntamente com seu papel típico. Prefixar uma chamada de função com novo novo criará uma instância de um protótipo, herdando propriedades e métodos do construtor (incluindo propriedades da
Object
protótipo). ECMAScript 5 ofereceObject.create
método, permitindo a criação explícita de uma instância sem herdar automaticamente daObject
protótipo (os ambientes mais antigos podem atribuir o protótiponull
). O construtorprototype
a propriedade 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 utilizada como construtor. Construtores embutidos do JavaScript, comoArray
ouObject
, também têm protótipos que podem ser modificados. Embora seja possível modificar oObject
protótipo, geralmente é considerado má prática 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. - 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 de método de um objeto, o local da função Isto é o seguinte. a palavra-chave está ligada a esse objeto para essa invocação.
Funcional
As funções JavaScript sã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()
. Uma função aninhada é uma função definida dentro de outra função. Ele é criado sempre que a função externa é invocada. 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. JavaScript também suporta funções anônimas.
Delegativo
JavaScript suporta delegação implícita e explícita.
- Funções como papéis (Traits e Mixins)
- JavaScript suporta nativamente várias implementações baseadas em funções de padrões de papel como Traits e Mixins. Tal função define comportamento adicional por pelo menos um método vinculado ao
this
palavra-chave dentro de suafunction
corpo. Um papel deve então ser delegado explicitamente viacall
ouapply
para objetos que precisam apresentar comportamento adicional que não seja compartilhado através da cadeia de protótipos. - Composição de objetos e herança
- Considerando que a delegação baseada em funções explícita cobre a composição em JavaScript, a delegação implícita já acontece sempre que a cadeia de protótipos é caminhada para, por exemplo, encontrar um método que possa estar relacionado com, mas não é diretamente de propriedade 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 protótipo de funções construtoras.
Diversos
JavaScript é uma linguagem de índice zero.
- Ambiente de tempo 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, uma página web DOM). Estes ambientes são únicos. JavaScript também depende do ambiente de tempo de execução para fornecer a capacidade de incluir/importar scripts (por exemplo, HTML
elementos). Este não é um recurso de linguagem por si, mas é comum na maioria das implementações JavaScript. JavaScript processa mensagens de uma fila 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ção e variáveis locais. A pilha de chamadas diminui e cresce com base nas necessidades da função. Quando a pilha de chamada está vazia após a conclusão da função, JavaScript prossegue para a próxima mensagem na fila. Isso é chamado de loop de eventos, descrito como "correr à conclusão" porque cada mensagem é totalmente processada antes que a próxima mensagem seja considerada. No entanto, o modelo de convergência da linguagem descreve o loop de eventos como não bloqueio: 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 aguarda uma consulta de banco de dados para retornar informações.
- Funções variáveis
- Um número indefinido de parâmetros pode ser passado para uma função. A função pode acessá-los através de parâmetros formais e também através do local
arguments
objecto. Funções variáveis também podem ser criadas usando obind
método.
- Litros e objetos
- Como muitas linguagens de scripting, arrays e objetos (arrays associativos em outros idiomas) podem ser criados com uma sintaxe sucinta de atalho. Na verdade, esses literais formam a base do formato de dados JSON.
- Expressões regulares
- JavaScript também suporta expressões regulares de uma forma semelhante a Perl, que fornecem uma sintaxe concisa e poderosa para manipulação de texto que é mais sofisticada do que as funções de string incorporadas.
- Promessas e Async / aguardar
- JavaScript suporta promessas e Async / aguarda para lidar com operações assíncronas. Um objeto Promessa embutido fornece funcionalidade para lidar com promessas e associar manipuladores com o resultado final de uma ação assíncrona. Recentemente, métodos combinadores foram introduzidos na especificação JavaScript, o que permite aos desenvolvedores combinar várias promessas de JavaScript e fazer operações com base em diferentes cenários. Os métodos introduzidos são: Promise.race, Promise.all, Promise.all Preparado e Promessa. Async/await permite que uma função assíncrona, não bloqueada seja estruturada de forma semelhante a uma função síncrona comum. Assíncrono, código não-bloqueio pode ser escrito, com sobrecarga mínima, estruturado semelhante ao tradicional síncrono, código de bloqueio.
Extensões específicas do fornecedor
Historicamente, alguns mecanismos JavaScript suportavam esses recursos não padrão:
- condicional
catch
cláusulas (como Java) - compreensões de matrizes e expressões geradoras (como Python)
- expressões de função concisa (
function(args) expr
; esta sintaxe experimental predated funções de seta) - ECMAScript for XML (E4X), uma extensão que adiciona suporte XML nativo ao ECMAScript (não suportado no Firefox desde a versão 21)
Sintaxe
Exemplos simples
Variáveis em JavaScript podem ser definidas usando as palavras-chave var
, let
ou const
. As variáveis definidas sem palavras-chave serão definidas no escopo global.
// Declara uma variável designada por função `x`, e implicitamente atribui o// valor especial `indefinido` para ele. Variáveis sem valor são automaticamente// definido como indefinido.// var é geralmente considerado má prática e let e const são geralmente preferidos.var x;// Variáveis podem ser definidas manualmente para `undefinida` assimDeixa-me. x2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = indefinido;// Declara uma variável de bloco chamada `y`, e implicitamente a define// 'indefinido'. A palavra-chave `let` foi introduzida no ECMAScript 2015.Deixa-me. Sim.;// Declara uma variável não-reassinável de um bloco chamado `z`, e a define para// uma string literal. A palavra-chave `const` também foi introduzida no ECMAScript 2015,// e deve ser explicitamente atribuído.// A palavra-chave `const` significa constante, portanto a variável não pode ser transferida// como o valor é `constante`.Não. zangão. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = "este valor não pode ser transferido!";// Declara uma variável e atribui 3. Isto é geralmente considerado// má prática, e não funcionará se o modo estrito estiver ligado.) = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 3;// Declara uma variável chamada 'myNumber`, e atribui um número literal (o valor// `2`) para ele.Deixa-me. O meu nome = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 2;// Reassigna `myNumber`, definindo-o a uma string literal (o valor `"foo"`).// JavaScript é uma linguagem de tipo dinâmico, por isso é legal.O meu nome = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = "foo";
Observe os comentários no exemplo acima, todos precedidos por duas barras.
Não há funcionalidade interna de entrada/saída em JavaScript, em vez disso, ela é fornecida pelo ambiente de tempo de execução. A especificação ECMAScript na edição 5.1 menciona que "não há provisões nesta especificação para entrada de dados externos ou saída de resultados computados".
No entanto, a maioria dos ambientes de tempo de execução possui um objeto console
que pode ser usado para imprimir a saída. Aqui está um programa Hello World minimalista em JavaScript em um ambiente de tempo de execução com um objeto de console:
console.log("Olá, Mundo!");
Em documentos HTML, um programa como este é necessário para uma saída:
// Os nós de texto podem ser feitos usando o método "escrita".// Isso é desaprovado, pois pode substituir o documento se o documento estiver totalmente carregado.documento.escrever("foo" ');// Elementos também podem ser feitos. Primeiro, eles têm que ser criados no DOM.Não. O meu elevador = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = documento.criar Elemento('Span' ');// Atributos como classes e o id pode ser definido tambémO meu elevador.classe Lista.Adicionar("foo" ');O meu elevador.I = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 'bar ';// Depois de definir isso, a tag será parecida com esta: `> "O meu elevador.setAttribuído('dados e dados ', Adeus. '); // O que também pode ser escrito como 'myElem.dataset.attr = 'baz'// Finalmente anexá-lo como um elemento infantil para o no HTMLdocumento.corpo.Adicionar ao cesto(O meu elevador);// Elementos podem ser agarrados imperativomente com querySelector para um elemento, ou querySelectorAll para vários elementos que podem ser looped com para Cadadocumento.querySelector('. '); // Selecione o primeiro elemento com a classe "classe"documento.querySelector(# '); // Selecione o primeiro elemento com um `id` de "id"documento.querySelector("[data-other] '); // Selecione o primeiro elemento com o atributo "data-other"documento.querySelector Tudo('. '); // Retorna um Array de todos os elementos com a classe "multiple"
Uma função recursiva simples para calcular o fatorial de um número natural:
função factorial(n) ( // Verificar o argumento da legitimidade. Factorial é definido para inteiros positivos. se (O que é?(n) ( console.erro("Não é permitido um argumento numérico."); retorno Nao; // O valor especial: Não um Número ? se (n - Sim. 0) retorno 1; // 0! = 1 se (n < 0) retorno indefinido; // Fatorial de números negativos não é definido. se (n % 1) ( console.Avisem.("Não.n? será arredondado para o inteiro mais próximo. Para não-integers considerar usar função gama em vez disso. "); n = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Matemática.rodada(n); ? // As verificações acima não precisam ser repetidas na recursão, portanto, definindo a parte recursiva real separadamente abaixo. // A seguinte linha é uma expressão de função para computar recursivamente o fatorial. Ele usa a sintaxe de seta introduzida no ES6. Não. recursivamenteCompute = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = um - Sim. um > 1 ? um * recursivamenteCompute(um - Não. 1) : 1; // Observe o uso do operador ternary `?`. retorno recursivamenteCompute(n);?factorial(3); // Retornos 6
Uma função anônima (ou lambda):
Não. contador = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = função() ( Deixa-me. contagem = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 0; retorno função() ( retorno ++contagem; ?}Não. x = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = contador();x(); // Retornos 1x(); // Retornos 2x(); // Retorno 3
Este exemplo mostra que, em JavaScript, os fechamentos 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. Elas encurtam a sintaxe para escrever funções em JavaScript. As funções de seta são anônimas, portanto, é necessária uma variável para se referir a elas para invocá-las após sua criação, a menos que estejam entre parênteses e sejam executadas imediatamente.
Exemplo de função de seta:
// Funções de seta nos permitem omitir a palavra-chave `função`.// Aqui `long_example` aponta para um valor de função anônima.Não. longo_exemplo = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = (Entrada1, entrada2) - Sim. ( console.log("Olá, Mundo!"); Não. saída = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Entrada1 + entrada2; retorno saída;}// Se não houver aparelho, a função de seta simplesmente retorna a expressão// Então aqui está (input1 + input2)Não. curto_exemplo = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = (Entrada1, entrada2) - Sim. Entrada1 + entrada2;longo_exemplo(2, 3); // Impressões "Olá, Mundo!" e retorna 5curto_exemplo(2, 5); // Retornos 7// Se uma função de seta tiver apenas um parâmetro, os parênteses podem ser removidos.Não. No_parentheses = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = entrada - Sim. entrada + 2;No_parentheses(3); // Retornos 5// Uma função de seta, como outras definições de função, pode ser executada na mesma declaração que são criadas.// Isso é útil ao escrever bibliotecas para evitar o preenchimento do escopo global e para fechamentos.Deixa-me. três = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = (um, b)) - Sim. um + b)) (1, 2);Não. gerar_multiplicador_função = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = um - Sim. (b) - Sim. O que é?(b)) | !b) ? um : um*b));Não. 5_multiples = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = gerar_multiplicador_função(5); // O argumento fornecido "semente" a expressão e é mantido por um.5_multiples(1); // Retornos 55_multiples(3); // Retorno 155_multiples(4); // Retorno 60
Em JavaScript, os objetos podem ser criados como instâncias de uma classe.
Exemplo de classe de objeto:
classe Bola ( Construtor(raio) ( Isto é o seguinte..raio = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = raio; Isto é o seguinte..área = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Matemática.PI * ( raio Não. 2 ); ? // Classes (e assim objetos) podem conter funções conhecidas como métodos mostrar() ( console.log(Isto é o seguinte..raio); ?}Não. O meu dinheiro = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = novo novo Bola(5); // Cria uma nova instância do objeto de bola com raio 5O meu dinheiro.raio++; // Propriedades do objeto geralmente podem ser modificadas de foraO meu dinheiro.mostrar(); // Usando os registros de função "show" herdados "6"
Em JavaScript, os objetos podem ser instanciados diretamente de uma função.
Exemplo funcional de objeto:
função Bola(raio) ( Não. área = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Matemática.PI * ( raio Não. 2 ); Não. Não. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ( raio, área } // Os objetos são mutáveis, e as funções podem ser adicionadas como propriedades. Não..mostrar = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = () - Sim. console.log(Não..raio); retorno Não.;}Não. O meu dinheiro = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Bola(5); // Cria um novo objeto de bola com raio 5. Nenhuma palavra-chave "nova" necessária.O meu dinheiro.raio++; // A propriedade de instância pode ser modificada.O meu dinheiro.mostrar(); // Usando os registros de função "mostrar" "6" - o novo valor de instância.
Demonstração da função variádica (argumentos
é uma variável especial):
função soma() ( Deixa-me. x = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 0; para (Deixa-me. Eu... = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 0; Eu... < argumentos.comprimento; ++Eu...) x - Sim. argumentosNão.Eu...] retorno x;?soma(1, 2); // Retorno 3soma(1, 2, 3); // Retornos 6// A partir de ES6, usando o operador restante.função soma(...Args) ( retorno Args.reduzir(um, b)) - Sim. um + b));?soma(1, 2); // Retorno 3soma(1, 2, 3); // Retornos 6
As expressões de função invocadas imediatamente são frequentemente usadas para criar encerramentos. Closures permitem reunir propriedades e métodos em um namespace e tornar alguns deles privados:
Deixa-me. contador = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = (função() ( Deixa-me. Eu... = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 0; // Propriedade privada retorno ( // Métodos públicos Vamos.: função() ( alerta.(Eu...); } conjunto: função(valor) ( Eu... = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = valor; } incremento: função() ( alerta.(++Eu...); ? }(); // Módulocontador.Vamos.(); // Retorno 0contador.conjunto(6);contador.incremento(); // Retornos 7contador.incremento(); // Retornos 8
Objetos geradores (na forma de funções geradoras) fornecem uma função que pode ser chamada, encerrada e inserida novamente enquanto mantém o contexto interno (statefulness).
função* Counter() ( rendimento 1; rendimento 2;?função* Dinâmicos() ( Deixa-me. contagem = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 0; enquanto (verdadeiro) ( // Não é recomendado utilizar enquanto loops verdadeiros na maioria dos casos. rendimento ++contagem; ??// InstânciasNão. contador1 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Counter();Não. contador2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Dinâmicos();// Implementaçãocontador1.Próximo(); // {value: 1, done: false}contador1.Próximo(); // {value: 2, done: false}contador1.Próximo(); // {valor: undefined, done: true}contador2.Próximo(); // {value: 1, done: false}contador2.Próximo(); // {value: 2, done: false}contador2.Próximo(); // {value: 3, done: false}//...infinitamente
JavaScript pode exportar e importar de módulos:
Exemplo de exportação:
* mymodule.js *// Esta função permanece privada, pois não é exportadaDeixa-me. soma = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = (um, b)) - Sim. ( retorno um + b);?// Variáveis de exportaçãoexportação Deixa-me. Nome = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Álice ';exportação Deixa-me. idade = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 23;// Exportar funções nomeadasexportação função Adicionar(Não., Número 2) ( retorno Não. + Número 2;?// Classe de exportaçãoexportação classe Multiplicação ( Construtor(Não., Número 2) ( Isto é o seguinte..Não. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Não.; Isto é o seguinte..Número 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Número 2; ? Adicionar() ( retorno soma(Isto é o seguinte..Não., Isto é o seguinte..Número 2); ??
Exemplo de importação:
// Importar uma propriedadeimportação ( Adicionar ? a partir de ' ';console.log(Adicionar(1, 2));// 3// Importar várias propriedadesimportação ( Nome, idade ? a partir de ' ';console.log(Nome, idade);//> "Alice", 23// Importar todas as propriedades de um móduloimportação * a partir de './module.js 'console.log(Nome, idade);//> "Alice", 23console.log(Adicionar(1,2));// 3
Exemplo mais avançado
Este código de amostra exibe vários recursos JavaScript.
Não. Encontra o menor múltiplo comum (LCM) de dois números */função LCMCalculator(x, Sim.) ( // função do construtor se (O que é?(x*Sim.) jogar novo novo Tipo Erro("Discursos não numéricos não permitidos."); Não. Verificação Int = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = função(x) ( // função interna se (x % 1 O quê? 0) jogar novo novo Tipo Erro(x + "não é um inteiro"); retorno x; } Isto é o seguinte..um = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Verificação Int(x) // vírgulas ^^^^ são opcionais, uma nova linha é suficiente Isto é o seguinte..b) = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Verificação Int(Sim.);?// O protótipo de instâncias de objetos criadas por um construtor é// a propriedade "protótipo" do construtor.LCMCalculator.protótipo = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ( // objeto literal Construtor: LCMCalculator, // ao reatribuir um protótipo, defina a propriedade do construtor apropriadamente Gcd: função() ( // método que calcula o maior divisor comum // Algoritmo euclidiano: Deixa-me. um = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Matemática.abs(Isto é o seguinte..um), b) = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Matemática.abs(Isto é o seguinte..b)), ); se (um < b)) ( // variáveis de swap // t = b; b = a; a = t; Não.um, b)] = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Não.b), um] // swap usando atribuição de desestruturação (ES6) ? enquanto (b) O quê? 0) ( ) = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = b); b) = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = um % b); um = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ); ? // Só precisa calcular GCD uma vez, então "redefine" este método. // (Atualmente não redefinição - é definido na própria instância, // para isso. gcd refere-se a esta "redefinição" em vez de LCMCalculator.prototype.gcd. // Note que isso leva a um resultado errado se os membros do objeto LCMCalculator "a" e/ou "b" forem alterados depois.) // Além disso, 'gcd' == "gcd", este['gcd'] == este.gcd Isto é o seguinte.Não.Gcd '] = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = função() ( retorno um; } retorno um; } // Os nomes de propriedade de objetos podem ser especificados por strings delimitadas por citações duplas (") ou únicas ('). "Icm": função() ( // Nomes variáveis não colidem com propriedades de objeto, por exemplo, |lcm| não é |this.lcm|. // não usar |this.a*this.b| para evitar problemas de precisão FP Deixa-me. lcm = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Isto é o seguinte..um / Isto é o seguinte..Gcd() * Isto é o seguinte..b); // Só precisa calcular lcm uma vez, então "redefine" este método. Isto é o seguinte..lcm = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = função() ( retorno lcm; } retorno lcm; } // Métodos também podem ser declarados usando a sintaxe ES6 Tocando() ( // Usando tanto os literais do modelo ES6 e o operador (+) para concatenar valores retorno `LCMCalculator: a = Não.Isto é o seguinte..um?, b = + Isto é o seguinte..b); ?}// Definir a função de saída genérica; esta implementação só funciona para navegadores da Webfunção saída(x) ( documento.corpo.Adicionar ao cesto(documento.criar um código(x)); documento.corpo.Adicionar ao cesto(documento.criar Elemento('Tradução '));?// Nota: O mapa de Array() e paraEach() são definidos em JavaScript 1.6.// Eles são usados aqui para demonstrar a natureza funcional inerente do JavaScript.Não. Não.25, 55] Não.21, 56] Não.22, 58] Não.28, 56]].mapa(função(par) ( // array literal + mapping function retorno novo novo LCMCalculator(parNão.0] parNão.1);}).Tipo(um, b)) - Sim. um.lcm() - Não. b).lcm() // classificar com esta função comparativa; => é uma forma de mão curta de uma função, chamada "função estreita" .Para cada(Impressão);função Impressão(Não.) ( saída(Não. + ", gcd = " + Não..Gcd() + ", lcm = " + Não..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 DOM fornecem o potencial para autores mal-intencionados entregarem scripts para execução em um computador cliente via 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 executar apenas ações relacionadas à Web, e não tarefas de programação de uso geral, como criar arquivos. Em segundo lugar, os scripts são limitados pela política de mesma origem: os scripts de um site não têm acesso a informações como nomes de usuário, senhas ou cookies enviados para outro site. A maioria dos bugs de segurança relacionados ao JavaScript são violações da mesma política de origem ou do sandbox.
Existem subconjuntos de JavaScript geral—ADsafe, Secure ECMAScript (SES)—que fornecem maiores níveis de segurança, especialmente em códigos criados por terceiros (como anúncios). O Closure Toolkit é outro projeto para incorporação e isolamento seguro de JavaScript e HTML de terceiros.
A política de segurança de conteúdo é o principal método pretendido para garantir que apenas códigos confiáveis sejam executados em uma página da Web.
Vulnerabilidades entre sites
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 pode fazer com que um site de destino, como um site de banco on-line, inclua um script malicioso na página da Web apresentada à vítima. O script neste exemplo pode então acessar o aplicativo bancário com os privilégios da vítima, possivelmente revelando informações secretas ou transferindo dinheiro sem a autorização da vítima. Uma solução para vulnerabilidades XSS é usar HTML escape sempre que exibir dados não confiáveis.
Alguns navegadores incluem proteção parcial contra ataques XSS refletidos, nos quais o invasor fornece uma 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. Somente o design correto de aplicativos da Web no lado do servidor pode impedir totalmente o XSS.
Vulnerabilidades XSS também podem ocorrer devido a erros de implementação por parte dos autores do navegador.
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 para que execute ações que o usuário não pretendia em um site de destino (como transferir dinheiro em um banco). Quando os sites de destino dependem apenas de cookies para autenticação de solicitação, as solicitações originadas do código no site do invasor podem conter as mesmas credenciais de login válidas do usuário iniciador. Em geral, a solução para o CSRF é exigir um valor de autenticação em um campo oculto do formulário, 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.
"Seqüestro de JavaScript" é um tipo de ataque CSRF no qual uma tag <script>
no site de um invasor explora uma página no site da vítima que retorna informações privadas, como JSON ou JavaScript. Possíveis soluções 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 assumir que seu código JavaScript será executado como pretendido (ou de todo) porque qualquer segredo embutido no código pode ser extraído por um determinado adversário. Algumas implicações são:
- Os autores do site não podem ocultar perfeitamente como o seu JavaScript funciona porque o código-fonte bruto deve ser enviado ao cliente. O código pode ser ofuscado, mas a obfuscação pode ser reversa.
- A validação do formulário JavaScript só fornece conveniência para os usuários, não segurança. Se um site verificar que o usuário concordou com seus termos de serviço, ou filtra caracteres inválidos de campos que só devem conter números, ele deve fazê-lo no servidor, não apenas no cliente.
- Os scripts podem ser desativados seletivamente, então o JavaScript não pode ser confiável para evitar operações como clicar com o botão direito em uma imagem para salvá-lo.
- É considerada prática muito ruim para incorporar informações sensíveis, como senhas em JavaScript porque pode ser extraída por um atacante.
Confiança equivocada nos desenvolvedores
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 seu programa em relação a outros desenvolvedores. bibliotecas de programas. Os desenvolvedores confiam que os mantenedores das bibliotecas as manterão seguras e atualizadas, mas nem sempre é esse 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 com uma amostra de 133.000 sites, os pesquisadores descobriram que 37% dos sites incluíam uma biblioteca com pelo menos uma vulnerabilidade conhecida. "O intervalo médio entre a versão mais antiga da biblioteca usada em cada site e a versão mais recente disponível dessa biblioteca é de 1.177 dias no ALEXA, e o desenvolvimento de algumas bibliotecas ainda em uso ativo cessou anos atrás." Outra possibilidade é que o mantenedor de uma biblioteca possa removê-la completamente. Isso ocorreu em março de 2016, quando Azer Koçulu removeu seu repositório do npm. Isso causou a quebra de dezenas de milhares de programas e sites que dependiam de suas bibliotecas.
Erros de codificação do navegador e do plug-in
JavaScript fornece uma interface para uma ampla variedade de recursos do navegador, alguns dos quais podem ter falhas, como estouros de buffer. Essas falhas podem permitir que invasores escrevam scripts que executam qualquer código que desejarem no sistema do usuário. Este código não é 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, Internet Explorer e Safari.
Plugins, como players de vídeo, Adobe Flash e a ampla gama de controles ActiveX ativados por padrão no Microsoft Internet Explorer, também podem ter falhas exploráveis via JavaScript (essas falhas foram exploradas no passado).
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. O Google Chrome também limita seus renderizadores de página em sua própria "caixa de areia".
Erros de implementação de 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 devem ser concedidos ao código da Web.
A concessão incorreta de privilégios para JavaScript da Web tem desempenhado um papel nas vulnerabilidades do Internet Explorer e do Firefox. No Windows XP Service Pack 2, a Microsoft rebaixou os privilégios do JScript no Internet Explorer.
O Microsoft Windows permite que os arquivos de origem JavaScript no disco rígido de um computador sejam iniciados como programas de uso geral, sem sandbox (consulte: Windows Script Host). Isso torna o JavaScript (como o VBScript) um vetor teoricamente viável para um cavalo de Troia, embora os cavalos de Troia do JavaScript sejam incomuns na prática.
Vulnerabilidades de hardware
Em 2015, uma implementação de prova de conceito baseada em JavaScript de um ataque rowhammer foi descrita em um artigo por pesquisadores de segurança.
Em 2017, foi demonstrado um ataque baseado em JavaScript via navegador que poderia contornar o ASLR. É chamado de "ASLR⊕Cache" ou AnC.
Em 2018, o artigo que anunciou os ataques Spectre contra Speculative Execution na Intel e outros processadores incluiu uma implementação de JavaScript.
Ferramentas de desenvolvimento
Ferramentas importantes evoluíram com a linguagem.
- Cada navegador principal possui ferramentas de desenvolvimento web integradas, incluindo um depurador JavaScript.
- Ferramentas de análise de programas estáticos, como ESLint e JSLint, digitalize o código JavaScript para conformidade com um conjunto de padrões e diretrizes.
- Alguns navegadores têm perfis integrados. As bibliotecas de perfil autônomo também foram criadas, como benchmark.js e jsbench.
- Muitos editores de texto têm sintaxe destacando suporte para o código JavaScript.
Tecnologias relacionadas
Java
Um equívoco comum é que JavaScript é o mesmo que Java. Ambos, de fato, têm uma sintaxe semelhante a C (sendo a linguagem C 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 e a biblioteca padrão do Java 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 Matemática
e Data
objetos são baseados em classes de Java 1.0.
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 os dois idiomas são mais proeminentes do que suas semelhanças. Java tem tipagem estática, enquanto a tipagem de JavaScript é dinâmica. Java é carregado a partir de bytecode compilado, enquanto JavaScript é carregado como código-fonte legível por humanos. Os objetos de Java são baseados em classes, enquanto os de JavaScript são baseados em protótipos. Finalmente, o Java não suportava 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 uso geral definido como um subconjunto da sintaxe literal de objeto do JavaScript.
TypeScript
TypeScript (TS) é uma variante estritamente tipada de JavaScript. TS difere introduzindo anotações de tipo para variáveis e funções e introduzindo uma linguagem de tipo para descrever os tipos dentro de JS. Caso contrário, TS compartilha praticamente o mesmo conjunto de recursos que JS, para permitir que seja facilmente transpilado para JS para execução no lado do cliente e para interoperar com outro código JS.
WebAssembly
Desde 2017, os navegadores da web oferecem suporte ao WebAssembly, um formato binário que permite que um mecanismo JavaScript execute partes críticas de desempenho de scripts de páginas da web perto da velocidade nativa. O código WebAssembly é executado na mesma caixa de proteção que o código JavaScript regular.
asm.js é um subconjunto do JavaScript que serviu como precursor do WebAssembly.
Transpiladores
JavaScript é a linguagem dominante do lado do cliente da Web, e muitos sites possuem muitos scripts. Assim, foram criados transpilers para converter códigos escritos em outras linguagens, o que pode auxiliar no processo de desenvolvimento.
Contenido relacionado
Krupp
Unidade múltipla a diesel
K-Meleon