JavaScript

Da Wikipédia, a enciclopédia livre
Ir para navegação Pular para pesquisar

JavaScript
Paradigmaorientado a eventos , funcional , imperativo
Projetado porBrendan Eich da Netscape inicialmente; outros também contribuíram para o padrão ECMAScript
Apareceu pela primeira vez4 de dezembro de 1995 ; 25 anos atrás [1] ( 1995-12-04 )
Versão estável
ECMAScript 2021 (12ª edição) [2] Edite isso no Wikidata / junho de 2021 ; há 4 meses ( Junho de 2021 )
Versão de visualização
ECMAScript 2022 [3] Edite isso no Wikidata / 22 de julho de 2021 ; 2 meses atrás ( 22 de julho de 2021 )
Disciplina de digitaçãoDinâmico , fraco , pato
Extensões de nome de arquivo
  • .js
  • .cjs
  • .mjs[4]
Local na rede Internetwww .ecma-international .org / publicações-and-standards / standards / ecma-262 /
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 ( / ɑː 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

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, ifinstruções, whileloops, switchinstruções, do whileloops, 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]onde Objecté 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 toStringe valueOffunçõ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.

Conversões de tipo JavaScript
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 evalfunçã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...inloop.

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 Objectprotótipo). [56] ECMAScript 5 oferece o Object.createmétodo, permitindo a criação explícita de uma instância sem herdar automaticamente do Objectprotótipo (ambientes mais antigos podem atribuir o protótipo null). [57] A prototypepropriedade 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, como ArrayouObject, também têm protótipos que podem ser modificados. Embora seja possível modificar o Objectprotótipo, geralmente é considerado uma prática ruim porque a maioria dos objetos em JavaScript herdará métodos e propriedades do Objectprotó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 à thispalavra - chave dentro de seu functioncorpo. Uma função, então, deve ser delegada explicitamente por meio de callou applypara 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 argumentsobjeto local . Funções variáveis também podem ser criadas usando o bindmé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:

  • catchclá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 consoleobjeto [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.

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 Mathe Dateobjetos 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

  1. ^ a b Comunicado de imprensa anunciando JavaScript , "Netscape and Sun announce JavaScript", PR Newswire, 4 de dezembro de 1995
  2. ^ "Especificação da linguagem ECMAScript® 2021" . Junho de 2021 . Retirado em 27 de julho de 2021 .
  3. ^ https://tc39.es/ecma262/ ; recuperado: 27 de julho de 2021; data de publicação: 22 de julho de 2021.
  4. ^ "nodejs / node-eps" . GitHub . Arquivado do original em 2020-08-29 . Página visitada em 05/07/2018 .
  5. ^ 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.
  6. ^ 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 .
  7. ^ "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.
  8. ^ 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 .
  9. ^ "JavaScript" . Dictionary.com . Arquivado do original em 9 de agosto de 2021 . Recuperado em 9 de agosto de 2021 .
  10. ^ "Especificação da linguagem ECMAScript® 2020" . Arquivado do original em 2020-05-08 . Página visitada em 2020-05-08 .
  11. ^ 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.
  12. ^ 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 .
  13. ^ 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 .
  14. ^ "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 .
  15. ^ 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 .
  16. ^ "TechVision: Inovadores da Internet: Brendan Eich e JavaScript" . Arquivado do original em 8 de fevereiro de 2008.
  17. ^ 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 .
  18. ^ 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
  19. ^ 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 .
  20. ^ "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 .
  21. ^ 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 .
  22. ^ 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 .
  23. ^ Weber, Tim (9 de maio de 2005). "O ataque à gigante do software Microsoft" . BBC News . Arquivado do original em 25 de setembro de 2017.
  24. ^ "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 .
  25. ^ 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 .
  26. ^ "TraceMonkey: JavaScript Lightspeed, Brendan Eich's Blog" . Arquivado do original em 4 de dezembro de 2015 . Recuperado em 22 de julho de 2020 .
  27. ^ "Mozilla pergunta, 'Já estamos rápidos? ' " . Com fio . Arquivado do original em 22 de junho de 2018 . Recuperado em 18 de janeiro de 2019 .
  28. ^ Node.js profissional: Criando software escalonável com base em JavaScript arquivado em 2016-24 na Wayback Machine , John Wiley & Sons, 01-out-2012
  29. ^ Sams Teach Yourself Node.js in 24 Hours Archived 2017-03-23 ​​at the Wayback Machine , Sams Publishing, 05-Set-2012
  30. ^ 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 .
  31. ^ 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 .
  32. ^ "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 .
  33. ^ 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 .
  34. ^ "O processo TC39" . tc39.es . Ecma International. Arquivado do original em 2021-02-07 . Recuperado em 2021-01-15 .
  35. ^ "Propostas ECMAScript" . TC39. Arquivado do original em 04-12-2020 . Recuperado em 2021-01-15 .
  36. ^ 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 .
  37. ^ "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 .
  38. ^ "Avisos legais" . Oracle Corporation . Arquivado do original em 2021-06-05 . Página visitada em 2021-05-08 .
  39. ^ "Vanilla JS" . vanilla-js.com . Arquivado do original em 16 de junho de 2020 . Recuperado em 17 de junho de 2020 .
  40. ^ "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 .
  41. ^ 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)
  42. ^ 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 .
  43. ^ "JavaScript para Acrobat" . Arquivado do original em 7 de agosto de 2009 . Recuperado em 18 de agosto de 2009 .
  44. ^ "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 .
  45. ^ "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 .
  46. ^ "Introdução ao Node.js Raspberry Pi GPIO" . Arquivado do original em 2021-08-13 . Página visitada em 2020-05-03 .
  47. ^ "Espruino - JavaScript para microcontroladores" . Arquivado do original em 2020-05-01 . Página visitada em 2020-05-03 .
  48. ^ 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 .
  49. ^ 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 .
  50. ^ "Wat" . www.destroyallsoftware.com . Arquivado do original em 28 de outubro de 2019 . Recuperado em 28 de outubro de 2019 .
  51. ^ "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 .
  52. ^ Flanagan 2006 , pp. 176–178.
  53. ^ Crockford, Douglas. "Herança prototípica em JavaScript" . Arquivado do original em 13 de agosto de 2013 . Retirado em 20 de agosto de 2013 .
  54. ^ "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 .
  55. ^ Herman, David (2013). JavaScript eficaz . Addison-Wesley. p. 83. ISBN 978-0-321-81218-6.
  56. ^ Haverbeke, Marijn (2011). Eloquent JavaScript . Sem Starch Press. pp. 95–97. ISBN 978-1-59327-282-1.
  57. ^ 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 .
  58. ^ Herman, David (2013). JavaScript eficaz . Addison-Wesley. pp. 125–127. ISBN 978-0-321-81218-6.
  59. ^ "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 .
  60. ^ Flanagan 2006 , p. 141
  61. ^ 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.
  62. ^ Traits for JavaScript Archived 2014-07-24 na Wayback Machine , 2010.
  63. ^ "Home | CocktailJS" . Cocktailjs.github.io . Arquivado do original em 4 de fevereiro de 2017 . Recuperado em 24 de fevereiro de 2017 .
  64. ^ Angus Croll, Um novo olhar sobre JavaScript Mixins Archived 2020-04-15 na Wayback Machine , publicado em 31 de maio de 2011.
  65. ^ "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 .
  66. ^ Haverbeke, Marijn (2011). Eloquent JavaScript . Sem Starch Press. pp. 139–149. ISBN 978-1-59327-282-1.
  67. ^ "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 .
  68. ^ "var - JavaScript - MDN" . A Rede de Desenvolvedores Mozilla . Arquivado do original em 23 de dezembro de 2012 . Recuperado em 22 de dezembro de 2012 .
  69. ^ "deixar" . Documentos da web MDN . Mozilla. Arquivado do original em 28 de maio de 2019 . Recuperado em 27 de junho de 2018 .
  70. ^ "const" . Documentos da web MDN . Mozilla. Arquivado do original em 28 de junho de 2018 . Recuperado em 27 de junho de 2018 .
  71. ^ "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 .
  72. ^ "console" . Rede de desenvolvedores Mozilla . Mozilla . Arquivado do original em 28 de fevereiro de 2013 . Recuperado em 6 de abril de 2013 .
  73. ^ "argumentos" . Rede de desenvolvedores Mozilla . Mozilla . Arquivado do original em 13 de abril de 2013 . Recuperado em 6 de abril de 2013 .
  74. ^ "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 .
  75. ^ "Tornando o JavaScript seguro para publicidade" . ADsafe. Arquivado do original em 2021-07-06 . Página visitada em 2021-05-08 .
  76. ^ "Secure ECMA Script (SES)" . Arquivado do original em 15 de maio de 2013 . Recuperado em 26 de maio de 2013 .
  77. ^ "Projeto Google Caja" . Google . Arquivado do original em 2021-01-22 . Página visitada em 2021-07-09 .
  78. ^ "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 .
  79. ^ "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 )
  80. ^ 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 .
  81. ^ 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 .
  82. ^ 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 .
  83. ^ 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
  84. ^ Mozilla Corporation, Buffer overflow em crypto.signText () Arquivado 2014-06-04 na Wayback Machine
  85. ^ Festa, Paul (19 de agosto de 1998). "Bug de estouro de buffer no IE" . CNET . Arquivado do original em 25 de dezembro de 2002.
  86. ^ 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
  87. ^ SecurityFocus, Vulnerabilidade de estouro de buffer de controle ActiveX do Microsoft WebViewFolderIcon Arquivado em 22/08/2011 no WebCite
  88. ^ Fusion Authority, Macromedia Flash ActiveX Buffer Overflow Arquivado em 13 de agosto de 2011, na máquina Wayback
  89. ^ "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 .
  90. ^ 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
  91. ^ 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
  92. ^ 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
  93. ^ Para ver um exemplo de um Cavalo de Tróia JavaScript raro, consulte Symantec Corporation, JS.Seeker.K Archived 2011-08-22 at WebCite
  94. ^ 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 ].
  95. ^ 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 .
  96. ^ 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 .
  97. ^ 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 .
  98. ^ AnC Arquivado em 2016-03-16 na Wayback Machine VUSec, 2017
  99. ^ 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
  100. ^ Specter Attack Arquivado em 03/01/2018 na Wayback Machine Specter Attack
  101. ^ "Benchmark.js" . benchmarkjs.com . Arquivado do original em 19/12/2016 . Página visitada em 06-11-2016 .
  102. ^ JSBEN.CH. "JSBEN.CH Performance Benchmarking Playground para JavaScript" . jsben.ch . Arquivado do original em 2021-02-27 . Obtido em 2021-08-13 .
  103. ^ Eich, Brendan (3 de abril de 2008). "Popularidade" . Arquivado do original em 3 de julho de 2011 . Recuperado em 19 de janeiro de 2012 .
  104. ^ "Edge Browser Alterna WebAssembly para 'On' - Visual Studio Magazine" . Revista Visual Studio . Arquivado do original em 10/02/2018 . Obtido em 09/02/2018 .
  105. ^ "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

Ouça este artigo ( 48 minutos )
Ícone falado da Wikipedia
Este arquivo de áudio foi criado a partir de uma revisão deste artigo datada de 20 de agosto de 2013 e não reflete as edições subsequentes. ( 20/08/2013 )
0.067024946212769