javascript高级程序设计学习笔记——第三章 基本概念

时间:2020-12-29 10:20:25

一、语法

ECMAScript的语法大量借鉴了C及其他类C语言的语法;

1、区分大小写

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

2、标识符

所谓标识符,就是指变量、函数、属性的名字,或者函数的参数,标识符可以是按照下列的格式规则组合起来的一或多个字符:

第一个字符必须是一个字母、下划线或一个美元符($)构成;

其他字符可以是字母、下划线、美元符号($)或数字;

按照惯例,ECMAScript标识符采用驼峰大小写格式(驼峰命名法);

不能把关键字、保留字、true、false和null用作标识符;

3、注释

ECMAScript使用C风格的注释,包括单行注释(//注释内容)和多行注释(/*注释内容*/);

4、严格模式

ECMAScript 5 引入了严格模式的概念,严格模式是javascript定义了一种不同的解析与执行模型。在严格模式下,ECMAScript 3 中一些不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误。要在整个脚本中启用严格模式,可以在顶部添加如下代码:

"user strict";

这行代码是一个编译指令,用于告诉支持的javascript引擎切换到严格模式;

在函数内部的上方包含这条编译指令,也可以指定函数在严格模式下执行:

function doSomething(){
"user strict";
//函数体
}

5、语句

ECMAScript中的语句以一个分号结尾,虽然语句结尾的分号不是必需的,但是建议任何时候都不要省略;

二、关键字和保留字

按照规则, 关键字和保留字不能作为标识符和属性名;

三、变量

ECMAScript的变量时松散类型的,所谓松散类型就是可以用来保存任何类型的数据,定义变量时要使用 var 操作符,后跟变量名,如:

var message;	//该变量可以用来保存任何类型的数据,像这种没有经过初始化的变量,会保存一个特殊的值——undefined;


可以在修改变量值的同时修改值的类型:

var message = "Hellow";
message = 100; //有效,不推荐

省略var操作符可以定义变量为全局变量,但不推荐这种做法,因为在局部作用域中定义的全局变量很难维护;

function test(){
message = "Hellow"; //不推荐这种方式定义变量message
}
test();
alert(message); //有效,打印 "Hellow"

可以使用一条语句定义多个变量;

var message = "Hellow",found = false,age = 12;

因为ECMAScript是松散类型,因此使用不同类型初始化变量的操作可以放在一条语句中完成;

四、数据类型

ECMAScript中有5中简单数据类型(也称为基本数据类型):Undefined、Null、Number、Boolean、String,还有一种复杂数据类型——Object;

ECMAScript不支持任何创建自定义类型的机制,而所有的值最终都将是上述的6中数据类型之中的一种;

1、typeof操作符

检测给定变量的数据类型——typeof 操作符,对一个值使用typeof操作符可能返回下列字符串:

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

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

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

"number"——如果这个值是数值(整数、浮点数);

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

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

var message = "some thing";
alert(typeof message); //"string"
alert(typeof(message)); //"string"
alert(typeof 12); //"number"


typeof是一个操作符而不是函数,所以例子中的圆括号不是必需的,可用可不用;

2、Undefined类型

Undefined类型只有一个值,就是特殊的undefined;在使用var声明变量但没有初始化的时候,这个变量的值就是undefined;

var message;
alert(message == undefined); //true

对于未声明的变量,只能执行一项操作,就是使用typeof操作符检测其数据类型;

var message;				//这个变量声明之后默认取得了undefined值;
//下面这个变量并没有声明
//var age
alert(typeof message); //"undefined"
alert(typeof age); //"undefined"

3、Null类型

Null类型只有一个值null,null值是一个空对象指针;使用typeof操作符检测null值,返回的是"object"类型;

var car = null;
alert(typeof(car));//"object"

如果定义的变量准备在将来用于保存对象,那么最好将这个变量显示的初始化为null;这样一来,只要直接检查null就可以知道相应的变量是否已经保存了一个对象的引用;

undefined值是派生自null值的;

alert(null == undefined);		//true

尽管null和undefined有这样的关系,但它们的用法完全不同。无论在什么情况下都没有必要把一个变量的值显示的设置为undefined,如果定义的变量准备在将来用于保存对象,那么最好将这个变量显示的初始化为null;

4、Boolean类型

Boolean类型只有两个值:true和false,true不一定等于1,false不一定等于0,区分大小写;

要将一个值转换为对象的Boolean值,可以调用转型函数Boolean(任何数据类型的值);

var message = "Hellow world!";
var messageAsBoolean = Boolean(message);

各种数据类型及其对应的转换规则:

String:任何非空字符串转换为true值,空字符串(" ")转换为false值;

Number:任何非0数字值(包括无穷大)转换为true值,0或NaN转换为false值;

Object:任何对象转换为true值,null转换为false值;

Undefined:undefined值转换为false值;

5、Number类型

6、String类型

7、Object类型

五、操作符

1、一元操作符

2、位操作符

3、布尔操作符

4、乘性操作符

5、加性操作符

6、关系操作符

7、相等操作符

8、条件操作符

9、赋值操作符

10、逗号操作符

六、语句

1、if语句

2、do-while语句

3、while语句

4、for语句

5、for-in语句

6、label语句

7、break和continue语句

8、with语句

9、switch语句

七、函数

ECMAScript中的函数使用function关键字声明,后跟一组参数和函数体,函数的基本语法如下:

function functionName(arguments0, arguments1, argument2 ...){

}

函数可以通过函数名调用,后面还要加上一对圆括号和参数,圆括号中的参数如果有多个,可以用逗号隔开;

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

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

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

不能把函数命名为eval或arguments;

不能把参数命名为eval或arguments;

不能出现两个命名参数同名的情况;

1、理解参数

ECMAScript函数不介意传递进来多少个参数,也不在乎传进来参数时什么数据类型。也就是说,即使你定义的函数只接收两个参数,在调用这个函数时未必一定要传递两个参数。可以传递一个或三个甚至不传递参数,而解释器不会有什么怨言;

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

function sayHi(){
<span style="white-space:pre"> </span>alert("Hello" + arguments[0] + "," + arguments[1]);
}

ECMAScript函数重要特性:函数命名参数只是为了提供便利,但不是必需的;

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

function howManyArgs(){
<span style="white-space:pre"> </span>alert(arguments.length);
}
howManyArgs();<span style="white-space:pre"> </span>//0
howManyArgs(12, "we");<span style="white-space:pre"> </span>//2
howManyArgs(12);<span style="white-space:pre"> </span>//1

arguments 对象可以跟命名参数一起使用,如:

function doAdd(num1, num2){
<span style="white-space:pre"> </span>if(arguments.length == 1){
<span style="white-space:pre"> </span>alert(num1 + 10);
<span style="white-space:pre"> </span>}else if (arguments.length == 2){
<span style="white-space:pre"> </span>alert(arguments[0] + num2);
<span style="white-space:pre"> </span>}
}

arguments 的值永远跟对应的命名参数的值相等,在函数中,修改 arguments 的值,对应的命名参数的值会发生改变以保持跟 arguments 的值一致;但是修改命名参数的值,不会改变 arguments 中对应的值;

没有传递值的命名参数将自动被赋值 undefined;


2、没有重载

ECMAScript函数不能像传统意义上那样实现重载,如果在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数,如:

function addSomeNumber(num){
<span style="white-space:pre"> </span>return num + 100;
}
function addSomeNumber(num){
<span style="white-space:pre"> </span>return num + 200;
}
var result = addSomeNumber(100);<span style="white-space:pre"> </span>//300