
Java e JavaScript não são a mesma coisa! Agora você conhece o principal segredo dos maçons. Neste artigo, quero compartilhar com você pensamentos e opiniões sobre a linguagem JavaScript através dos olhos de um desenvolvedor Java. Compararei estruturas de dados, tipos, funções, objetos, classes e outros recursos comuns de Java e JavaScript.
Fundação
JavaScript é uma linguagem de script interpretada para escrever scripts. Isso significa que o código que você escreve será executado linha por linha, de instrução para instrução, de script para script.
Java é uma linguagem compilada, o que significa que, antes de iniciar um programa Java, o compilador deve converter todo o código que você escreveu em um código de máquina especial que seja compreensível para o JVM -
bytecode .
As desvantagens para um desenvolvedor Java que começou a escrever em JS relacionadas a essas diferenças serão as seguintes:
- Antes de iniciar a compilação do seu código escrito em Java, o compilador realizará uma análise semântica e análise para você e, em caso de problemas, o notificará. Acontece que você tem a oportunidade de descobrir o erro antes de iniciar o aplicativo. No JS, devido à falta de um compilador, não existe essa verificação. E os erros cometidos por você no momento da escrita do código serão detectados somente após o lançamento do script.
- O seguinte inconveniente é possível apenas para versões JS anteriores ao ES5. Porque O JavaScript é executado, estilo de linha por linha, de funções de escrita que chamam outras funções diferem dos princípios do código puro "tio" de Bob , pregado para escrever programas em Java. Em JS, se você precisar chamar a função bar () da função foo () , defina bar () antes de foo () . Se você fizer o oposto, como nos aplicativos Java, a chamada poderá falhar em alguns navegadores mais antigos.
Variáveis e seus tipos
JavaScript é uma linguagem de tipo fraco, diferente do Java. Por um lado, oferece mais flexibilidade, por outro - mais oportunidades para disparar um tiro na perna. Para declarar uma variável em JS, é suficiente usar a palavra-chave
var , após a qual indicar o nome da variável e, se necessário, o valor. Na prática, não é necessário nem usar a palavra-chave
var .
var name_1 = "Igor Ivanovich"; name_2 = "Renat Raphaelevich";
Agora sobre os tipos. Em JS, não existem tipos diferentes para números inteiros e números de ponto flutuante. Eles são combinados no
número do tipo.
String ,
booleano são os mesmos que em Java. JS tem um tipo de
objeto . Se em Java é uma superclasse de todas as classes, em JS é apenas um dos tipos.
var a_number = 10;
O desenvolvedor Java não deve ficar confuso. Agora vamos tentar executar operações entre objetos de diferentes tipos e ver o que acontece.
10 +1 > 11 10 +"1" > "101" true && false > false true && 1 > 1 true && 0 > 0 true && "1" > "1" false && "1" > false false && 0 > false 0.1 + 0.7 > 0.7999999999999999
Alguns resultados podem confundir um pouco o desenvolvedor Java. Por exemplo, a capacidade de usar o tipo
booleano desta maneira:
true && 1 e, ao mesmo tempo, obtém algum tipo de resultado. Em Java, é impossível realizar essa operação porque o compilador emitirá um erro dizendo que você não pode usar o operador && com outros tipos que não sejam
booleanos . Agora vamos prestar atenção a outra diferença entre JS e Java:
os operadores === e
! == . Essas são operações de comparação necessárias para uma linguagem de tipo fraco, como JS.
=== - retornará true se os objetos comparados forem iguais em valor e seus tipos coincidirem.
! == , respectivamente, retornará true se os objetos comparados não tiverem valor igual ou se seus tipos não corresponderem. Vejamos alguns exemplos:
10 == 10 > true 10 == "10" > true 10 === "10" > false 10 != "10" > false 10 !== "10" > true 10 !== 10 > false
Funções
Em JS, assim como em Java, as funções podem retornar / não retornar um valor, com ou sem argumentos. Você pode chamar a função no código JS, como mostrado no exemplo acima, e respondendo a um evento específico no elemento de marcação html.
<!-- --> <input type="button" value="CLICK" onclick="foo();"> // foo() function foo() { document.write("Calling foo"); }
Quando você clica no botão da página, “Calling foo” será impresso como resultado da chamada da função. Agora, sobre as curiosidades que um desenvolvedor Java pode prestar atenção. Retornemos ao exemplo acima, onde a função
foo () chama a função
bar () em si mesma - que é usada apenas como uma função interna. De acordo com a ideia, esperamos que possa ser tornada privada. Mas não há seletores de acesso no JS. Não há como tornar o campo
privado uma simples adição dessa palavra antes da declaração da função. Vamos mais longe. Vamos criar um objeto - uma instância de uma classe com seus campos e um método.
function getLocation() { if (this.person === "Igor" && this.age > 25) { document.write("Your name " + this.person + ", location = Vishnevaia 1"); } else { document.write("Your name " + this.person + ", location = rp Sokoloviy"); } } function Person(person, age) { this.person = person; this.age = age; this.getLocation = getLocation; } var igor = new Person("Igor", 26); igor.getLocation(); document.write("<br />"); getLocation();
Se você observar esse código pelos olhos de um desenvolvedor Java, pode-se observar que a função
Person é um construtor de objetos da classe
Person e uma definição dos campos e métodos incluídos na classe. A função
getLocation () é uma função da classe
Person . Dentro dele, usamos o acesso aos campos da classe de instância
this.person e
this.age . É lógico que essa função usando a instância atual da classe
Person funcione apenas com ela e a última chamada para a função
getLocation () não funcione. Mas, em JS, isso é normal, porque os conceitos de uma classe, função e métodos de classe são confusos. Digitação fraca em tudo. Ao executar este script, você receberá a seguinte saída na janela do navegador:
Your name Igor, location = Vishnevaia 1 Your name undefined, location = rp Sokoloviy
No entanto, reescrevendo o código da seguinte forma, definindo uma função dentro da classe, sua chamada não está disponível para a instância da classe:
function Person(person, age) { this.person = person; this.age = age; this.getLocation = function () { if (this.person === "Igor" && this.age > 25) { document.write("Your name " + this.person + ", location = Vishnevaia 1"); } else { document.write("Your name " + this.person + ", location = rp Sokoloviy"); } }; } var igor = new Person("Igor", 26); igor.getLocation(); document.write("<br />"); getLocation();
A última chamada resultará em um erro, porque a função
getLocation () não está definida. Acontece que, mesmo em JS, não há modificadores de acesso, mas há um escopo de funções e variáveis controladas com chaves. O JavaScript é maravilhoso, com um grande número de opções para dar um tiro no próprio pé.
Matrizes
Quando falamos de matrizes, representamos uma estrutura de dados que armazena o mesmo tipo de elementos, que são acessados por índice. Isso está em Java. Quando se trata de JS e sua digitação fraca, a anarquia real entra em jogo. No exemplo a seguir, criamos 4 matrizes. No primeiro, existem elementos de tipos diferentes, no segundo apenas números, no terceiro
booleano , no quarto
booleano e
número :
var mix = [3, "Igor Ivanovich", "Renat Raphaelevich", "Sergey Sergeevich", 1, 12.3, true]; var numbers = [1,2,3,4,5]; var booleans = [false, false, true]; var mix2 = [false, 1, 2]; document.write("Type elements in mix: "); for (element in mix) { document.write(typeof mix[element] + " "); } document.write("<br /> Type elements in numbers: "); for (element in numbers) { document.write(typeof numbers[element] + " "); } document.write("<br /> Type elements in booleans: "); for (element in booleans) { document.write(typeof booleans[element] + " "); } document.write("<br /> Type elements in mix2: "); for (element in mix2) { document.write(typeof mix2[element] + " "); } var sum = numbers[0] + numbers[1]; document.write("<br /> sum numbers = " + sum);
Depois de executar o script, veremos o tipo de cada elemento de cada matriz e a soma dos dois primeiros dígitos da matriz de números.
Type elements in mix: number string string string number number boolean Type elements in numbers: number number number number number Type elements in booleans: boolean boolean boolean Type elements in mix2: boolean number number sum numbers = 12
Conclusão
Quando você toca pela primeira vez na linguagem JavaScript, o desenvolvedor Java pode enfrentar todos os comentários e perguntas acima. Quando conheci JS, não senti as emoções mais divertidas. Em vez disso, era assim: "O que ...?" Muitas diferenças e mal-entendidos estão na diferença entre as tipificações de duas línguas. Não sei por que o JS precisa de digitação fraca.
Talvez haja benefícios por que isso foi feito. Se você souber a resposta, escreva nos comentários.
Sim, existe o TypeScript, que parece ser digitado, mas no final será traduzido para o mesmo JS. Pessoalmente, eu não sou um defensor da digitação fraca, mas meu colega, que recentemente tentou o JavaScript, ficou por algum motivo satisfeito com isso. Talvez isso seja uma questão de gosto. E o que você acha melhor do que a digitação fraca ou forte?