JS第三章

JavaScript第三章

  • 1.语法

  • 2.数据类型

  • 3.操作符

  • 4.流控制语句

  • 5.函数

  • 6.小结

1.语法

1.1 区分大小写

ECMAScript中的一切(变量、函数名和操作符)都区分大小写

注意:不能使用关键字

1.2 标识符

指变量、函数、属性的名字,或者函数的参数

规则:第一个字符必须是一个字母、下划线(_)或一个美元符号($)其他字符可以是字母、下划线、美元符号或数字

驼峰大小写格式(CMAScript的规则第一个字母小写,剩下的每个单词的首字母大写)

1.3 注释

ECMAScript使用 C风格的注释(/**/或者//)

块级注释以一个斜杠和一个星号(/)开头,以一个星号和一个斜杠(/)结尾

1.4 严格模式

在严格模式下,ECMAScript 3中的一些不确定的行为将得到处理,而且对某些不安全 的操作也会抛出错误。

要在整个脚本中启用严格模式,可以在顶部添加如下代码: "use strict"

可以指定函数在严格模式下执行: function doSomething(){ "use strict"; //函数体 }

1.5 语句

语句以一个分号“;”结尾

在控制语句中使用代码块可以让编码意图更加清晰,而且也能降低修改代码时出错的几率。

1.6 关键字

可用于表示控制语句的开始或结束,或 者用于执行特定操作等。

1.7 保留字

非严格模式下

严格模式下

使用关键字作标识符,会导致“Identifier Expected”错误

注意:关键字和保留字虽然仍然不能作为标识符使用,但现在可以用作对象的属性名。

1.7 变量

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

定义变量时要使用 var 操作符;未初始化的变量会保存一个特殊值——undefined;定义后的变量可以取代不同类型的值(但是这个操作不推荐)。

在函数中定义的变量生命周期为函数执行到函数结束,退出后就销毁(必须是用var定义的,否则为全局变量),只要调用过一次该函数,这个变量就有了定义,就可以在函数外部的任何地方被访问到。

在严格模式下,不能定义名为 eval 或 arguments 的变量,否则会导致语法错误。

2.数据类型

2.1 基本数据类型(5种)

Undefined、Null、Boolean、Number 和String

2.2 复杂数据类型

object,本质上是由一组无序的名值对组成的。

2.3 typeof操作符

是松散类型的,检测给定变量的数据类型。

返回的字符串:

"undefined"——如果这个值未定义;

"boolean"——如果这个值是布尔值;

"string"——如果这个值是字符串;

"number"——如果这个值是数值;

"object"——如果这个值是对象或 null;

"function"——如果这个值是函数。

typeof 操作符的操作数可以是变量(message),也可以是数值字面量;

使用:typeof 变量(或者数值字面量)

括号不是必须的

注意:调用 typeof null 会返回"object",因为特殊值 null 被认为是一个空的对象引用

函数在 ECMAScript中是对象,不是一种数据类型(具有特殊属性,可以区分函数与其他对象)。

2.4 Undefined类型

Undefined 类型只有一个值,即特殊的 undefined;定义了一种类型却没有初始化的时候也为undefined类型;一般而言,不存在需要显式地把一个变量设置为 undefined 值的情况;该类型主要用于比较。

包含 undefined 值的变量与尚未定义的变量还是不一样的。

对于尚未声明的变量,只执行typeof操作符检测其数据类型;

对未经声明的变量调用 delete 不会导致错 误,但这样做没什么实际意义,而且在严格模式下确实会导致错误。

可以理解为一个是未初始化的类型,另一个是未声明,同样有undefined的意思;

良好的习惯:显式地初始化变量,有利于检测变量有没有被声明

2.5 Null类型

该类型只有一个值null;typeof 操作符检测 null 值时会返回"object"(null值表示空对象指针);

保存对象的变量还没有真正保存对象,就应该明确地让该变量保存 null 值。(与undefined不一样,需要显式的进行设置值)

2.6 Boolean类型

有两个字面值:true 和 false(与数字值没关系(即true不一定是1,false不一定是0),区分大小写;

所有类型的值都有与这两个 Boolean 值等价的值

将一个值转换为其对应的 Boolean 值,可以调用转型函数 Boolean()

字符串 message 被转换成了一个 Boolean 值,该值被保存在 messageAsBoolean 变量中。

2.7 Number类型

2.7.1 整数
  • 十进制

  • 八进制

    第一位必须是0,接着是八进制数列(0-7);

    字面值中的 数值超出了范围,那么前导零将被忽略,后面的数值将被当作十进制数值解析;

    八进制字面量在严格模式下是无效的。

  • 十六进制

    十六进制字面值的前两位必须是 0x,后跟任何十六进制数字(0~9 及 A~F);

进行算术计算时,所有以八进制和十六进制表示的数值终都将被转换成十进制数值

2.7.2 浮点数值(不能作比较,除了以精度计算即利用偏差值大小来判断)
  • 数值中必须包含一个小数点,并且小数点后面必须至少有一位数字

  • 保存浮点数值需要的内存空间是保存整数值的两倍

  • 注意:小数点后面没有跟任何数字,那么这个数值就可以作为整数值来保存

  • 浮点数值本身表示的就是一个整数(如1.0),那么该值也会被转换为整数

  • 科学计数法e表示法

    前面是一个数值(可以是整数也可以是浮点数),中间是一个大写或小写的字母E,后面是10的幂中的指数,该幂值将用来与前面的数相乘

2.7.3 数值范围
  • 超出 JavaScript数值范围的值,那么这个数值将被自动转换成特殊的Infinity 值(具体来说,如果这个数值是负数,则会被转换成-Infinity(负无穷),如果这个数值是正数,则会被转换成 Infinity(正无穷))

  • 确定是否有穷方法

    isFinite()函数

    这个函数在参数位于小与大数值之间时会返回true

  • 访问 Number.NEGATIVE_INFINITY 和 Number.POSITIVE_INFINITY 也可以 得到负和正 Infinity 的值

2.7.4 NaN 非数值(Not a Number)
  • 作用:确定这个参数是否“不是数值”

  • 任何不能被转换为数值的值都会导致这个函数返回 true(根据是否可以转换为数值来返回值)

  • 使用在对象中

    在基于对象调用 isNaN() 函数时,会首先调用对象的 valueOf()方法,然后确定该方法返回的值是否可以转 换为数值。不能,则基于这个返回值再调用 toString()方法,再测试返回值。

2.7.5 数值转换
  • Number()、parseInt()和 parseFloat()三个函数,parseInt()和 parseFloat()专门用于把字符串转换成数值。

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

    如果是 Boolean 值,true 和 false 将分别被转换为 1和 0。

    如果是数字值,只是简单的传入和返回。

    如果是 null 值,返回 0。

    如果是 undefined,返回 NaN。

    如果是字符串:只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值;字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值;字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整 数值; 字符串是空的(不包含任何字符),则将其转换为 0; 字符串中包含除上述格式之外的字符,则将其转换为 NaN。

    如果是对象:调用对象的 valueOf()方法,然后依照前面的规则转换返回的值。如果转换 的结果是 NaN,则调用对象的 toString()方法,然后再次依照前面的规则转换返回的字符 串值。

注意:一元加操作符的操作与 Number()函数相同。

  • parseInt()函数

    用 parseInt()转换空字符串会返回 NaN(Number()对空字符返回 0)。如 果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了 一个非数字字符;

    如果字符串以"0x"开头且后跟数字字符,就会将其当作一 个十六进制整数;如果字符串以"0"开头且后跟数字字符,则会将其当作一个八进制数来解析。

    消除错误判断换进制,为该函数提供第二个参数能确保获得正确结果。

    此为了避免错误的解析,我们建议无论在什么情况下都明确指定基数(常常解析10进制数字,始终将 10 作为第二个参数是非常必要的。)

  • parseFloat()函数

    字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略,例子: "22.34.5"将会被转换为 22.34;

    该函数只解析十进制值;

    始终都会忽略前导的零,注意:十六进制格式的字符串则始终会被转换成 0;

    字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后 都是零),parseFloat()会返回整数。

2.7.6 String类型

  • 用于表示由零或多个16位Unicode字符组成的字符序列,即字符串;

  • 字符串可以由双 引号(")或单引号(')表示;

  • 字符字面量(转义序列)

  • 任何字符串的长度都可以通过访问其 length 属性取得

    这个属性返回的字符数包括 16 位字符的数目。如果字符串中包含双字节字符,那么 length 属性 可能不会精确地返回字符串中的字符数目

  • ECMAScript中的字符串是不可变的(重要)

    改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量;

    过程描述:首先创建一个能容纳 10个字符的 新字符串,然后在这个字符串中填充"Java"和"Script",后一步是销毁原来的字符串"Java"和字 符串"Script"

  • 转换为字符串的方式(主要为两种方法)

    1. 使用几乎每个值都有的 toString()方法

      返回相应值的字符串表现

      注意: null 和 undefined 值没有这个方法

      通过传递基数,toString()可以输出以二进制、八进制、十六进制,乃至其他任意有效进制格 式表示的字符串值

    2. 转型函数 String()

      能够将任何类型的值转换为字符串(在不知转换的值是否为null或者undefined情况下)

      如果值有 toString()方法,则调用该方法(没有参数)并返回相应的结果; (针对是否为null和undefined)

      如果值是 null,则返回"null"; 如果值是 undefined,则返回"undefined"。

特殊方法:要把某个值转换为字符串,可以使用加号操作符把它与一个字符 串("")加在一起

2.7.7 Object类型

  • ECMAScript中的对象其实就是一组数据和功能的集合

  • 对象可以通过执行 new 操作符后跟要创建 的对象类型的名称来创建

  • 在 ECMAScript中,如果不给构造函数传递参数,则可以省略后面的那一对圆括号(与java的一个不同之处)

  • 对象都具有的属性和方法

  • ECMA-262中对象的行为不一定适用于 JavaScript中的其他对象

3.操作符

用于操作数据值,适用于很多值,例如字 符串、数字值、布尔值,甚至对象。

包括算术操作符(如加号和减号)、位操作符、 关系操作符和相等操作符

3.1一元操作符

  • 只能操作一个值的操作符

  • 包括算术操作符(如加号和减号)、位操作符、 关系操作符和相等操作符。

  • 递增和递减操作符

    递增和递减操作符直接借鉴自 C,而且各有两个版本:前置型和后置型。

    执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。(在计算机科学领域,这种情况通常被称作副效应)

    适用规则:

    例子:
  • 一元加和减操作符

    一元加操作符

    以一个加号(+)表示,放在数值前面,用于表示负数,对数值不会产生任何影响

    对非数值应用一元加操作符时,该操作符会像 Number()转型函数一样对这个值执行转换,步骤为:布尔值 false 和 true 将被转换为 0和 1,字符串值会被按照一组特殊的规则进行解析,而对象是先调用它们的 valueOf()和(或)toString()方法,再转换得到的值。

    一元减操作符

    用于表示负数,例如将1转换成-1

    应用于非数值时,一元减操作符遵循与一元加操作符相同的规则,后再将得到的数值转换为负数

3.2 位操作符

  • 用于在基本的层次上,即按内存中表示数值的位来操作数值

  • ECMAScript 中的所有数 值都以 IEEE-754 64位格式存储,操作的时候先将64位的值转换成32位的整数,再进行位操作,最后才将结果转换成64位(副效应——对特殊的 NaN 和 Infinity 值应用位操作时,这两个值都会被当成 0来处理;解决方法:如果对非数值应用位操作符,会先使用 Number()函数将该值转换为一个数值(自动完成),然后 再应用位操作。得到的结果将是一个数值)

  • 对于有符号的整数,32位中的前 31位用于表示整数的值。第 32位用于表示数值的符号

  • 负数以二进制码存储,使用的格式是二进制补码。计算二级制补码的步骤:

  • 默认情况下,ECMAScript 中的所有整数都是有符号整数。

  • 按位非(NOT):按位非操作符由一个波浪线(~)表示,执行按位非的结果就是返回数值的反码

  • 按位与(AND):按位与操作符由一个和号字符(&)表示,它有两个操作符数。

  • 按位或(OR) :按位或操作符由一个竖线符号(|)表示,同样也有两个操作数。

  • 按位异或(XOR) :按位异或操作符由一个插入符号(^)表示,也有两个操作数。

  • 左移操作符:由两个小于号(<<)表示,这个操作符会将数值的所有位向左移动指定的位数。用0进行补位。左移不会影响操作数的符号位。

  • 有符号的右移 :有符号的右移操作符由两个大于号(>>)表示,这个操作符会将数值向右移动,但保留符号位(即 正负号标记)注意:用符号位填充

  • 无符号右移:无符号右移操作符由 3个大于号(>>>)表示,这个操作符会将数值的所有 32位都向右移动;对正数来说,无符号右移的结果与有符号右移相同;对负数来说,无符号右移是以 0来填充空位,而不是像有符号右移那 样以符号位的值来填充空位。(会出现变大的情况)

3.3 布尔操作符

  • 逻辑非

    逻辑非操作符由一个叹号(!)表示,可以应用于 ECMAScript中的任何值。

    逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再 对其求反。

  • 逻辑与

    逻辑与操作可以应用于任何类型的操作数

    逻辑与操作符由两个和号(&&)表示,有两个操作数

    逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。

  • 逻辑或

    逻辑或操作符由两个竖线符号(||)表示,有两个操作数

    短路操作符:如果第一个操作数的求值结果为 true,就不会对第二个操作数求值了

    如果 preferredObject 的值不是 null,那么它的值将被赋给 myObject;如果 是 null,则将 backupObject 的值赋给 myObject

3.4 乘性操作符

  • 乘法、除法和求模

  • 在操作数为非数值的情况下会执行自动的类型转换

  • 乘法

    乘法操作符由一个星号(*)表示,用于计算两个数值的乘积

  • 除法

    除法操作符由一个斜线符号(/)表示,执行第二个操作数除第一个操作数的计算

3.5 加减性操作符(+/-)

两个操作符都是数值,执行常规的加法计算,然后根据下列规则返回结果:

其中有一个操作数是字符串

其中有一个是对象、数值或布尔值,先调用其toString()方法取得相应的字符串值,再根据字符串规则来返回。

对于 undefined 和 null,则分别调用 String()函数并取得字符串"undefined"和"null"

3.6 关系操作符

  • 小于(<)、大于(>)、小于等于(<=)和大于等于(>=)

  • 返回值:布尔值

字符串:实际比较的是两个字符串中对应位置的每个字符的字符编码值;

必须把两个操作数转换为相同的大 小写形式(全部大写或全部小写),由于大小写的编码不同(真正按字母表顺序比较字符串时候)。

与NaN比较的时候永远都返回false

3.7 相等操作符

相等(==)和不相等(!=)——先转换再比较(强制转型)

全等(===)和不全等(!==)——仅比较而不转换

null == undefined 会返回 true,因为它们是类似的值;但 null === undefined 会返回 false,因为它们是不同类型的值

为了保持代码中数据类型的完整 性,我们推荐使用全等和不全等操作符

3.8 条件操作符

表达式为:表达式1?表达式2:表达式3

先求解表达式1,若其值为真(非0)则将表达式2的值作为整个表达式的取值,

否则(表达式1的值为0)将表达式3的值作为整个表达式的取值。

3.9 赋值操作符

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

3.10 逗号操作符

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

逗号操作符多用于声明多个变量;但除此之外,逗号操作符还可以用于赋值。在用于赋值时,逗号操作符总会返回表达式中的后一项

4.流控制语句

4.1 if语句

if (condition) statement1 else statement2

condition(条件)可以是任意表达式

调用 Boolean()转换函数将这个表达式的结果转换为一个布尔值(不是布尔值的时候)

4.2 do-while语句(像 do-while 这种后测试循环语句最常用于循环体中的代码至少要被执行一次的情形。 )

一种后测试循环语句

对条件表达式求值之前,循环体内的代码至少会被执行一次

4.3 while语句

while(expression) statement

while 语句属于前测试循环语句

4.4 for语句

for (initialization; expression; post-loop-expression) statement

ECMAScript中不存在块级作用域,因此在循环内部定义的变量也可以在外部访问到

将这三个表达式全部省略,就可以创建一个无限循环

4.5 for-in语句(遍历)

for (property in expression) statement

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

表示要迭代的对象的变量值为 null 或 undefined,不执行循环体

Safari 3以前版本的for-in语句中存在一个bug,该bug会导致某些属性被返回两次

ECMAScript 对象的属性没有顺序。因此,通过 for-in 循环输出的属性名的顺序是不可预测的。 具体来讲,所有属性都会被返回一次,但返回的先后次序可能会因浏览器而异。

4.6 label语句

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

label: statement

加标签的语句一般都 要与 for 语句等循环语句配合使用

4.7 break和continue语句

用于在循环中精确地控制代码的执行

break 语句会立即退出循环, 强制继续执行循环后面的语句。而 continue 语句虽然也是立即退出循环,但退出循环后会从循环的顶 部继续执行

4.8 with语句

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

with (expression) statement;

目的主要是为了简化多次编写同一个对象的工作

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

由于大量使用 with 语句会导致性能下降,同时也会给调试代码造成困难,因此 在开发大型应用程序时,不建议使用 with 语句。

4.9 switch语句

一种流控制语句

语义:switch 语句中的每一种情形(case)的含义是:“如果表达式等于这个值(value),则执行后面的 语句(statement)”。而 break 关键字会导致代码执行流跳出 switch 语句。

通过为每个 case后面都添加一个 break 语句,就可以避免同时执行多个 case代码的情况。

可以在 switch 语句中使用任何数据类型,无论是字符串,还是对象都没有问题。其次,每个 case的值不一定是常量,可以是变量,甚至是表达式。

注意:switch 语句在比较值时使用的是全等操作符,因此不会发生类型转换(例如, 字符串"10"不等于数值 10)。

5.函数

  • ECMAScript中的函数使用 function 关键字来声明,后跟一组参数以及函数体。
  • 调用函数通过其函数名来调用

  • ECMAScript 中的函数在定义时不必指定是否返回值。

  • 任何函数在任何时候都可以通过 return 语句后跟要返回的值来实现返回值

  • return 语句也可以不带有任何返回值。在这种情况下,函数在停止执行后将返回 undefined 值。

一个函数中也可以包含多个 return 语句

  • 严格模式下:
  • 理解参数:

ECMAScript函数不介意传递进 来多少个参数,也不在乎传进来参数是什么数据类型。(原因:ECMAScript中的参数在内部是用一个数组来表示)

在函数体内可以通过 arguments 对象来 访问这个参数数组,从而获取传递给函数的每一个参数(arguments 对象只是与数组类似(它并不是 Array 的实例))

通过访问 arguments 对象的 length 属性可以获知有多少个参数传递给了函数

函数 doAdd()会在只有一个参数的情况下给该参数加上 10;如果是两个参数,则将那个参数简单 相加并返回结果。

  • 没有重载

ECMAScirpt 函数没有签名,因为其参数是由包含零或多个值的数组来表示的。而没有函数签名,真正的重载是不可能做到的。 如果在 ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数。

6.小结


6

你可能感兴趣的:(JS第三章)