【JavaScript】JavaScript高级程序设计 第三章 基本概念

3.1语法

3.1.1区分大小写

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

3.1.2 标识符

标识符:变量、函数、属性的名字,或者函数的参数。

命名规则:1.第一个字符必须是字母or _ or $

​ 2.其他字符可以是字母、_、$、数字

惯例:标识符采用驼峰大小写格式

提示:关键字、保留字、true、false和num不能用作标识符。

3.1.3 注释

单行注释 //

块级注释

/*

*

*

*/

提示:第二行和第三行以星号开头不是必须的。

3.1.4严格模式

作用:严格模式是为javascript定义了一种不同的解析与执行模型。

启用严格模式方法:

1.顶部添加“use strict”(此为编译指示)

2.函数内部上方添加use strict”

function fn(){

“use strict”

//函数体

}

3.1.5语句

1.分号:

ECMAScript语句以分号结尾;如果省略分号,则由解析器确定语句的结尾。

惯例:不要忽略分号,节省解析器推测插入分号这个过程的时间。

2,括号:

把多行语句放入代码块中。

惯例:在条件控制语句中不论单行还是多行语句,始终在控制语句中使用代码块。

3.2关键字和保留字

关键字:表示控制语句的开始或结束,或者用于执行特定操作。

保留字:将来可能被用作关键字。

提示:关键字和保留字不能作为标识符。

3.3变量

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

操作符:var 定义变量

逗号:一条语句定义多个变量,用逗号隔开。

提示:1.未经过初始化的变量值为undefined

​ 2.可以在修改变量值的同时修改值的类型(不推荐)

​ 3.用var操作符定义的变量为局部变量

​ 4.不用var操作符定义的变量为全局变量(不推荐)

​ 5.严格模式下不能定义名为eval和arguments的变量。

类型(基本数据类型):undefined null boolean number string

1种复杂数据类型:object(无序的名值对)

提示:ECMAScript不支持任何创建自定义类型的机制。

3.4.1typeof操作符

作用:检测变量的数据类型

返回值:undefined - 变量未定义

​ Boolean - 变量为布尔值

​ string - 变量为字符串

​ number - 变量为数字

​ object - 变量为对象或null3/*

​ function - 变量为函数

提示:1.typeof操作符的操作数可以是变量也可以是数值字面量

​ 2.typeof 变量/字面量 或者 typeof (变量/字面量)

​ 3.特殊值null被认为是空对象的引用,所以返回对象

​ 4.function不是一种数据类型,而属于对象。

3.4.2undefined类型

值:只有undefined一个值。

作用:使用var声明变量但为初始化时变量值就为undefined。

提示:1.未声明的变量和声明未初始化的变量不同,前者会导致出错。

​ 2.未声明的变量只能执行typeof操作符这一项操作。

​ 3.未声明的变量和声明未初始化的变量使用typeof返回值都是undefined。

惯例:没必要将变量显式设置为undefined

3.4.3null类型

值:只有null一个值。

提示:1.null值表示一个空对象指针,即空对象引用。

​ 2.typeof操作符检测null时返回object

​ 3.null == undefined // true undefined值是派生自null值的 这个操作符会转换其操作数

惯例:如果定义的变量准备用来保存对象,初始化为null。

3.4.4boolean类型

值:true和false

转型函数Boolean(): 对任何数据类型的值调用该函数,返回一个Boolean值。

​ boolean类型-true:true;false:false

​ string类型-true:非空字符串;false:“”(空字符串)

​ number类型-true:任何非0数字值;false:0和NaN

​ object类型-true:任何对象;false:null

​ undefined-true:不适用;false:undefined

提示:boolean类型的字面值区分大小写

3.4.5number类型

整数

十进制字面值:直接输入

八进制字面值:070//八进制的56 079//无效的八进制数值,被解析为79(在严格模式下无效)

十六进制字面值:0xA//十六进制的10

提示:1.在进行算术计算时,所有的八进制和十六进制的数值都是被转换成十进制数值进行计算。

​ 2.可以保存+0和-0,两者相等。

浮点数值

初始化:1.1 0.1 .1(不推荐)

隐式转换成整数:1.小数点后没跟任何数字1. 2.浮点数值本身就是一个整数10.0

科学计数法:默认情况下小数点后带有6个0以上的浮点数值会被转换成科学计数法形式。

浮点数的精度:最高精度为17,但在进行算术计算时其精确度不如整数。

提示:0.1+0.2 !=0.3 而是0.30000000000000004,永远不要检测某个特定的浮点数值。

数值范围

最小数值:保存在Number.MIN_VALUE中

最大数值:保存在Number.MAX_VALUE中

isFinite():该函数在参数位于最小与最大数值之间时会返回true

提示:1.如果某数值超出最小数值被转换成-Infinity(负无穷),如果某数值超出最大数值被转换成Infinity(正无穷)

​ 2.无穷数不能参加算数计算。

NaN

意义:Not a Number 表示一个本来要返回数值的操作数未返回数值的情况。

isNaN():是否“不是数值”

​ 能转换成数值返回false 不能转换成数值返回true

​ 当判断对方是否”不是数值“时,先调用对象的valueOf()方法;确定该方法返回的值是否可以转换成数值;如果不能再调用toString()方法。

数值转换

强制数据类型转换方法:①Number() ②parseInt() ③parseFloat()

①Number():将任何数据类型转换成数字

字符串=》数字: 空格、空=》0 ‘100’=》100 ‘1.1’=》1.1 十六进制=》十进制整数 ‘100px’=》NaN

布尔值=》数字: true=》1 false=》0

null=》数字:0

undefined=》数字:NaN

函数=》数字:NaN

数组=》数字: 空=》0 只有一个成员=》第一个成员转换 多个成员=》NaN

Json =》数字:NaN

对象=》数字:①调用对象的valueOf()方法,然后根据前面的规则转换,如果转换的值为NaN,调用toString()函数,再根据规则转换返回的字符串值。

②parseInt():将字符串转换成整数

parseInt(b,10) 从左到右一个一个转换,遇到一个非 数字/+/-/空格的东西就截断不管后面的内容。

惯例:避免错误的解析建立无论什么情况下都明确指定基数。

③parseFloat():将字符串转换成浮点型

在parseInt的基础上认识第一个小数点。

只能解析十进制数,所以没有第二个参数。

提示:1.任何涉及NaN的操作都会返回NaN

​ 2.NaN与任何值都不相等,包括NaN本身 NaN==NaN =》false

3.4.6string类型

字符字面量(转义序列):表示非打印字符或者具有其他用途的字符。

length属性:返回字符串的长度

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

var lang = “Java”;

lang = lang + “Script”;

首先创建一个能容纳10字符的新字符串,然后在这个字符串中填充“Java”和“Script”,最后一步是销毁原来的字符串“Java”和“Script”。

转换为字符串:①toString() ②String()

①toString()数值 布尔值 对象和字符串都有这个方法 但是null和undefined没有

该方法可以设置一个基数用以输出指定进制的值

②String()

如果值有toString()方法则调用该方法;如果值为null返回“null”;如果值为undefined返回“undefined”;

惯例:使用加号操作符把某个值与一个字符串“”加在一起转换成字符串

3.4.7object类型

意义:一组数据和功能的集合。

创建:new Object() 圆括号可以省略但不推荐

object每个实例具有的属性和方法:

constructot:保存创建当前对象的函数

hasOwnProperty(“propertyName”):检查给定的属性在当前对象实例中是否存在

isPrototypeof(object):检查传入的对象是否是当前对象的原型

properIsEnumerable(“propertyName”):检查给定的属性是否能够用for-in语句来枚举。

toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。

toString():返回对象的字符串表示

valueOf():返回对象的字符串、数值或布尔值表示

提示:object类型所具有的任何属性和方法也同样存在于更具体的对象中。

3.5 操作符

3.5.1 一元操作符

意义:只能操作一个值的操作符

递增和递减操作符

前置型:变量的值都是在语句被求值以前改变的

后置型:递增和递减操作是在包含它们的语句被求值之后才执行的

一元加和减操作符

在对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值进行转换。

3.5.2 位操作符

3.5.3布尔操作符

逻辑非!:将操作数转换为一个布尔值,在对其求反。

提示:1.同时使用两个逻辑非操作符,实际上就会模拟boolean()转型函数的行为。

逻辑与&&:

第一个操作数是对象,返回第二个操作数

第二个操作数是对象,只要在第一个操作数返回true时才会返回该对象。

两个操作数都是对象,则返回第二个操作数

第一个操作数为null,则返回null

第一个操作数为NaN,则返回NaN

第一个操作数为undefined,则返回undefined

提示:1.如果第一个操作数的值是false,就不会对第二个操作数求值。

逻辑或||:

第一个操作数是对象,则返回第一个操作数

两个操作数都是对象,则返回第一个操作数

提示:1.如果第一个操作数的值是true,就不会对第二个操作数求值。

3.5.4乘性操作符

在操作数为非数值的情况下会执行自动的类型转换,如果参加计算的操作数不是数值,会使用Number()转型函数将其转换为数值。

乘法*:

有NaN参与,结果为NaN

Infinity*0,结果为NaN

Infinity*非零数值,结果为Infinity或-Infinity

Infinity*Infinity,结果为Infinity

除法/:

有NaN参与,结果为NaN

Infinity被Infinity除,结果为NaN

0/0,结果为NaN

非0的有限数/0,结果是Infinity或-Infinity

Infinity被任何非0数除,结果是Infinity或-Infinity

求模%:

被除数是无穷大值而除数是有限大,结果为NaN

被除数是有限大值而除数是0,结果为NaN

Infinity/Infinity,结果为NaN

被除数是有限大值而除数是无限大值,结果是被除数

被除数是0,结果为0

3.5.5加性操作符

加性操作符也会隐式转换数据类型。

加法+:

如果有NaN,结果为NaN

Infinity+Infinity,结果为Infinity

-Infinity+ -Infinity,结果为-Infinity

Infinity+ -Infinity,结果为NaN

+0 + +0,结果为+0

-0+ -0,结果为-0

+0 + -0,结果为+0

如果有字符串,会使全部操作数都为字符串,再拼接起来。

如果有对象、数值或布尔值,会调用toString(),undefined和null会调用string()取得字符串“undefined”和“null”

减法-:

如果有NaN,结果为NaN

Infinity - Infinity,结果为NaN

-Infinity - -Infinity,结果为NaN

Infinity- -Infinity,结果为Infinity

-Infinity - Infinity,结果为Infinity

+0 - +0,结果为+0

-0 - +0,结果为-0

-0 - -0,结果为+0

3.5.6关系操作符

< > <= >=

当关系操作符的操作数使用了非数值时

两个操作数都是字符串,比较字符串对应的字符编码

一个操作数是数值,将另一个操作数转换成数值进行比较

一个操作数是布尔值,将它转换为数值进行比较

提示:1.大写字母的字符编码全部小于小写字母的字符编码

​ 2.任何操作数与NaN进行关系比较,结果都是false

3.5.7相等操作符

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

有一个操作数是布尔值,将false转换为0,true转换为1

一个操作数是字符串,另一个操作数是数值,先将字符串转换为数值再进行比较

提示:1.null和undefined是相等的

​ 2.有一个操作数是NaN,相等操作符返回false,不相等操作符返回true

​ 3.NaN != NaN

全等(===)和不全等(!==)——仅仅比较不转换——也可以理解为包括类型一起比较

提示:1.null===undefined会返回false

​ 2.推荐使用全等和不全等操作符,保持数据类型的完整性

3.5.8条件操作符

?:

3.5.9赋值操作符

在等号前再添加乘性操作符、加性操作符或位操作符,可以完成复合赋值操作。

提示:复合赋值操作的目的是简化赋值操作,不会提升性能

3.5.10逗号操作符

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

用于赋值:逗号操作符返回表达式中的最后一项。

var num = (5,1,4,8,0);//num的值为0

3.6语句

使用一个或多个关键字来完成给定任务

3.6.1if语句

自动调用boolean()转换函数将表达式的结果转换成一个布尔值

惯例:始终使用代码块,即使要执行的只有一行代码

3.6.2do-while语句

后测试循环语句:只有在循环体的代码执行后才会测试出口条件。

特点:循环体内的代码至少会被执行一次。

3.6.3while语句

前测试循环语句:在循环体内的代码被执行之前,就会对出口条件求值。

3.6.4for语句

前测试循环语句。

提示:1.while循环做不到的事情for循环也做不到

​ 2.for循环的变量初始化表达式中可以不适用var关键字

3.6.5for-in语句

迭代语句,用来枚举对象的属性。

提示:在使用for-in循环之前,先检测确定该对象的值不是null或undefined

3.6.6label语句

作用:在代码中添加标签,以便将来使用。

3.6.7break和continue语句

break:立即退出循环,强制继续执行循环后的语句

continue:退出本次循环,进行下一次循环

两者可以和label语句联合使用,返回代码特定的位置

3.6.8with语句

作用:将代码的作用域设置到一个特定的对象中,简化多次编写同一个对象的工作

提示:严格模式下不允许使用with语句

3.6.9switch语句

break关键字会导致代码执行流跳出switch语句。如果省略break关键字就会导致执行完当前case后继续执行下一个case。

default关键字用于在表达式不匹配前面任何一种情形的时候执行机动代码。

惯例:1.通过为每个case添加break语句避免同时执行多个case代码

​ 2.如果确实要混合几种情形,要在代码中添加注释,说明是有意省略了break关键字

3.7函数

提示:1.位于return语句之后的任何代码都永远不会执行。

​ 2.return语句可以不带有任何返回值,函数在停止执行后将返回undefined值。

惯例:1.要么让函数始终都返回一个值,要么永远都不要返回值

​ 2.严格模式下函数名和参数名不能为eval或arguments

​ 3.严格模式下不能出现两个命名参数同名的情况

3.7.1 理解参数

提示:1.即便你定义的函数只接收两个参数,在调用这个函数时也未必一定要传递两个参数,可以一个也可以三个,也可以不传。

​ 2.参数是由一个数组来表示的,函数接收的始终是这个数组,而不关心数组里包含哪些参数。

​ 3.在函数体内可以通过arguments对象来访问这个参数数组。

​ 4.arguments对象可以和命名参数一起使用,它的值用于与对应的命名参数的值保持同步。

​ 5.arguments对象和命名参数不是在相同的内存空间,它们的内存空间是相互独立的,但它们的值会同步。

​ 6.arguments对象的长度是由传入的参数个数决定的,而不是由定义函数时的参数个数决定的。

​ 7.没有传递值的命名参数将自己被赋予undefined值。

​ 8.严格模式下arguments对象的赋值无效。重写arguments的值会产生错误。

​ 9.js中所有参数传递的都是值,不可能通过引用传递参数。

弥补js函数无重载的遗憾:

1
2
3
4
5
6
7
function doAdd(){
if(arguments.length == 1){
alert(arguments[0]+10);
}else if(arguments.length == 2){
alert(arguments[0]+arguments[1]);
}
}

3.7.2没有重载

提示:1.没有函数签名,不可能有真正的重载。

​ 2.js中定义两个名字相同的函数,该名字只属于后定义的函数。