通过Java开发人员的眼光来看JavaScript



Java和JavaScript是不一样的! 现在您知道了泥瓦匠的主要秘密。 在本文中,我想通过Java开发人员的观点与您分享有关JavaScript语言的想法。 我将比较Java和JavaScript的数据结构,类型,函数,对象,类和其他常见功能。

基金会


JavaScript是一种用于编写脚本的解释性脚本语言。 这意味着您编写的代码将逐行执行,从指令到指令,从脚本到脚本。 Java是一种编译语言,这意味着在启动Java程序之前,编译器必须将您编写的所有代码转换为JVM 字节码可以理解的特殊机器代码。

与这些差异相关的Java开发人员开始使用JS编写的缺点如下:

  • 在开始编译用Java编写的代码之前,编译器将为您进行解析和语义分析,并在出现问题时将通知您。 事实证明,您有机会在启动应用程序之前查明错误。 在JS中,由于缺少编译器,因此没有这种检查。 而且,只有在脚本启动后,您才能检测到编写代码时所犯的错误。
  • 以下不便之处仅适用于ES5之前的JS版本。 因为 JavaScript是通过逐行执行的编写函数的方式来执行的,该函数调用其他函数将不同于Bob的“叔叔”纯代码的原理,该原理是为用Java编写程序而鼓吹的。 在JS中,如果需要从foo()函数调用bar()函数,则必须在foo()之前定义bar () 。 如果您执行相反的操作(例如在Java应用程序中),则在某些较旧的浏览器中调用可能会失败。

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

变量及其类型


与Java不同,JavaScript是一种弱类型语言。 一方面,它提供了更大的灵活性,另一方面-提供了更多向腿部射击的机会。 要在JS中声明变量,使用var关键字就足够了,然后在其后指示变量名称以及必要时的值。 实际上,甚至不必使用var关键字。

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

现在介绍类型。 在JS中,整数和浮点数没有不同的类型。 它们按类型编号组合。 Stringboolean与Java中的相同。 JS具有对象类型。 如果在Java中它是所有类的超类,则在JS中它只是其中一种类型。

 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 

Java开发人员不应混淆。 现在,让我们尝试在不同类型的对象之间执行操作,看看会发生什么。

 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 

一些结果可能会使Java开发人员有些困惑。 例如,以这种方式使用布尔类型的能力: true && 1并同时获得某种结果。 在Java中,不可能执行这样的操作,因为 编译器将给出一个错误,指出您不能将&&运算符与boolean以外的类型一起使用。 现在让我们注意JS和Java之间的另一个区别: ===!== 运算符 。 这些是弱类型语言(例如JS)所需的比较操作。 === -如果比较的对象的值相等且它们的类型一致,则返回true。 如果比较对象的值不相等或它们的类型不匹配,则!==将分别返回true。 让我们看几个例子:

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

功能介绍


在JS和Java中,函数可以返回/不返回带或不带参数的值。 您可以使用JS代码调用该函数,如上面的示例所示,也可以通过响应html标记元素上的特定事件来调用该函数。

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

当您单击页面上的按钮时,由于调用函数,将显示“ Calling foo”。 现在介绍Java开发人员可能要注意的怪异之处。 让我们回到上面的示例,其中函数foo()本身调用了函数bar() -仅用作内部函数。 根据这个想法,我们希望可以将其私有化。 但是JS中没有访问选择器。 在函数声明之前,没有办法使私有字段简单地添加这个词。 让我们走得更远。 让我们创建一个对象-具有其字段和一个方法的类的实例。

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

如果通过Java开发人员的眼光看一下这段代码,可以看到Person函数是Person类的对象的构造函数,以及构成该类的字段和方法的定义。 getLocation()函数是Person类的函数。 在其中,我们使用对实例类this.personthis.age的字段的访问。 符合逻辑的是,使用Person类当前实例的此函数应仅与之一起使用,而对getLocation()函数的最后一次调用不应起作用。 但是,在JS中这是正常的,因为类,函数,类方法的概念是模糊的。 键入内容不足。 通过执行此脚本,您将在浏览器窗口中收到以下输出:

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

但是,按如下所示重写代码,在类内部定义一个函数,其调用不适用于该类实例:

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

最后一次通话将导致错误,因为 未定义getLocation()函数。 事实证明,即使在JS中也没有访问修饰符,但是仍然存在使用花括号控制的函数和变量。 JavaScript很棒,有很多选择可以使自己步履蹒跚。

数组


当我们谈论数组时,我们代表的是一个存储相同类型元素的数据结构,这些元素可以通过索引进行访问。 这是用Java编写的。 当涉及到JS及其弱类型时,真正的无政府状态就会发挥作用。 在下面的示例中,我们创建4个数组。 在第一个中有不同类型的元素,在第二个数字中,在第三个布尔中 ,在第四个布尔中,还有number

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

执行脚本之后,我们将看到每个数组的每个元素的类型以及数字数组中前两位数字的总和。

 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 

结论


首次触摸JavaScript语言时,Java开发人员可能会遇到上述所有注释和问题。 初次见识JS时,我没有遇到最有趣的情绪。 相反,它是这样的:“什么……?” 两种语言的不同之处之间存在许多差异和误解。 我不知道为什么JS需要弱类型。

这样做有好处。 如果您知道答案,请在评论中写。

是的,有TypeScript,它似乎已键入,但最终它将被翻译成相同的JS。 就个人而言,我不是弱类型的支持者,但是最近尝试使用JavaScript的我的同事出于某种原因对此感到满意。 也许这是一个品味问题。 您认为什么比弱打字还是强打字更好?

Source: https://habr.com/ru/post/zh-CN442438/


All Articles