第3章基本概念
3.1语法
C及其他类C语音(Java和Perl)的语法。
3.1.1区分大小写
变量名text和Text为两个不同变量。
3.1.2标识符
ECMAScript标识符采用驼峰大小写格式:即第一个字母小写,剩下每个单词的首字母大写,如:firstSecond。
3.1.3注释
单行注释 //
块级注释 /*……*/
3.1.4严格模式
1) 严格模式是为JavaScript定义了一种不同的解析与执行模式。
2) 启用方式:1.整个脚本启用:在顶部添加“use strict”
2.函数启用:在函数内部的上方如:
function doSomething(){
“use strict”;
}
3.1.5语句
1) ECMAScript中的语句以分号结尾,不要省掉。
2) 可以使用C风格的语法把多条语句组合到一个代码块中,即以{开头,以}结尾,如:
if(test){
test=false;
}alert(test);
始终在控制语句中使用代码,即使只有一个语句。
3.2关键字和保留字
最好不作为标识符和属性名。
3.3变量
1) 定义变量时要用var操作符,后跟变量名,如var message,该变量可用来保存任何值。未经初始化的变量会保存一个特殊的值—undefined。
2) 可初始化 如var message=”hi”;
3) var操作符定义的变量将成为定义,该变量的作用域中的局部变量。若在函数中用var定义一个变量,函数退出后,该变量被销毁。
4) 可省略var,创建一个局部变量。(不推荐)。
5) 可使用一条语句定义多个变量,把每个变量用逗号隔开,如:var message=”hi”;found=fales;age=29;
6) 严格模式下,变量名不能为eval和argument。
3.4数据类型
5种简单数据类型:Undefined,Null,Boolean,Number,String。一种复杂数据类型:Object。
3.4.1typeof操作符
type来检测给定变量的数据类型。
1) 可能返回的字符串
Undefined——如果这个值未定义
Number——如果这个值是数值
String——如果这个值是字符串
Object——如果这个值是对象或Null
Function——如果这个值是函数
alert(typeof message);
alert(typeof (message));
2) typeof操作符的操作数可为变量、数值。()不是必须的。
3.4.2 Undefined类型
1) 只有一个值,即特殊的Undefined。使用var声明变量未初始化时,这时的值为Undefined。
2) 未初始化和未声明的变量执行typeof操作符会返回Undefined。
3.4.3Null类型
1) 只有一个值。即Null。
2) typeof操作符检测时会返回“Object”。
3) 若定义的变量准备在将来用于保存对象,最好将该变量初始化为Null。
3.4.4Boolean类型
1) 有两个字面值:true、false。true不等于1,false不等于0。
2) true、false区分大小写。
3) ECMAScript中所有类型的值都有与这两个Boolean值相等的值。
4) 要将一个值转换为其对应的Boolean值,可调用转型函数Boolean()。
3.4.5Number类型
1) 十进制数直接输入。var intNum=55;
2) 八进制数的第一位必须为0(零),然后是0~7,若字面值中的数值超出了范围,前0被忽略,后面的值作十进制数值解析。
3) 类型转换,Number(),parseInt() 和 parseFloat()。第一个函数可以应用于任何数据类型,另两个函数专门用于把字符串转换成数值
3.4.6String类型
1) 值:由单引号或双引号括起来的字符序列
2) 出现场景:定义
3) 类型转换,有两种方法,String() 和 toString()
3.4.7Object类型
1) 值:一组属性的集合
2) Boolean-true
Number-NaN
String-"[object Object]"
3.5操作符
javascript的操作符有一元操作符、位操作符、布尔操作符、乘性操作符、加性操作符、关系操作符、相等操作符、条件操作符、赋值操作符。其中值得注意的是,一元操作符和相等操作符都有可能改变操作数的数值类型。J
3.5.1一元操作符:
递增操作符 ++
递减操作符 --
正数 +
负数 –
递增和递减操作符遵循的规则.
1.在应用于包含有效数字的字符串时,先将其转换为数字值,再执行加减1的操作。字符串变量变成数值变量。
2.在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN。字符串变量变成数值变量。
3.在应用于布尔值false/true时,先将其转换为0再执行加减1的操作。布尔值变量变为数值变量。
4.在应用于浮点数值时,执行加减1的操作。
5.在应用于对象时,先调用对象的valueOf()方法以取得一个可供操作的值,然后对该值应用前面的四条规则。如果结果是NaN,则在调用toSring()方法后再应用前面的规则。对象变量变成数值变量。
3.5.2位操作符
位操作符用于最基本的层次上,我们一般比较少用到。ECMAscript中所有数值都以IEEE-754 64位格式存储,但是位操作符并不直接操作64位的值,而是先将64位转换成32位的整数,然后执行操作,最后将结果转换回64位。这会带来一个严重的副效应,即在对特殊的NaN和Infinity值应用位操作时,两个值都会被当做0来处理。
按位非 ~
按位与 &
按位或 |
按位异或 ^
左移 <<
有符号右移 >>
无符号右移 >>>
3.5.3布尔操作
布尔操作用来测试两个值的关系
逻辑非 !
逻辑与 &&
逻辑或 ||
3.5.3.1逻辑非(!)
只操作1个操作数,无论操作数是什么数据类型,都返回一个布尔值。逻辑非操作不会改变操作数的数据类型。
逻辑非(!)操作符的规则:
1.如果操作数是一个对象,则返回false。
2.日字旁操作数是一个空字符串,则返回true。
3.如果操作数是一个非空字符串,则返回false。
4.如果操作数值是0,则返回true。
5.如果操作数是任意非0数值(包括Infinity),返回false。
6.如果操作数是null,返回true。
7.如果操作数是NaN,返回true。
8.如果操作数是undefined,返回true。
3.5.3.2逻辑与(&&)
逻辑与有两个操作数,它可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值。
逻辑与(&&)操作符的规则
1.如果第一个操作数是对象,则返回第二个操作数。
2.如果第二个操作数是对象,则只有在第一个操作数的求值结果为true时才返回这个对象。
3.如果两个操作数都是对象,则返回第二个操作数。
4.如果有一个操作数时null,则返回null。
5.如果有一个操作数时undefined,则返回undefined。
逻辑与是一种短路操作,如果第一个操作数能够决定结果(如null,undefined),那么就不会对第二个操作数求值。
3.5.3.3逻辑或(||)
逻辑或的操作数有两个,如果其中有一个操作数不是布尔值,逻辑或也不一定返回布尔值,它遵循的规则如下:
1.如果第一个操作数是对象,则返回第一个操作数;
2.如果第一个操作数求值结果为false,则返回第二个操作数;
3.如果两个操作数都为对象,则返回第一个操作数;
4.如果两个操作数都是null,则返回null;
5.如果两个操作数都是NaN,则返回NaN;
6.如果连个操作数都是undefined,则返回undefined。
可见逻辑或也是一种短路语句,如果第一个操作数的求值结果为true则不会对第二个操作数进行求值。
注意:由以上规则可知,逻辑操作符均不会改变操作数的数据类型。
利用逻辑与来避免为变量赋null或者undefined的值。
3.5.4乘性操作符
乘性操作符和其他语言中的乘性操作符用法类似,只不过在操作数为非数值的情况下会执行自动的类型转换。即参与乘性计算的某个操作数不是数值,会先使用Number()转型函数将其转换为数值。但是乘性操作不会改变操作数数值类型。
乘法(*)
除法(/)
求模(%)
3.5.5加性操作符
加性操作符在操作数都为数值的时候执行常规的加减法操作,在为非数值时会有特殊的转化规则。但是同乘性操作符一样加性操作符不会改变数值类型。
加法(+)
减法(-)
3.5.5.1加性操作符
加性操作符在有操作数为字符串时遵循以下规则:
1.如果两个操作数都为字符,则将第二个操作数与第一个操作数拼接起来;
2.如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后将两个字符串拼接起来;
3.5.5.2减性操作符
1.如果有一个操作数是字符串,布尔值、null或者undefined,则先调用Number()方法,然后再根据数值减法规则执行减法计算。
2.如果有一个操作数是对象,则调用对象的valueOf()方法取得该对象的数值。如果对象没有valueOf()方法方法,则调用tostring()方法并将得到的字符串转换为数值。
3.5.6关系操作符
小于(<)
大于(>)
小于等于(<=)
大于等于(>=)
3.5.7相等操作符
相等(==)
不相等(!=)
全等(===)
不全等(!==)
1) 相等和不相等
这组操作符是先转换再比较,即操作符会改变操作数的数值类型。
1.如果有一个操作数是布尔值,则在比较之前会转换为数值;
2.一个操作数是字符,另一个是数值,那么在比较相等性之前会将字符串转换为数值再进行比较;
3.如果一个操作符是对象,另一个不是,则调用valueOf()方法,将得到的结果进行比较。
4.如果两个都是对象,则比较是否是同一个对象,如果两个操作数都指向同一个对象,那么认为它们相等。
2) 全等和不全等
全等和不全等操作符不会改变操作数的数值类型。
3.5.8条件操作符
条件操作符会根据boolean_expression的求值结果来决定给变量value赋哪个值,求值为真是赋true_value值,为假时赋false_value值。
3.5.9赋值操作符
赋值(=)
乘/赋值(*=)
初/赋值(/=)
模/赋值(%=)
加/赋值(+=)
减/赋值(-=)
左移/赋值(<<=)
无符号右移/赋值(>>>=)
有符号右移/赋值(>>=)
3.5.10逗号操作符
逗号操作符用于在一条语句中执行多个操作。赋值时返回表达式的最后一项。
3.6语句
3.6.1.if语句
if (condition) statement1 else statement2
其中的condition条件可以是任意表达式,而且对这个表达式的求值结果不一定是布尔值。ECMAScript会自动调用Boolean()转换函数将这个表达式的结果转换为一个布尔值。如果对condition求值的结果为true,则执行statement1,如果对condition求值结果为false,则执行statement2。这两个语句既可以是一行代码,也可以是一个代码块(推荐)。
3.6.2.switch语句
switch(expression) {
case value: statement
break;
case value: statement
break;
case value: statement
break;
default: statement
}
switch语句中每一个case的含义是:"如果表达式等于这个值value,则执行后面的语句statement"。而break会导致代码执行跳出switch语句。如果省略break关键字,就会导致执行完当前case后,继续执行下一个case。最后的default关键字则用于在表达式不匹配前面任何一种情形时,执行机动代码(因此,也相当于一个else语句)。
3.6.3.do-while语句
do {
statement
} while (expression);
3.6.4while语句
while(expression) statement
3.6.5.for语句
它具有在执行循环之前初始化变量和定义循环后要执行代码的能力。
for(var i = 0;i < 10;i++) {
alert(i);
}
3.6.6for-in语句
for-in 语句是一种精准的迭代语句,可以用来枚举对象的属性
for (var prop in window) {
console.log(prop);
}
ECMAScript对象的属性没有顺序。因此通过for-in循环输出的属性名是不可预测的,具体来讲,所有属性都会被返回一次,单反毁的先后次序可能会因浏览器而异。建议在使用之前,先检测确认该对象的值不是null或unedfined。
3.6.7
break语句
立即退出循环
continue语句
退出当前正在执行的循环代码,然后开始继续循环。
return语句
可指定返回值,也可不指定(此时返回undefined)。
1.return语句后停止并立即退出函数,return后面的语句也永远不会执行
2.return语句只能在函数体内出现,如果不是的话会自动报语法错误
3.7函数
在JavaScript里有两种定义函数的方法
函数声明 function 函数名称 (参数:可选){ 函数体 }
函数表达式 function 函数名称(可选)(参数:可选){ 函数体 }
在JavaScript中,每个函数其实都是一个Function对象。
函数总是会返回一个值,但是一个过程有可能返回一个值,也有可能不返回。(函数不是过程)
如果一个函数中没有使用return语句,则它默认返回undefined。要想返回一个特定的值,则函数必须使用 return 语句来指定一个所要返回的值。(使用new关键字调用一个构造函数除外)。
调用函数时,传递给函数的值被称为函数的实参(值传递),对应位置的函数参数名叫作形参。
如果实参是一个包含原始值(数字,字符串,布尔值)的变量,则就算函数在内部改变了对应形参的值,返回后,该实参变量的值也不会改变。
如果实参是一个对象引用,则对应形参会和该实参指向同一个对象。假如函数在内部改变了对应形参的值,返回后,实参指向的对象的值也会改变。
在函数执行时,this 关键字并不会指向正在运行的函数本身,而是指向调用该函数的对象。
所以,如果你想在函数内部获取函数自身的引用,只能使用函数名或者使用arguments.callee属性
(严格模式下不可用),如果该函数是一个匿名函数,则你只能使用后者。