ECMAScript快速入门——对比Java

我是来自58同城的一名Android开发工程师,可以帮你内推所有技术岗位。

如果这篇文章帮助到了你,欢迎点赞、留言,关注点赞不迷路。

ECMAScript作为JavaScript和微信小程序开发的基础,是学习过程中的一个重要单元,为了降低学习成本,现将我在W3CSchool的学习笔记分享出来,希望能够帮到更多想要快速掌握这门技术的同学:


资料来源:W3CSchool

和Java一样,ECMAScript区分大小写,注释的格式相同,通过{}确定代码块,原始数据类型存储在堆栈,对象的引用存储在堆中 。

变量是弱类型的

与Java和C不同,ECMAScript中的变量无特定的类型,定义变量时只用var运算符,可以将它初始化为任意值。

因此,可以随时改变变量所存数据的类型(尽量避免这样做)。

关于语句的结尾分号

ECMAScript则允许开发者自行决定是否以分号结束一行代码。如果没有分号,ECMAScript就把折行代码的结尾看做该语句的结尾(与Visual Basic和VBScript相似),前提是这样没有破坏代码的语义。

括号表示代码块

从Java中借鉴的另一个概念是代码块。

代码块表示一系列应该按顺序执行的语句,这些语句被封装在左括号({)和右括号(})之间。

关于变量初始化:

与Java不同,ECMAScript中的变量并不一定要初始化(它们是在幕后初始化的,将在后面讨论这一点)。

变量声明不是必须的

ECMAScript另一个有趣的方面(也是与大多数程序设计语言的主要区别),是在使用变量之前不必声明。

关于ECMA的关键字:

关于ECMA的保留字:

保留字在某种意思上是为将来的关键字而保留的单词。因此保留字不能被用作变量名或函数名。

关于原始类型和引用类型:

在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值。

原始值存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。

引用值存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。为变量赋值时,ECMAScript 的解释程序必须判断该值是原始类型,还是引用类型。要实现这一点,解释程序则需尝试判断该值是否为 ECMAScript 的原始类型之一,即 Undefined、Null、Boolean、Number 和 String 型。由于这些原始类型占据的空间是固定的,所以可将他们存储在较小的内存区域 - 栈中。这样存储便于迅速查寻变量的值。

在许多语言中,字符串都被看作引用类型,而非原始类型,因为字符串的长度是可变的。ECMAScript 打破了这一传统。

如果一个值是引用类型的,那么它的存储空间将从堆中分配。由于引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。

关于ECMA的原始类型:

ECMAScript 有 5 种原始类型(primitive type),即 Undefined、Null、Boolean、Number 和 String。ECMA-262 把术语类型(type)定义为值的一个集合,每种原始类型定义了它包含的值的范围及其字面量表示形式。

ECMAScript 提供了 typeof 运算符来判断一个值是否在某种类型的范围内。可以用这种运算符判断一个值是否表示一种原始类型:如果它是原始类型,还可以判断它表示哪种原始类型。

关于字符串的大小比较:

对于字符串,第一个字符串中每个字符的代码都与会第二个字符串中对应位置的字符的代码进行数值比较。完成这种比较操作后,返回一个 Boolean 值。问题在于大写字母的代码都小于小写字母的代码,这意味这着可能会遇到下列情况:

var bResult = "Blue" < "alpha";

alert(bResult); //输出 true

在上面的例子中,字符串 "Blue" 小于 "alpha",因为字母 B 的字符代码是 66,字母 a 的字符代码是 97。要强制性得到按照真正的字母顺序比较的结果,必须把两个数转换成相同的大小写形式(全大写或全小写的),然后再进行比较:

var bResult = "Blue".toLowerCase() < "alpha".toLowerCase();

alert(bResult); //输出 false

把两个运算数都转换成小写,确保了正确识别出 "alpha" 在字母顺序上位于 "Blue" 之前。

关于数字和字符串的比较:

无论何时比较一个数字和一个字符串,ECMAScript 都会把字符串转换成数字,然后按照数字顺序比较它们。

不过,如果字符串不能转换成数字又该如何呢?考虑下面的例子:

var bResult = "a" < 3;

alert(bResult);

你能预料到这段代码输出什么吗?字母 "a" 不能转换成有意义的数字。不过,如果对它调用 parseInt() 方法,返回的是 NaN。根据规则,任何包含 NaN 的关系运算符都要返回 false,因此这段代码也输出 false:

var bResult = "a" >= 3;

alert(bResult);

通常,如果小于运算的两个值返回 false,那么大于等于运算必须返回 true,不过如果某个数字是 NaN,情况则非如此。

关于ECMA的等性运算符:

判断两个变量是否相等是程序设计中非常重要的运算。在处理原始值时,这种运算相当简单,但涉及对象,任务就稍有点复杂。

ECMAScript 提供了两套等性运算符:等号和非等号用于处理原始值,全等号和非全等号用于处理对象。

关于等性运算时的转换问题:

关于ECMA的标签语句:

关于ECMA的标签语句:

关于ECMA的对象:

在Javascript语言体系中,不存在类(Class)的概念的,javascript中不是基于‘类’的,而是通过构造函数(constructor)和原型链(prototype chains)实现的。

什么是构造函数?

构造函数,就是提供了一个生成对象的模板并描述对象的基本结构的函数。一个构造函数,可以生成多个对象,每个对象都有相同的结构。总的来说,构造函数就是对象的模板,对象就是构造函数的实例。

构造函数的特点有:

  • 构造函数的函数名首字母必须大写。

  • 内部使用this对象,来指向将要生成的对象实例。

  • 使用new操作符来调用构造函数,并返回对象实例。

关于ECMA的 arguments对象:

arguments对象就是在函数调用过程中,函数在无需指定形参的情况下,函数内部可以通过arguments[INDEX]就可以访问到传入的实参,并且,利用该性质,还可以实现函数的重载模拟,即,可以传入不同数量的参数。

关于ECMA内置对象

关于ECMA的prototype属性:

关于ECMA对象的作用域:

ECMA只存在一种作用域,所有的对象的属性和方法都是公有的

一般来说,用下划线来提示其他开发者,该对象为私有

例:

提示color属性为私有属性

ECMA的静态作用域:

ECMA没有静态作用域,但可以给函数不在其内部定义的情况下提供给其属性和方法,例如:

alternate就是后加入的方法,并且支持调用

关于ECMA的对象废除:

将对象指向null即可

如何理解ECMA中的关键字this:

它用在对象的方法中。关键字 this 总是指向调用该方法的对象

ECMAScript中主流的类或对象创建方式?

目前使用最广泛的是混合的构造函数/原型方式,此外,

动态原型方法也很流行,在功能上与构造函数/原型方式等价。可以采用这两种方式中的任何一种。不过不要单独使用经典的构造函数或原型方式

下面分别介绍这两种方式:

混合的构造函数/原型方式:

联合使用构造函数和原型方式,就可像用其他程序设计语言一样创建对象。这种概念非常简单,即用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)。结果是,所有函数都只创建一次,而每个对象都具有自己的对象属性实例。

动态原型方法:

可以用prototype属性来实现类似Java的函数重载效果

发布了46 篇原创文章 · 获赞 12 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/huma8848888/article/details/104334153