javascript-语法

      学习php,javascript是一个绕不开的技能,本文是根据大牛的总结笔记形成的,并非个人创作,尊重原创。

     



语法

1.区分大小写

2.标识符:第一个必须是一个字母,下划线或一个美元符号,其它字符可以是字母,下划线,美元符号或者数字。采用驼峰大小写格式,第一个字母小写,剩下的每个有意义的单词首字母大写。

3.单行注释和块级注释

4.严格模式:ECMAScript5引入了严格模式(strict mode)。严格模式是为JavaScript定义了一种不同的解析和执行模型。在严格模式下,ECMAScript3中一些不确定的行为得到处理,而且对某些不安全的操作也会抛出错误。要在整个脚本中启用严格模式,可以在顶部添加如下代码:”use strict”。它是一个编译指示(pragma),用于告诉支持的JavaScript引擎切换到严格模式。这是为不破坏ECMAScript3而特意选定的语法。在函数内部的上方包含这条编译指示,可以指定函数在严格模式下执行。支持严格模式的浏览器包括IE10+,Firefox4+,Safari5.1+,Opera12+,Chrome。

5.语句:以分号结尾,如果省略,由解析器确定语句的末尾。建议不要省略。加上分号可以避免很多错误,可以放心通过删除多余的空格来压缩代码(代码行结尾处没有分号会导致压缩错误)。加上分号也会在某些情况下增进性能,这样解析器就不需要花时间来推测在哪里插入分号。

6.关键字和保留字不能用作标识符。

7.ECMAScript的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。即每个变量仅仅是一个用于保存值的占位符而已。初始化的过程就是给变量赋一个值,因此可以在修改变量值的同时修改值的类型。要注意的是,使用var操作符定义的变量将成为定义该变量的作用域中的局部变量。也就是说,如果在函数中使用var定义一个变量,那么这个变量在函数退出后就会被销毁。

8.在函数中如果省略var操作符,创建的则是全局变量。虽然省略var操作符可以定义全局变量,但是不推荐。在局部作用域中定义全局变量很难维护,而且如果有意忽略了var操作符,也会由于相应变量不会马上有定义而导致不必要的混乱。给未经声明的变量赋值在严格模式下会抛出ReferenceError错误

9.可以使用一条语句定义多个变量,只要用逗号隔开。在严格模式下,不能定义名为eval和arguments的变量,否则会导致语法错误

10.五种简单的数据类型(基本数据类型):Undefined,Null,Boolean,Number和String。还有一种复杂数据类型Object,Object本质上由一组无序的键值对组成。ECMAScript不支持任何创建自定义类型的机制,所有值都将是以上6中数据类型之一。

11.检测给定变量的数据类型typeof。如果值为对象或者null,则返回object,如果是函数,则返回function。typeof是一个操作符而不是函数。

12.null被认为是一个空的对象引用。Safari5及之前的版本,Chrome7及以前的版本对正则表达式调用typeof会返回function,而其他的返回object。

13.Undefined类型:Undefined类型只有一个值,即undefined。在使用var声明变量但未对其加以初始化的时候,这个变量的值就是undefined。一般而言,不存在需要显示将一个变量设置为undefined值的情况。字面值undefined的主要目的是用于比较,而ECMA-262第3版之前并没有规定这个值。第3版引入这个值是为了正式区分空对象指针与未经初始化的变量

14.包含undefined值的变量与尚未定义的变量还是不一样。使用尚未定义的变量会出错。对于尚未定义声明的变量,只能进行一项操作,即使用typeof操作符检测数据类型,返回的结果是undefined值,和对未初始化包含undefined值的变量进行检测返回的结果一样。即使未初始化的变量会被自动赋予undefined值,但是显示地初始化变量仍是明智的选择。如果能够做到这一点,那么当typeof操作符返回undefined值的时候,我们就知道被检测的变量还没有被声明,而不是没有初始化。

15.Null类型:Null类型也只有一个值,即null。null值表示一个空对象指针。如果定义的变量准备在将来用于保存对象,最后将变量初始化为null而不是其他值。这样,只要直接检查null值就可以知道相应变量是否已经保存了一个对象的引用。

16.undefined值是派生自null值的。因此ECMA-262规定它们的相等性检测==返回true。

17.Boolean类型:有两个值true和false。要将一个值转换为对应的Boolean值,可以调用转型函数Boolean()。任何非空字符串都会转换为true,而””(空字符串)转换成false;如何非零数字值(包括无穷大)转换为true,而0和NaN转换成false;任何对象都转换为true,null转换为false;undefined转换为false。

18.Number类型:使用IEEE754格式来表示整数和浮点数值。为支持各种数值类型,ECMA-262定义了不同的数值字面量格式。最基本的数值字面量格式是十进制整数。整数还可以通过八进制或16进制来表示。8进制第一位必须是0,然后是八进制数字序列(0-7),如果后面的数值超出范围,前导零就会被忽略。八进制字面量在严格模式下是无效的,会导致JavaScript引擎抛出错误。十六进制字面值的前两位必须是0x。在进行算术计算时,所有八进制和十六进制表示的数值最终都会被转换成十进制数值。鉴于JavaScript中保存数值的方式,可以保存正零(+0)和负零(-0)。两者被认为相等。

19.浮点数值:该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。虽然小数点前面可以没有整数,但是不推荐。由于保存浮点数值需要的内存空间是保存整数值的两部,因此ECMAScript会不失时机的将浮点数值转换为整数值。显然,如果小数点后面没有跟任何数字,那么这个值就可以作为整数值保存,同样,如果浮点数本身表示的是一个整数,那么该值也会被转换成整数。

20.对于极大或极小的数值,可以用e表示法(科学计数法)表示的浮点数值表示。用e表示法表示的数值等于e前面的数值乘于10的指数次幂。ECMAScript中e表示法的格式也是如此,即前面是一个数值,整数或者浮点数,中间一个大写或者小写的e,后面是10的幂指数,该幂值用来和前面的数相乘。默认情况下,ECMAScript会将那些小数点后面带有6个零以上的浮点数值转换成用e表示法表示的数值。浮点数值的最高精度是17位小数,但是在进行算术计算时其精确度远远不如整数。例如,0.1加0.2的结果不是0.3。这个小小的舍入误差会导致无法测试特定的浮点数值。不要做这样的测试:if(a+b==0.3){...}

21.由于内存的限制,ECMAScript能够表示的最小数值保存在Number.MIN_VALUE中,多数浏览器中,这个值是5e-24,最大数值保存在Number.MAX_VALUE中,多数浏览器中,这个值是1.7976931348623157e+308.如果某次计算结果超出范围,将会自动转换成Infinity值,如果是负数,则转换成-Infinity值,如果为正,则是+Infinity。返回了Infinity值之后,这个值就无法继续参与计算。使用isFinite()函数可以检测数值是否是有穷的。

22.NaN,非数值(Not a Number)。这个数值用于表示本来要返回数值的操作数未返回数值的情况。在ECMAScript中,任何数值除以0会返回NaN,因此不会影响其它代码的执行。特点:涉及NaN操作都会返回NaN,NaN与任何值都不相等,包括NaN本身。ECMAScript定义了isNaN()函数,接受一个参数,它会尝试将这个值转换为数值,任何不能被转换为数值的值都会导致其返回true。isNaN()也适用于对象,在基于对象调用该函数时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换成数值。如果不能,则基于这个返回值再调用toString()方法,再测试返回值。这个过程也是ECMAScript中内置函数和操作符的一般执行流程。

23.数值转换:有三个函数可以把非数值转换成数值:Number(),parseInt(),parseFloat()。第一个可以用于任何数据类型,后两个专门用于把字符串转换成数值。如果是Boolean值,true和false分别转换成1和0;如果是数字值,只是简单的传入和返回;如果是null,返回0,如果是undefined,返回NaN;如果是字符串,规则如下:如果字符串只包含数字,包括前面带正负号的情况,则转换成十进制数值(前导零忽略);如果字符串包含有效的浮点格式,转换成对象的浮点数值(同样忽略前导零);如果字符串包含有效的十六进制格式,转换成相同大小的十进制整数值;如果字符串是空的,转换为0;如果字符串包含其它的字符,转换成NaN;如果是对象,则会调用对象的valueOf方法,然后按照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString方法,然后再按照前面的规则转换返回的字符串值。

24.parseInt在转换的时候,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直到找到第一个非空格字符。如果第一个字符不是数字字符或者符号,parseInt返回NaN,也就是说,用parseInt转换空字符串返回NaN。如果第一个字符是数字字符,parseInt继续解析第二个字符,直到解析完所有后续字符或者遇到一个非数字字符。小数点不是有效的数字字符。如果字符串中第一个字符是数字字符,parseInt也能够识别各种整数格式。如果字符串以”0x”开头且后面跟数字字符,就会当作一个十六进制整数。如果是”0”开头且后跟数字字符,会当作一个八进制来解析。

25.ECMAScript5相较于ECMAScript3,parseInt已经不具有解析八进制数值的能够,因此会导致前导零无效。为了消除这种困惑,可以提供第二个参数,转换时使用的基数(进制)。如果知道要解析的是十六进制格式的字符串,那么指定基数16为第二个参数,就能得到正确的结果。实际上,如果指定了16作为第二个参数,字符串可以不带前面的0x

26.parseFloat()也是从第一个字符开始解析每个字符串,而且也是一直解析到字符串的末尾,或者解析遇见一个无效的浮点数字字符为止。也就是说,字符串中第一个小数点是有效的,第二个就是无效的了,因此后面的字符串将被忽略。parseFloat()与parseInt()的区别在于它始终都会忽略前导的零。parseFloat()可以识别前面讨论过的所有浮点数值格式,也包括十进制整数格式,但是十六进制格式的字符串始终被转换成0。parseFloat()只解析十进制值,因此没有第二个参数。注意:如果字符串包含的额是一个可解析为整数的数,没有小数点或者小数点之后都是零,parseFloat会返回整数。

27.String类型:String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。用双引号和单引号表示的字符串完全相同。

28.字符字面量:String包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符。任何字符串的长度可以通过访问其length属性取得。如果字符串包含双字节字符,那么length属性可能不会精确返回字符串中的字符数目。

29.ECMAScript中的字符串是不可变的,也就是说一旦创建,他们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。这个过程是在后台发生的,而这也是某些旧版的浏览器拼接字符串速度慢的原因所在。

30.转换字符串:使用几乎每个值都有的toString()方法。这个方法唯一要做的就是返回相应值的字符串表现。数值,布尔值,对象和字符串值都有这个方法,而undefined和null没有这个方法。字符串的toString方法,返回字符串的一个副本。多数情况下,调用toString方法不必传递参数,但是在调用数值的toString()方法时,可以传递一个参数:输出数值的基数。在不知道要转换的值是不是null或者undefined的情况下,还可以使用转型函数String(),这个函数可以将任何类型的值转换为字符串。转换规则:a.如果值有toString方法,则调用该方法并返回相应的结果b.如果值为null,则返回”null”。c.如果值为undefined,则返回”undefined”。

31.对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。var o = new Object();在ECMAScript中,如果不给构造函数传递参数,则可以省略后面那一对圆括号。但是不推荐。在ECMAScript中,Object类型是所有它的实例的基础。即Object类型所具有的任何属性和方法也同样存在更具体的对象中。

32.Object的每个实例都具有下列属性和方法:Constructor:保存着用于创建当前对象的函数,对于前面的例子,构造函数就是Object();hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例(不是在实例的原型中)中是否存在,参数必须以字符串形式指定;isPropertyOf(object):用于检查传入的对象是否是另一个对象的原型;propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举;toLocalString():返回对象的字符串表示,该字符串与执行环境的地区对应;toString():返回对象的字符串表示;valueOf():返回对象的字符串,数值或者布尔值表示。通常与toString方法的返回值相同。

33.从技术角度讲,ECMA-262中对象的行为不一定适用于JavaScript中的其他对象。浏览器环境中的对象,比如BOM和DOM中的对象,都是宿主对象,他们是由宿主实现提供和定义的,ECMA-262不负责定义宿主对象,因此宿主对象可能会也可能不会继承Object。

34.操作符:ECMAScript操作符的与众不同在于,他们能够适用很多值。不过在应用于对象时,相应的操作符通常都会调用对象的valueOf()和(或)toString()方法,以便取得可操作的值。

35.一元递增和递减操作符:前置型和后置型。遵循规则:a.在应用于一个包含有效数字字符的字符串时,先将其转换成数字值,再执行加减1的操作,字符串变量变成数值变量。b.在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN,字符串变量变成数值变量。c.在应用于false时,先转换成0,然后执行加减1的操作,布尔值变成数值变量。在应用于true时,先转换成1。d.在应用于浮点数时,执行加减1的操作;e.在应用于对象时,先调用对象的valueOf方法以取得一个可控操作的值,然后应用上面的规则,如果结果是NaN,则再调用toString方法再应用上面的规则。对象变量变成数值变量。

36.一元加和减操作符:在对非数值应用操作符的时候,该操作符会像Number()转型函数一样对值进行转换。一元加操作符放在数值前面,对数值不会产生任何影响。

37.位操作符:用于最基本的层次上,即按内存中表示数值的位来操作数值。ECMAScript中的所有数值都以IEEE-754 64位格式存储,但位操作符并不直接操作64位的值。而是先将64位的值转换成32位的整数,然后执行操作,最后再将结果转换回64位。对于有符号的整数,前31位用于表示整数的值,第32位表示数值的符号。负数同样以二进制码存储,但是使用的格式是二进制补码。

38.求补码的过程:求这个数值绝对值的二进制码;求二进制反码,0替换成1,1替换成0;得到的二进制反码加1.

39.要注意的是,在处理有符号整数时,是不能访问位31的。ECMAScript会尽力向我们隐藏这些信息。所以在以二进制字符串形式输出一个负数时,我们看到的只是这个负数绝对值的二进制码前面加上一个负号。默认情况下,ECMAScript中所有的整数都是有符号整数。在ECMAScript中,当对数值应用位操作符时,后台发生如下转换过程:64位的数值转换成32位数值,然后执行位操作,最后再将32位结果转换回64位数值。这个转换过程会导致一个严重的副效应,即在对特殊的NaN和Infinity值应用位操作时,这两个值会被当作0来处理。如果对非数值应用位操作符,会先使用Number将该值转换为一个数值,然后再应用位操作符。得到的结果将是一个数值。

40.按位非(NOT),该操作符由一个波浪线~表示。执行按位非的结果就是返回数值的反码。按位非操作的本质:操作数的负值减1.~~的用途就是将操作数转换为32位有符号整数

41.按位与(AND),由&表示,有两个操作数。本质上讲,按位与操作就是将两个数值的每一位对齐,然后进行and操作。

42.按位或(OR),由|表示,同样有两个操作数。

43.按位异或(XOR),由^表示,进行异或操作。

44.左移,由<<表示,将数值的所有位向左移动指定的位数。向左移动后,原数值的右侧多出几个空位,左移操作会以0来填充这些空位,以便得到的结果是一个完整的32位二进制数。左移不会影响操作数的符号位。

45.有符号的右移,由>>表示,这个操作符会将数值向右移动,但保留符号位。同样,在移位过程中,原数值也会出现空位,只不过这次的空位出现在原数值的左侧,符号位的右侧。此时ECMAScript会用符号位的值来填充所有空位,以便得到一个完整的值。

46.无符号的右移,由>>>表示,这个操作符会将数值的所有32位都向右移动。对正数来说,无符号右移的结果和有符号右移相同。对负数来说,首先,无符号右移是以0来填充空位。其次,无符号右移操作符会把负数的二进制码当作正数的二进制码,而且由于负数以其绝对值的二进制补码形式表示,因此会导致无符号右移后的结果非常大。

47.逻辑非操作符,由!表示,可以应用于ECMAScript中的任何值。无论这个值是什么数据,这个操作符都会返回一个布尔值。它会首先将操作数转换为一个布尔值,然后再进行取反。a.操作数是一个对象,返回false;b.操作数是一个空字符串,返回true,非空字符串,返回false;c.操作数是数值0,返回true,任意非零数值,包括Infinity,返回false;d.操作数是null,返回true;e.操作数是NaN,返回true;f.操作数是undefined,返回true。同时使用两个逻辑非操作符,实际上就会模拟Boolean()转型函数的行为。

48.逻辑与,由&&表示,有两个操作数。可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值。遵循规则:a.如果第一个操作数是对象,则返回第二个操作数;b.如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象;c.如果两个操作数都是对象,返回第二个操作数;d.如果有一个操作数是null,返回null;e.如果有一个操作数是NaN,返回NaN;f.如果有一个操作数是undefined,则返回undefined.在逻辑与操作中使用未定义的值会导致错误。

49.逻辑或,由||表示,两个操作数。如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值。遵循规则:a.第一个操作数是对象,返回第一个操作数;b.第一个操作数的求值结果为false,返回第二个操作数;c.两个操作数都是对象,返回第一个操作数;d.两个操作数都是null/NaN/undefined,返回null/NaN/undefined。

50.乘性操作符:乘法,除法,求模。在操作数为非数值的情况下会执行自动的类型转换。即先使用Number()将其转换为数值。

51.乘法。处理规则:a.操作数都是数值,如果乘积超过数值的表示范围,则返回Infinity或-Infinity;b.如果有一个操作数是NaN,结果为NaN;c.如果Infinity与0相乘,结果为NaN;d.如果Infinity与非0值相称,则结果为Infinity或-Infinity;e.Infinity与Infinity相乘,结果为Infinity;d.如果一个操作数不是数值,在后台调用Number()将其转换为数值,再应用上面的规则。

52.除法。处理规则:a.操作数都是数值,如果商超过数值的表示范围,则返回Infinity或-Infinity;b.如果有一个操作数是NaN,结果为NaN;c.如果Infinity与Infinity相除,结果为NaN;d.如果非零的有限数被0除,则结果为Infinity或-Infinity;e.0和0相除,结果为NaN;e.如果Infinity被任何非零数值除,结果是Infinity或者-Infinity;f.如果一个操作数不是数值,在后台调用Number()将其转换为数值,再应用上面的规则。

53.求模。处理规则:a.都是数值,正常处理;b.如果被除数是无穷大值而除数是有限大的数值,结果为NaN;c.如果被除数是有限大的数值而除数是0,结果为NaN;d.如果Infinity被Infinity除,结果是NaN;e.如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;f.被除数为0,则结果为0;g.如果有一个操作数不是数值,先调用Number()转换成数值,再运用上面的规则。

54.加性操作符:加法和减法,也会在后台转换不同的数据类型。

55.加法规则:a.有一个操作数是NaN,则结果是NaN;b.Infinity加Infinity,-Infinity加-Infinity,结果分别为Infinity和-Infinity;c.Infinity加-Infinity,结果为NaN;d.如果是+0加+0,-0加-0,结果分别为+0和-0;e.如果是+0加-0,结果为+0.如果有一个操作符是字符串,规则如下:a.如果两个操作数都是字符串,则将字符串拼接起来;如果只有一个操作数是字符串,则调用toString()方法将另一个操作数转换为字符串,然后拼接。对于undefined和null,分别调用String()函数并取得字符串”undefined”和”null”.

56.减法规则:a.有一个操作数是NaN,则结果是NaN;b.如果Infinity减Infinity,或者-Infinity减-Infinity,结果为NaN;c.如果Infinity减-Infinity,-Infinity减Infinity,结果是Infinity和-Infinity;d.+0减+0,结果为+0,-0减-0,结果为-0;e.-0减-0,结果为+0;f.如果有一个操作数是字符串,布尔值,null或者undefined,则先在后台调用Number()函数将其转换为数值,然后再进行减法操作;g.如果有一个操作数是对象,则调用对象的valueOf方法以取得表示该对象的数值,如果对象没有valueOf方法,则调用toString()方法并将得到的字符串转换为数值。

57.当关系操作符的操作数使用了非数值,也要进行数据转换。规则:a.如果两个操作数都是数值,则执行数值比较;b.如果两个操作数都是字符串,则比较两个字符串对应的字符编码值,大写的字符编码全部小于小写字母的字符编码;c.如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较;d.如果一个操作数是对象,则调用valueOf方法,用得到的结果按照前面的规则进行比较。如果没有valueOf方法,调用toString方法,并用得到的结果根据前面的规则执行比较;e.如果一个操作符是布尔值,则先转换为数值,再执行比较;f.任何操作数与NaN进行关系比较,结果都是false。

58.相等操作符:相等和不相等--先转换再比较;全等和不全等--仅比较而不转换。

59.相等和不相等:这两个操作符都会先转换操作数(强制转换),再比较相等性。转换不同数据类型时,基本规则:a.如果有一个操作数是布尔值,在比较之前先转换为数值;b.如果一个是字符串,一个是数值,比较之前先将字符串转换为数值;c.一个是对象,另一个不是,则调用对象的valueOf方法,用得到的基本类型按照前面的规则进行比较。进行比较时,要遵循的规则:a.null和undefined是相等的。b.比较相等性之前,不能将null和undefined转换成其他任何值。c.如果有一个操作数是NaN,则相等返回false,不相等返回true。NaN不等于NaN。d.如果两个操作符都是对象,则比较它们是不是同一个对象,如果指向同一个对象,则返回true,否则,返回false。

60.全等和不全等:比较之前不转换操作数。null == undefined返回true,但是null === undefined返回false,因为他们是不同类型的值。

61.语句

(1)if

(2)do-while:至少执行一次

(3)while

(4)for:在循环内部定义的变量在外部可以访问到

(5)for-in:可以用来枚举对象的属性。ECMAScript对象的属性没有顺序。如果要迭代的对象的变量值为null或undefined,for-in语句会抛出错误。ECMAScript5更正了这一个行为:对这种情况不再抛出错误,而只是不执行循环体。为保证最大限度的兼容,再使用这个循环之前,先检测该对象的值是不是null或undefined.

(6)label语句:可以在代码中添加标签,以便将来使用。label:statement。加标签的语句一般都与for语句等循环语句配合使用。

(7)break和continue:break会立即退出循环,强制执行循环后面的语句,而continue虽然也是退出循环,但是退出循环后会从循环的顶部继续执行。break和continue都可以与label语句联合使用,从而返回代码中特定的位置。这种联合使用的情况多发生在嵌套循环的情况下。

                                   

                                         

(8)with语句:with语句的作用是将代码的作用于设置到一个特定的对象中。使用语法:with (expression) statement;定义with语句的目的主要是为了简化多次编写同一个对象的工作。

                                         

(9)在with语句的代码块内部,每个变量首先被认为是一个局部变量,而如果在局部环境中找不到该变量的定义,就会查询location对象中是否有同名的属性。严格模式下不允许使用with语句,否则视为语法错误.使用with语句会导致性能下降,调试也会困难,不建议使用。

(10)switch语句:在switch语句中可以使用任何数据类型,无论是字符串还是对象都没有问题,其次,每个case的值不一定是常量,可以是变量,甚至是表达式。switch语句在比较值的时候使用的全等操作符,因此不会发生类型转换。

62.函数:位于return语句之后的任何代码都不会执行。return语句可以不带有任何返回值,这种情况下,函数停止执行后将返回undefined值。这种用法一般用在需要提前停止函数执行而又不需要返回值的情况下。严格模式下,对函数有一些限制:不能把函数或者参数命名为eval或arguments,不能出现两个命名参数同名的情况,否则会导致语法错误。

63.函数参数:ECMAScript函数不介意传递进多少个参数,也不在乎传进来的参数是什么数据类型。也就是说,即便你定义的函数只接收两个参数,在调用这个函数时也未必一定要传递两个参数。ECMAScript中的参数在内部是用一个数组来表示的,函数接收到的始终都是这个数组,而不关心数组中包含哪些参数。如果这个数组中不包含任何元素,无所谓;如果包含多个参数,也没问题。实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。其实,arguments对象只是与数组类似,并不是Array的实例,可以使用方括号语法访问他的每一个元素,使用length属性来确定传递进来多少个参数。ECMAScript函数的一个重要特点:命名的参数只提供便利,但不是必需的。另外,arguments对象可以与命名参数一起使用。arguments的值永远与对应命名参数的值保持同步。即,arguments对象中的值会自动反应到对应的命名参数。不过这并不是说读取这两个值会访问相同的内存空间,他们的内存空间是独立的,但是值会同步,但是这种影响是单向的,修改命名参数的值不会改变arguments中对用的值。另外,如果只传入一个参数,那么为arguments[1]设置的值不会反应到命名参数中,这事因为arguments对象的长度是由传入的参数个数决定的,不是由定义函数时的命名参数的个数决定的。没有传递值的命名参数将自动被赋予undefined值,这跟定义了变量但又没有初始化一样。严格模式下,修改arguments中的值,对应的命名参数的值不会随之改变,另外,重写arguments的值会导致语法错误。ECMAScript中所有的参数传递的都是值,不可能通过引用传递参数。

64.没有重载:其他语言中,可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可。但是ECMAScript函数没有签名,没有真正的重载。如果定义了两个名字相同的函数,则该名字只属于后定义的函数。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值