Una primera mirada a JavaScript a través de los ojos de un desarrollador de Java



¡Java y JavaScript no son lo mismo! Ahora ya sabes el secreto principal de los masones. En este artículo, quiero compartir con ustedes pensamientos y pensamientos sobre el lenguaje JavaScript a través de los ojos de un desarrollador de Java. Compararé estructuras de datos, tipos, funciones, objetos, clases y otras características comunes de Java y JavaScript.

Fundacion


JavaScript es un lenguaje de scripts interpretado para escribir scripts. Esto significa que el código que escriba se ejecutará línea por línea, de instrucción a instrucción, de guión a guión. Java es un lenguaje compilado, lo que significa que antes de iniciar un programa Java, el compilador debe traducir todo el código que escribió en un código de máquina especial que sea comprensible para el código de bytes JVM.

Las desventajas para un desarrollador de Java que comenzó a escribir en JS relacionadas con estas diferencias serán las siguientes:

  • Antes de comenzar la compilación de su código escrito en Java, el compilador realizará análisis y análisis semántico para usted, y en caso de problemas, le notificará al respecto. Resulta que tienes la oportunidad de conocer el error antes de iniciar la aplicación. En JS, debido a la falta de un compilador, no existe tal verificación. Y los errores cometidos por usted al momento de escribir el código se detectarán solo después de que se inicie el script.
  • El siguiente inconveniente solo es posible para las versiones JS anteriores a ES5. Porque JavaScript se ejecuta estilo por línea de las funciones de escritura que llaman a otras funciones diferirán de los principios del código puro "tío" de Bob , predicado para escribir programas en Java. En JS, si necesita llamar a la función bar () desde la función foo () , debe definir bar () antes de foo () . Si hace lo contrario, como en las aplicaciones Java, la llamada puede fallar en algunos navegadores más antiguos.

//   Java public class JavaVsJS { public static void foo(String name) { bar(name); } private static void bar(String name) { System.out.println(name); } public static void main(String[] args) { JavaVsJS.foo("Igor Ivanovich"); } } 

 //   JavaScript var name = "Igor Ivanovich"; //  bar()      foo() function bar(name) { document.write(name); } function foo(name) { bar(name); } foo(name); 

Variables y sus tipos.


JavaScript es un lenguaje de tipo débil, a diferencia de Java. Por un lado, brinda más flexibilidad, por otro, más oportunidades para disparar un tiro en la pierna. Para declarar una variable en JS, es suficiente usar la palabra clave var , después de lo cual indica el nombre de la variable y, si es necesario, el valor. En la práctica, ni siquiera es necesario usar la palabra clave var .

 var name_1 = "Igor Ivanovich"; name_2 = "Renat Raphaelevich"; 

Ahora sobre los tipos. En JS, no hay diferentes tipos para enteros y números de coma flotante. Se combinan en número de tipo. String , boolean son los mismos que en Java. JS tiene un tipo de objeto . Si en Java es una superclase de todas las clases, en JS es solo uno de los tipos.

 var a_number = 10; // number var b_number = 10.01; // number var a_string = "10"; // string var b_string = "10.1"; // string var tr = true; //boolean var person = {name: "Igor", secondName: "Ivanovich"}; //object 

El desarrollador de Java no debe confundirse. Ahora intentemos realizar operaciones entre objetos de diferentes tipos y veamos qué sucede.

 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 

Algunos resultados pueden confundir un poco al desarrollador de Java. Por ejemplo, la capacidad de usar el tipo booleano de esta manera: verdadero && 1 y al mismo tiempo obtener algún tipo de resultado. En Java, es imposible llevar a cabo dicha operación porque el compilador generará un error que indica que no puede usar el operador && con tipos que no sean booleanos . Ahora prestemos atención a otra diferencia entre JS y Java: los operadores === y ! == . Estas son operaciones de comparación que necesita un lenguaje de tipo débil como JS. === - devolverá verdadero si los objetos comparados son iguales en valor y sus tipos coinciden. ! == , respectivamente, devolverá verdadero si los objetos comparados no tienen el mismo valor o sus tipos no coinciden. Veamos algunos ejemplos:

 10 == 10 > true 10 == "10" > true 10 === "10" > false 10 != "10" > false 10 !== "10" > true 10 !== 10 > false 

Las funciones


En JS, así como en Java, las funciones pueden devolver / no devolver un valor, con o sin argumentos. Puede llamar a la función tanto en código JS, como se muestra en el ejemplo anterior, como respondiendo a un evento específico en el elemento de marcado html.

 <!--          --> <input type="button" value="CLICK" onclick="foo();"> //  foo() function foo() { document.write("Calling foo"); } 

Cuando haga clic en el botón de la página, se imprimirá "Llamar a foo" como resultado de llamar a la función. Ahora sobre las rarezas a las que un desarrollador de Java podría prestar atención. Volvamos al ejemplo anterior, donde la función foo () llama a la función bar () en sí misma, que se usa solo como una función interna. Según la idea, esperamos que pueda hacerse privado. Pero no hay selectores de acceso en JS. No hay forma de hacer que el campo privado sea una simple adición de esta palabra antes de la declaración de la función. Vamos más allá. Creemos un objeto, una instancia de una clase con sus campos y un 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(); 

Si observa este código a través de los ojos de un desarrollador de Java, se puede observar que la función Person es un constructor de objetos de la clase Person y una definición de los campos y métodos incluidos en la clase. La función getLocation () es una función de la clase Person . En su interior, utilizamos el acceso a los campos de la clase de instancia this.person y this.age . Es lógico que esta función que usa la instancia actual de la clase Person solo funcione con ella y la última llamada a la función getLocation () no funcione. Pero, en JS esto es normal, porque los conceptos de una clase, función, métodos de clase son borrosos. Débil escribir en todo. Al ejecutar este script, recibirá el siguiente resultado en la ventana del navegador:

 Your name Igor, location = Vishnevaia 1 Your name undefined, location = rp Sokoloviy 

Sin embargo, reescribiendo el código de la siguiente manera, definiendo una función dentro de la clase, su llamada no está disponible para la instancia de clase:

 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(); 

La última llamada dará como resultado un error, porque la función getLocation () no está definida. Resulta que incluso en JS no hay modificadores de acceso, pero hay un alcance de funciones y variables controladas con llaves. JavaScript es maravilloso con una gran cantidad de opciones para dispararte en el pie.

Matrices


Cuando hablamos de matrices, representamos una estructura de datos que almacena el mismo tipo de elementos, a los que se accede por índice. Esto está en Java. Cuando se trata de JS y su escritura débil, entonces entra en juego la verdadera anarquía. En el siguiente ejemplo, creamos 4 matrices. En el primero hay elementos de diferentes tipos, en el segundo solo números, en el tercer booleano , en el cuarto booleano y 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); 

Después de ejecutar el script, veremos el tipo de cada elemento de cada matriz y la suma de los dos primeros dígitos de la 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 

Conclusión


Cuando toca por primera vez el lenguaje JavaScript, el desarrollador de Java puede experimentar todos los comentarios y preguntas anteriores. Cuando conocí a JS, no experimenté las emociones más divertidas. Más bien, era así: "¿Qué demonios ...?" Muchas diferencias y malentendidos radican en la diferencia entre las tipificaciones de dos idiomas. No sé por qué JS necesita escribir débilmente.

Quizás haya beneficios por los que esto se hizo. Si conoce la respuesta, escriba los comentarios.

Sí, existe TypeScript, que parece estar escrito, pero al final se traducirá al mismo JS. Personalmente, no soy partidario de la escritura débil, pero mi colega, que recientemente probó JavaScript, estaba encantado por alguna razón. Quizás esto es una cuestión de gustos. ¿Y qué crees que es mejor que escribir débil o fuerte?

Source: https://habr.com/ru/post/442438/


All Articles