03.JavaScript基本概念

基本概念

语法

区分大小写

ECMAScript中的一切都区分大小写

标识符

所谓标识符,就是指变量、函数、属性的名字;或者函数的参数。

  • 第一个字符必须是一个字母,下划线或一个美元符号
  • 其他字符可以是字母,下划线,美元符号或数字

按照惯例,ECMAScript标识符采用驼峰大小写格式,也就是第一个字母小写,剩下每个有意义的单词的首字母大写,例如myCar

注释
// 单行注释

/*
 * 这是一个多行
 * (块级)注释
 */
严格模式

启用严格模式,在脚本顶端添加"use strict"

语句

ECMAScript中的语句以一个分号结尾,可省略(不推荐)

关键字和保留字

以下是ECMAScript的关键字

break         do           instanceof        typeof
case          else         new               var
catch         finally      return            void
continue      for          switch            while
debugger*     function     this              with
default       if           throw
delete        in           try

以下是保留字

abstract      enum            int            short
boolean       export          interface      static
byte          extends         long           super
char          final           native         synchronized
class         float           package        throws
const         goto            private        transient
debugger      implements      protected      volatile
double        import          public

变量

ECMAScript的变量是松散类型的,即可以用来保存任何数据类型的数据。

后面ES6中会进行新版的介绍。

数据类型

ECMAScript中有5种简单数据类型(也称为基本数据类型):UndefinedNullBooleanNumberString。还有1种复杂数据类型——Object

typeof操作符

typeof

  • 用于检测给定变量的数据类型

  • 返回值

    • undefined-未定义的值
    • boolean-布尔值
    • string-字符串
    • number-数值
    • object-对象或null
    • function-函数
  • typeof操作符的操作数可以是变量,也可以是数值字面量

  • typeof是一个操作符而不是一个函数,后面圆括号不是必须的

Undefined类型

在声明变量后为对其加以初始化的时候,这个变量的值就是undefined

Null类型

null表示一个空对象指针,因此typeof操作符检测null会返回object

实际上,undefined值是派生自null值的,位于nullundefined之间的相等操作符(==)总是返回true

Boolean类型

Boolean类型只有两个字面值:true和false,区分大小写。即True和False都不是Boolean值

但是ECMAScript中所有类型的值,都有与Boolean值等价的值,通过

转型函数Boolean()

var message = "Hello world!";
var messageAsBoolean = Boolean(message);
数据类型转换为true的值转换为false的值
Booleantruefalse
String任何非空字符串""(空字符串)
Number任何非零数字值(包括无穷大)0和NaN(参见本章后面有关NaN的内容)
Object任何对象bull
Undefinedn/a1undefined

流控制语句(如if语句)自动执行相应的Boolean转换

var message = "Hello world!";
if (message){
	alert("Value is true");
}
Number类型

字面量格式

  • 十进制:直接输入,55
  • 八进制:严格模式下无效,字面值的第一位必须是0,后面是八进制数字序列(0~7,超出范围会当做十进制解析),070=56,079=79,08=8
  • 十六进制:字面值的前两位必须是0x,后跟任何十六进制数字(09,AF大小写都可以),0xA=10,0x1f=31
  • 算术运算时,所有八进制,十六进制最终都被转换为十进制数值。
浮点数值

所谓浮点数值,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。

  • 1.1,0.1
  • 1.=1,10.0=10
  • 3.125e7=31250000,3e-4=0.0003

浮点运算精确度远远不如整数,永远不要测试某个特定的浮点数值。

数值范围

ECMAScript能够表示的最小数值保存在Number.MIN_VALUE中——在大多数浏览器中,这个值是5e-324;能够表示的最大数值保存在Number.MAX_VALUE中——在大多数浏览器中,这个值是1.7976931348623157e+308。

超出后,转换成如下的特殊的Infinity

  • Infinity正无穷
  • -Infinity负无穷

isFinite()函数

  • 判断一个数值是不是有穷的
var result = Number.MAX_VALUE + Number.MAX_VALUE;
alert(isFinite(result));   //false
NaN

NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况。例如,任何数值除以0会返回NaN。

两个特点

  • 任何涉及NaN的操作,结果都会返回NaN
  • NaN与任何数值都不相等,包括自身

isNaN()函数

  • 这个函数接收一个参数,判断这个参数是否是NaN。
  • 原理:isNaN()在接收到一个数值后,会尝试将这个值转换为数值,某些不是数值的值会直接转换为数值,例如字符串"10"Boolean值。而任何不能被转换为数值的值都会导致这个函数返回true
类型举例转换数值isNaN()
NaNNaNNaNtrue
Number1010false
StringblueNaNtrue
Booleantrue1false
String“10”10false
数值转换

有三个函数可以把非数值转换为数值:Number(),parseInt(),parseFloat()。

  • Number()函数

    • 转型函数Number()可以用于任何数据类型

    • 参数类型举例转换后
      Booleantrue/false1/0
      Number1010
      nullnull0
      undefinedundefinedNaN
      String“10”/“011”10/11
      String“1.1"/“01.2”1.1/1.2
      String“0xf”15
      String“”0
      String“blue”NaN
      Object先调用valueof(),然后进行转换;若转换的结果是NaN,则调用toString(),然后再次转换
  • parseInt()函数

    • 专门用于把字符串转换成数值

    • 字符串举例转换后结果
      “”NaN
      “10”/"-10"10/-10
      “a10”NaN
      “10ab”10
      “22.5”22
    • 对于其他格式的字面量数值字符串,提供第二个参数:转换时使用的进制数。建议一直明确指定基数,二、八、十、十六进制。

      举例转换后结果
      parseInt(“0xAF”,16)175
      parseInt(“AF”,16)175
      parseInt(“AF”)NaN
  • parseFloat函数

    • 与parseInt区别是,第一个小数点是有效的。例如:“22.34.5”会被解析成22.34

    • 只能解析十进制值,因此不能指定第二个参数

      举例结果
      “1234blue”1234
      “0xA”0
      “22.5”22.5
      “22.34.5”22.34
      “0908.5”908.5
      “3.125e7”31250000
String类型

即字符串类型,用双引号(")或单引号(’)表示

字符字面量

String数据类型包含一些特殊的字符字面量,也叫转义序列

字 面 量含  义
\n换行
\t制表
\b空格
\r回车
\f进纸
\\斜杠
\'单引号('),在用单引号表示的字符串中使用。例如:'He said, \'hey.\''
\"双引号("),在用双引号表示的字符串中使用。例如:"He said, \"hey.\""
\x*nn*以十六进制代码*nn*表示的一个字符(其中*n*为0~F)。例如,\x41表示"A"
\u*nnnn*以十六进制代码*nnnn*表示的一个Unicode字符(其中*n*为0~F)。例如,\u03a3表示希腊字符Σ

任何字符串的长度都可以通过访问其**length属性**取得,若包含双字节字符,则字符数目会出错

alert(text.length);
字符串的特点

字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量

转换为字符串

把一个值转换为字符串有两种方式:

  1. 使用值的**toString()方法**
    • 返回相应值的字符串表现
    • 对于数值的toString()方法,可以指定转换字符串的进制数,默认为10
    • null和undefined值没有这个方法
  2. 使用**String()函数**
    • 如果值有toString()方法,则调用该方法并返回相应的结果
    • 如果值是null,则返回"null"
    • 如果值是undefined,则返回"undefined"
Object类型
var o = new Object();

Object的每个实例都具有下列属性和方法

  • Constructor:构造函数。
  • hasOwnProperty(propertyName):检查给定的属性在当前对象实例中是否存在
    • propertyName必须以字符串的形式指定:o.hasOwnProperty(“name”)
  • isPrototypeOf(object):检查传入的对象是否是另一个对象的原型
  • propertyIsEnumerable(propertyName):检查给定的属性是否能够使用for-in语句
    • propertyName必须以字符串的形式指定:o.propertyIsEnumerable(“name”)
  • toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应
  • toString():返回对象的字符串表示
  • valueOf():返回对象的字符串,数值或布尔值表示。通常与toString()方法的返回值相同

操作符

ECMA-262描述了一组用于操作数据值的操作符,包括算术操作符(如加号和减号)、位操作符、关系操作符和相等操作符。ECMAScript操作符的与众不同之处在于,它们能够适用于很多值,例如字符串、数字值、布尔值,甚至对象。不过,在应用于对象时,相应的操作符通常都会调用对象的valueOf()和(或)toString()方法,以便取得可以操作的值。

一元操作符
  • 递增和递减操作符

    • ++

    • --

    • 前置和后置有运算优先级的区别,这里不做详细赘述了

    • 在应用于不同的值时,递减和递减操作符遵循下列规则。

      • 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作。字符串变量变成数值变量。

      • 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN(第4章将详细讨论)。字符串变量变成数值变量。

      • 在应用于布尔值false时,先将其转换为0再执行加减1的操作。布尔值变量变成数值变量。

      • 在应用于布尔值true时,先将其转换为1再执行加减1的操作。布尔值变量变成数值变量。

      • 在应用于浮点数值时,执行加减1的操作。

      • 在应用于对象时,先调用对象的valueOf()方法(第5章将详细讨论)以取得一个可供操作的值。然后对该值应用前述规则。如果结果是NaN,则在调用toString()方法后再应用前述规则。对象变量变成数值变量。

        var s1 = "2";
        var s2 = "z";
        var b = false;
        var f = 1.1;
        var o = { 
            valueOf: function() {
                return -1;
            }
        };
        
        s1++;     // 值变成数值3
        s2++;     // 值变成NaN
        b++;      // 值变成数值1
        f--;      // 值变成0.10000000000000009(由于浮点舍入错误所致)
        o--;      // 值变成数值-2
        
  • 一元加减操作符

    • 放在值前,表示正负
    • 非数值情况下,会转换该值
位操作符
  • 对非数值应用位操作符,会先使用Number()函数将该值转换为一个数值(自动完成),然后再应用位操作。得到的结果将是一个数值。

  • 是基于二进制进行操作的

  • 操作符符号表示
    按位非-NOT~
    按位与-AND&
    按位或-OR|
    按位异或-XOR^
    左移<<
    有符号的右移>>
    无符号的右移>>>
布尔操作符

布尔操作符一共有3个:非(NOT)、与(AND)和或(OR)

  • 逻辑非

    • !
    • 无论这个值是什么数据类型,这个操作符都会返回一个布尔值。逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再对其求反
      • 如果操作数是一个对象,返回false
      • 如果操作数是一个空字符串,返回true
      • 如果操作数是一个非空字符串,返回false
      • 如果操作数是数值0,返回true
      • 如果操作数是任意非0数值(包括Infinity),返回false
      • 如果操作数是null,返回true
      • 如果操作数是NaN,返回true
      • 如果操作数是undefined,返回true
    • 同时使用两个逻辑非操作符,实际上就会模拟Boolean()转型函数的行为
  • 逻辑与

    • &&

    • 真真则真

    • 逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值

      • 如果第一个操作数是对象,则返回第二个操作数;
      • 如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象;
      • 如果两个操作数都是对象,则返回第二个操作数;
      • 如果有一个操作数是null,则返回null
      • 如果有一个操作数是NaN,则返回NaN
      • 如果有一个操作数是undefined,则返回undefined
    • 逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值

  • 逻辑或

    • ||
    • 假假则假
    • 与逻辑与操作相似,如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值
      • 如果第一个操作数是对象,则返回第一个操作数
      • 如果第一个操作数的求值结果为false,则返回第二个操作数;
      • 如果两个操作数都是对象,则返回第一个操作数;
      • 如果两个操作数都是null,则返回null
      • 如果两个操作数都是NaN,则返回NaN
      • 如果两个操作数都是undefined,则返回undefined
    • 与逻辑与操作符相似,逻辑或操作符也是短路操作符。也就是说,如果第一个操作数的求值结果为true,就不会对第二个操作数求值了
乘性操作符

ECMAScript定义了3个乘性操作符:乘法、除法和求模

如果参与乘法计算的某个操作数不是数值,后台会先使用Number()转型函数将其转换为数值。也就是说,空字符串将被当作0,布尔值true将被当作1。

  • 乘法

    • 在处理特殊值的情况下,乘法操作符遵循下列特殊的规则:

      • 如果操作数都是数值,执行常规的乘法计算,即两个正数或两个负数相乘的结果还是正数,而如果只有一个操作数有符号,那么结果就是负数。如果乘积超过了ECMAScript数值的表示范围,则返回Infinity-Infinity
      • 如果有一个操作数是NaN,则结果是NaN
      • 如果是Infinity与0相乘,则结果是NaN
      • 如果是Infinity与非0数值相乘,则结果是Infinity-Infinity,取决于有符号操作数的符号;
      • 如果是InfinityInfinity相乘,则结果是Infinity
      • 如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的

      规则。

  • 除法

    • /
    • 与乘法操作符类似,除法操作符对特殊的值也有特殊的处理规则。这些规则如下:
      • 如果操作数都是数值,执行常规的除法计算,即两个正数或两个负数相除的结果还是正数,而如果只有一个操作数有符号,那么结果就是负数。如果商超过了ECMAScript数值的表示范围,则返回Infinity-Infinity
      • 如果有一个操作数是NaN,则结果是NaN
      • 如果是InfinityInfinity除,则结果是NaN
      • 如果是零被零除,则结果是NaN
      • 如果是非零的有限数被零除,则结果是Infinity-Infinity,取决于有符号操作数的符号;
      • 如果是Infinity被任何非零数值除,则结果是Infinity-Infinity,取决于有符号操作数的符号;
      • 如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则。
  • 求模(求余)

    • %
    • 与另外两个乘性操作符类似,求模操作符会遵循下列特殊规则来处理特殊的值:
      • 如果操作数都是数值,执行常规的除法计算,返回除得的余数;
      • 如果被除数是无穷大值而除数是有限大的数值,则结果是NaN
      • 如果被除数是有限大的数值而除数是零,则结果是NaN
      • 如果是InfinityInfinity除,则结果是NaN
      • 如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;
      • 如果被除数是零,则结果是零;
      • 如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则。
加性操作符
  • 加法

    • 如果两个操作符都是数值,执行常规的加法计算,然后根据下列规则返回结果:
      • 如果有一个操作数是NaN,则结果是NaN
      • 如果是InfinityInfinity,则结果是Infinity
      • 如果是-Infinity-Infinity,则结果是-Infinity
      • 如果是Infinity-Infinity,则结果是NaN
      • 如果是+0加+0,则结果是+0;
      • 如果是-0加-0,则结果是-0;
      • 如果是+0加-0,则结果是+0。
    • 不过,如果有一个操作数是字符串,那么就要应用如下规则:
      • 如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来;
      • 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来。
    • 如果有一个操作数是对象、数值或布尔值,则调用它们的toString()方法取得相应的字符串值,然后再应用前面关于字符串的规则。
    • 对于undefinednull,则分别调用String()函数并取得字符串"undefined""null"
  • 减法

    • 与加法操作符类似,ECMAScript中的减法操作符在处理各种数据类型转换时,同样需要遵循一些特殊规则,如下所示:
      • 如果两个操作符都是数值,则执行常规的算术减法操作并返回结果;
      • 如果有一个操作数是NaN,则结果是NaN
      • 如果是InfinityInfinity,则结果是NaN
      • 如果是-Infinity-Infinity,则结果是NaN
      • 如果是Infinity-Infinity,则结果是Infinity
      • 如果是-InfinityInfinity,则结果是-Infinity
      • 如果是+0减+0,则结果是+0;
      • 如果是+0减+0,则结果是+0;
      • 如果是+0减-0,则结果是-0;
      • 如果是-0减-0,则结果是+0;
      • 如果有一个操作数是字符串、布尔值、nullundefined,则先在后台调用Number()函数将其转换为数值,然后再根据前面的规则执行减法计算。如果转换的结果是NaN,则减法的结果就是NaN
      • 如果有一个操作数是对象,则调用对象的valueOf()方法以取得表示该对象的数值。如果得到的值是NaN,则减法的结果就是NaN。如果对象没有valueOf()方法,则调用其toString()方法并将得到的字符串转换为数值。
关系操作符

小于(<)、大于(>)、小于等于(<=)和大于等于(>=)这几个关系操作符用于对两个值进行比较,几个操作符都返回一个布尔值

当关系操作符的操作数使用了非数值时,也要进行数据转换或完成某些奇怪的操作。以下就是相应的规则。

  • 如果两个操作数都是数值,则执行数值比较。
  • 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值
  • 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。
  • 如果一个操作数是对象,则调用这个对象的valueOf()方法,用得到的结果按照前面的规则执行比较。如果对象没有valueOf()方法,则调用toString()方法,并用得到的结果根据前面的规则执行比较。
  • 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比
相等操作符

相等不相等——先转换再比较,全等不全等——仅比较而不转换。

  • 相等和不相等

    • ==、!=

    • 这两个操作符都会先转换操作数(通常称为强制转型),然后再比较它们的相等性

    • 在转换不同的数据类型时,相等和不相等操作符遵循下列基本规则:

      • 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,而true转换为1;
      • 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
      • 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较
    • 这两个操作符在进行比较时则要遵循下列规则。

      • nullundefined是相等的。

      • 要比较相等性之前,不能将nullundefined转换成其他任何值。

      • 如果有一个操作数是NaN,则相等操作符返回false,而不相等操作符返回true。重要提示:即使两个操作数都是NaN,相等操作符也返回false;因为按照规则,NaN不等于NaN

      • 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true;否则,返回false

      • 表 达 式表 达 式
        null == undefinedtruetrue == 1true
        "NaN" == NaNfalsetrue == 2false
        5 == NaNfalseundefined == 0false
        NaN == NaNfalsenull == 0false
        NaN != NaNtrue"5"==5true
        false == 0true
  • 全等和不全等

    • =、!
    • 要求类型也相等
条件操作符
variable = boolean_expression ? true_value : false_value;
赋值操作符

简单的赋值操作符由等于号(=)表示,其作用就是把右侧的值赋给左侧的变量

主要算术操作符都有对应的符合赋值操作符

名称符号名称符号
乘赋值*=减赋值-=
除赋值/=左移赋值<<=
模赋值%=有符号右移赋值>> =
加赋值+=无符号右移赋值>>> =
逗号操作符

使用逗号操作符可以在一条语句中执行多个操作

  • 声明多个变量;
  • 用于赋值。在用于赋值时,逗号操作符总会返回表达式中的最后一项
var num1=1, num2=2, num3=3;
var num = (5, 1, 4, 8, 0); // num的值为0

语句

if语句
if (condition) statement1 else statement2

其中的condition(条件)可以是任意表达式;而且对这个表达式求值的结果不一定是布尔值。ECMAScript会自动调用Boolean()转换函数将这个表达式的结果转换为一个布尔值。如果对condition求值的结果是true,则执行statement1(语句1),如果对condition求值的结果是false,则执行statement2(语句2)。而且这两个语句既可以是一行代码,也可以是一个代码块(以一对花括号括起来的多行代码)

do-while语句

do-while语句是一种后测试循环语句,即只有在循环体中的代码执行之后,才会测试出口条件。换句话说,在对条件表达式求值之前,循环体内的代码至少会被执行一次

do {
    statement
} while (expression);
while语句

while语句属于前测试循环语句,也就是说,在循环体内的代码被执行之前,就会对出口条件求值。因此,循环体内的代码有可能永远不会被执行

while(expression) statement
for语句

for语句也是一种前测试循环语句,但它具有在执行循环之前初始化变量和定义循环后要执行的代码的能力。

for (initialization; expression; post-loop-expression) statement
for-in语句

for-in语句是一种精准的迭代语句,可以用来枚举对象的属性

for (property in expression) statement
// 示例
for (var propName in window) {
     document.write(propName);
}

在这个例子中,我们使用for-in循环来显示了BOM中window对象的所有属性。每次执行循环时,都会将window对象中存在的一个属性名赋值给变量propName。这个过程会一直持续到对象中的所有属性都被枚举一遍为止。

如果表示要迭代的对象的变量值为nullundefinedfor-in语句会抛出错误。ECMAScript 5更正了这一行为;对这种情况不再抛出错误,而只是不执行循环体。为了保证最大限度的兼容性,建议在使用for-in循环之前,先检测确认该对象的值不是nullundefined

label语句

使用label语句可以在代码中添加标签,以便将来使用。

一般用来配合break或continue跳出双循环

label: statement
// 示例
var num = 0;
    outPoint:
    for (var i = 0 ; i < 10 ; i++){
         for (var j = 0 ; j < 10 ; j++){
              if( i == 5 && j == 5 ){
                    break outPoint;
              }
         num++;
         }
    }
break和continue语句

breakcontinue语句用于在循环中精确地控制代码的执行。其中,break语句会立即退出循环,强制继续执行循环后面的语句。而continue语句虽然也是立即退出循环,但退出循环后会从循环的顶部继续执行

虽然联用breakcontinuelabel语句能够执行复杂的操作,但如果使用过度,也会给调试带来麻烦。在此,我们建议如果使用label语句,一定要使用描述性的标签,同时不要嵌套过多的循环。

with语句

with语句的作用是将代码的作用域设置到一个特定的对象中

定义with语句的目的主要是为了简化多次编写同一个对象的工作,如下面的例子所示:

var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;

上面几行代码都包含location对象。如果使用with语句,可以把上面的代码改写成如下所示:

with(location){
    var qs = search.substring(1);
    var hostName = hostname;
    var url = href;
}

严格模式下不允许使用with语句,否则将视为语法错误。

ES6后,with不推荐使用

switch语句

switch语句中的每一种情形(case)的含义是:“如果表达式等于这个值(value),则执行后面的语句(statement)”。而break关键字会导致代码执行流跳出switch语句。如果省略break关键字,就会导致执行完当前case后,继续执行下一个case。最后的default关键字则用于在表达式不匹配前面任何一种情形的时候,执行机动代码

switch (expression) {
  case value: statement
    break;
  case value: statement
    break;
  case value: statement
    break;
  case value: statement
    break;
  default: statement
}
  • 首先,可以在switch语句中使用任何数据类型(在很多其他语言中只能使用数值),无论是字符串,还是对象都没有问题。
  • 其次,每个case的值不一定是常量,可以是变量,甚至是表达式
  • switch语句在比较值时使用的是全等操作符,因此不会发生类型转换

函数

通过函数可以封装任意多条语句,而且可以在任何地方、任何时候调用执行。ECMAScript中的函数使用function关键字来声明,后跟一组参数以及函数体

function functionName(arg0, arg1,...,argN) {
    statements
}

以下是一个函数示例:

function sayHi(name, message) {
    alert("Hello " + name + "," + message);
}
  • 这个函数可以通过其函数名来调用,后面还要加上一对圆括号和参数(圆括号中的参数如果有多个,可以用逗号隔开)。调用sayHi()函数的代码如下所示:
sayHi("Nicholas", "how are you today?");
  • ECMAScript中的函数在定义时不必指定是否返回值。实际上,任何函数在任何时候都可以通过return语句后跟要返回的值来实现返回值。
function sum(num1, num2) {
    return num1 + num2;
}
  • 这个函数会在执行完return语句之后停止并立即退出。因此,位于return语句之后的任何代码都永远不会执行

推荐的做法是要么让函数始终都返回一个值,要么永远都不要返回值。否则,如果函数有时候返回值,有时候有不返回值,会给调试代码带来不便。

严格模式对函数有一些限制:

  • 不能把函数命名为evalarguments
  • 不能把参数命名为evalarguments
  • 不能出现两个命名参数同名的情况。

如果发生以上情况,就会导致语法错误,代码无法执行。

理解参数

ECMAScript函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。

原因是ECMAScript中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。

实际上,在函数体内可以通过**arguments对象**来访问这个参数数组,从而获取传递给函数的每一个参数。

  • 可以使用方括号语法访问它的每一个元素(即第一个元素是arguments[0],第二个元素是argumetns[1],以此类推)
  • 使用length属性来确定传递进来多少个参数。
  • arguments对象可以与命名参数一起使用
  • 它的值永远与对应命名参数的值保持同步
  • 没有传递值的命名参数将自动被赋予undefined值。这就跟定义了变量但又没有初始化一样。
  • 严格模式对如何使用argumetns对象做出了一些限制。首先,像前面例子中那样的赋值会变得无效。也就是说,即使把arguments[1]设置为10num2的值仍然还是undefined。其次,重写arguments的值会导致语法错误(代码将不会执行)。
没有重载

如果在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数

通过检查传入函数中参数的类型和数量并作出不同的反应,可以模仿方法的重载

小结

  • ECMAScript中的基本数据类型包括UndefinedNullBooleanNumberString

  • 与其他语言不同,ECMScript没有为整数和浮点数值分别定义不同的数据类型,Number类型可用于表示所有数值。

  • ECMAScript中也有一种复杂的数据类型,即Object类型,该类型是这门语言中所有对象的基础类型。

  • 严格模式为这门语言中容易出错的地方施加了限制。

  • ECMAScript提供了很多与C及其他类C语言中相同的基本操作符,包括算术操作符、布尔操作符、关系操作符、相等操作符及赋值操作符等。

  • ECMAScript从其他语言中借鉴了很多流控制语句,例如if语句、for语句和switch语句等。

ECMAScript中的函数与其他语言中的函数有诸多不同之处。

  • 无须指定函数的返回值,因为任何ECMAScript函数都可以在任何时候返回任何值。
  • 实际上,未指定返回值的函数返回的是一个特殊的undefined值。
  • ECMAScript中也没有函数签名的概念,因为其函数参数是以一个包含零或多个值的数组的形式传递的。
  • 可以向ECMAScript函数传递任意数量的参数,并且可以通过arguments对象来访问这些参数。
  • 由于不存在函数签名的特性,ECMAScript函数不能重载
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值