语法
区分大小写:如函数名不能使用typeof,但可以使用typeOf。
标识符:指变量、函数、属性的名字,或者函数的参数。
标识符有如下规则:
- 第一个字符必须是字母、下划线(_)或者美元符号($)。
- 其他字符可以是字母、下划线、美元符号或者数字。
不能把关键字、保留字、true、false和null用作标识符。
注释
// 单行注释/*
* 多行注释,中间2个*不是必须的,
* 之所以添加,是为了注释可读性。
*/语句
ECMAScript中的语句以分号结尾。可以省略分号,但会影响性能(解析器需要时间去分析哪里应该插入分号),并且会导致删空格压缩时错误,因此任何时候都不建议删除。
多条语句放在{}中,单条最好也放在{}中,使代码更清晰。
关键字和保留字
书本第21页。
变量
松散类型,可以保存任何数据类型。
定义变量用var。
var message 像这样未经初始化的变量保存的是undefined。
初始化变量只是给变量赋一个值,并不会标记类型,所以可以:
var message="hi";
message=100; //有效,但不推荐使用var操作符定义的变量为局部变量,省略了var则变为全局变量(很难维护,不建议这么做)。
定义多个变量可以用逗号分开:
var message="hi",
day=12,
xwt="sb";数据类型
5种简单数据类型(也称基本数据类型):Undefined、Null、Boolean、Number、String
1种复杂数据类型(也称引用数据类型):Object
typeof 操作符——检测变量数据类型
对一个值使用typeof可返回如下字符串:
- “undefined”——如果这值未初始化、这个值为undefined或者未声明的值
- ”boolean“——如果这个值是布尔型
- "string"——如果这个值是字符串
- "number"——如果这个值是数值
- "function"——如果这个值是函数
var message=100;
alert(typeof message); //"number"
alert(typeof 95); //"number"
alert(typeof null); //"object"1、Undefined类型
只有一个值:undefined
未初始化的变量,系统默认就给这个变量赋值undefined。
2、Null类型
只有一个值:null
表示空对象指针。
虽然alert(undefined==null)返回true但这两个值用途完全不同。
一般用于想要保存对象的变量还未真正保存对象,就应该明确地让变量保存null值。(推荐)
3、Boolean类型
值为true或者false
任何数据类型调用Boolean()函数都可以转换为Boolean类型,至于返回的是true还是false参考书本27页。
控制流语句(如if语句)会自动执行相应的Boolean转换。
4、Number类型
var intNum=10; //十进制
var octalNum=070; //八进制0
var hexNum=0xA; //十六进制0x在进行算术时都转化为十进制。
浮点数:最高精度17位小数,但实际上浮点数不太精确,所以不要测试特定的浮点数值。可以用e简写,比如2.123e5表示212300。
var floatNum1=1.1
var floatNum2=1. //可以,但不推荐
var floatNum3=1.0 //解析为1数值范围:可以用isFinite()函数测试该值是否在ECAMScript范围中。
NaN非数值。任何数字除以非数字都会返回NaN。NaN与任何值不相等,包括本身。
isNaN()函数判断这个值是否不能转为数值。如:
alert(isNaN(NaN)); //true 不能转换成数值
alert(isNaN("10")); //false 可以转换成数值有3个函数可以把非数值转化为数值:
- Number()
- parseInt() 常用,只能解析为整数,可区分不同的进制
- parseFloat() 只能解析为十进制
5、String类型
字符串,单引号、双引号无区别。
String数据类型包含特殊的字符字面量,如\n(换行) \t \b \r \unnnn,也叫转义序列。转义序列都表示一个字符,如
var text="ni\n";
alert(text.length); //显示3任何字符串的长度都可以通过其属性length获取。
把值转化为字符串:
- toString()方法:除null和undefined值都有的一个方法。该方法有一个可选的参数,以表示不同的进制输出,默认为十进制:
var num=10;
alert(num.toString()); //"10"
alert(num.toString(2)); //"1010"- String()函数:一般在不知道要转换的值是不是null或者undefined时使用。它的机制是如果该值有toString()方法就先调用该方法。
6、Object类型
ECAMScript中的对象其实就是数据与功能的集合。创建对象如下:
var o=new Object();
var o=new Object; //有效,但不推荐Object类型所具有的任何属性和方法同样保存于更具体对象中,每个实例有下列属性和方法:
- constructor:保存着用于创建当前对象的函数。
- hasOwnproperty(propertyName):用于检查给定的属性在当前对象实例中。
- isPrototypeOf(object):检查传入的对象是否是当前对象的原型。
- propertyIsEnumerable(protertyName):用于检查给定的属性能否使用for-in枚举。
- toLocaleString():返回对象的字符串表示。
- toString():返回对象的字符串表示。
- valueOf():返回对象的字符串、数值、布尔值表示。通常与toString()返回值相同。
操作符
操作数据值
一元操作符
只能操作一个数值。
①递增和递减操作符:前置时,变量的值在求值前被改变;后置时,变量的值在求值后被改变:
var age=29;var anotherAge=29;var age1=++age+1 var age2=anotherAge++ +1 alert(age1); //31alert(age2); //30递增和递减操作符可用于字符串、布尔值、浮点数值和对象,执行前先将这些值转化为数值,最后操作结果也变成数值。
②一元加和减操作符
一元加放数值前面无影响,一元减放数值前面主要用于表示负数。
在对非数值进行操作时,会先像Number()转型函数一样对这个值进行转型,得到结果为数值。
位操作符
按内存中数值的位来操作数值。如果是非数值,则会自动使用Number()函数将值转化为数值,最后得到的结果也是数值。
ECMAScript中的数值以64位存储,但是在操作中会转为32位。负数是绝对值取反加1求得补码进行操作,但ECAMSpcript最后输出给我们看到的结果一般是绝对值的二进码再加上负号。
补码求真值时需先转化为原码(第一位和最后一位不变,中间取反)。
①按位非(~):返回反码
②按位与(&):两个数值对应位都为1时返回1,其余都为0
③按位或(|):两个数值对应位都为0时返回0,其余为1
④按位异或(^):两个数值对应位不相同时返回1,相同返回0
⑤左移(<<):将数值所有位左移指定位数,用0填充空位
⑥有符号右移(>>):将数值所有位右移指定位数,用符号位填充空位
⑦无符号右移(>>>):将数值所有位右移指定位数,用0填充空位
布尔操作符
①逻辑非(!):不是布尔类型的数据类型,都会先使用Boolean()转化位布尔值,然后求反
②逻辑与(&&):两个都是true才返回true。
逻辑与操作在有一个操作数不是布尔型的情况下不一定返回布尔值.。这种情况下,一般第一个操作数用Boolean()返回是false,则逻辑与返回第一个操作数。否则,返回第二个操作数。
逻辑与是短路操作,即第一个操作数是false,就不会对第二个操作数求值。
③逻辑或(||):一个操作数是true,则返回true。
逻辑或操作在有一个操作数不是布尔型的情况下不一定返回布尔值.。这种情况下,一般第一个操作数用Boolean()返回是true,则逻辑与返回第一个操作数。否则,返回第二个操作数。
逻辑或也是短路操作,即第一个操作数是true,就不会对第二个操作数求值。
乘性操作符
乘法、除法和求模。
在操作数为非数值时会自动通过Number()函数转型成数值。
注意一些操作数是特殊值的情况:P47
加性操作符
①加法
操作数有非数值时:是字符串则全都转为字符串拼接,无字符串则转为数字相加。(优先转化字符串拼接)
有字符串时,可以使用括号改变优先级,从而输出不同的结果。var testBoolean1=true, testBoolean2=false, testNum1=5, testNull=null, testUdnefine, testString1="3", result1=testBoolean1+testBoolean2, //1 result2=testUdnefine+testNum1, //NaN result3=testNum1+testNull1, //5 result4=testString1+testNum1, //"35" result5=testString1+testNull, //"3null" result6=testNull+testUdnefine //NaN②减法
减法如果是非数值,则自动使用Number()函数转化为数值再操作,Object类型则使用valueOf()方法。
关系操作符
<,>,<=,>= 这几个操作符都返回一个布尔值。特别需要注意的点:
- 如果两个操作数中有一个是数值或者布尔值,则另一个操作数转化为数值再比较。(优先转化数值比较)
- 如果两个操作数都是字符串,则比较字符串对应的编码。
相等操作符
相等(==)和不相等(!=):先转换,再比较
优先转化为数值比较。
全等(===)和不全等(!==):仅比较,不转换
条件操作符
variable=boolean_expression ? true_value : false_value;
赋值操作符
var num=10;
num += 10; //复合赋值,即num=num + 10;逗号操作符
多用于声明多个变量。用于赋值时,逗号操作符总会返回表达式中最后一项。
var num = (1,2,3); // num=3;注意:转型函数都是构造函数,不改变本身,只是新建了一个。要改变本身,还需进行赋值。
语句
if 语句
if括号中的语句会自动转型为Boolean类型。
if(){
……
}else if(){
……
}else {
……
}do-while 语句
var i=10;do { i += 2;}while (i<10);alert(i); //12while 语句
var i=10;while(i<10){ i += 2;}alert(i); //10for 语句
for(var i=0;i<10;i++){ alert(i);}for的条件能省略。能用for实现的,都能用while 语句实现。
for-in 语句
用来枚举对象的属性。对象变量是null或者undefined时,不执行,所以执行前先检测确定这个对象的值是不是null或者undefined。
for(var name in window){ document.write(name+" ");}ECAMScript对象的属性没有先后顺序。
label 语句
用法 label : statement作用:可以在将来由break或continue语句引用。
一般与for等循环语句配合使用。
break 和 continue 语句
break语句会立即退出循环,强制执行循环后面的语句;continue语句也会立即退出循环,但退出后从循环的项部继续执行。使用lable语句,可以标记退出哪个循环。
var num=0;outLable:for (var i=0;i<10;i++){ for(var j=0;j<10;j++){ if(i==5&&j==5){ break outLable; } num++; }}alert(num); //55with 语句
主要用于将代码的作用域设置到一个特定的对象中。不建议使用。
switch语句
value要和expression全等,就选哪条
switch (expression){
case value:statement;
break;
case value:statement;
break; default: statemment;
}switch在比较值时用的是全等符号,能用表达式求值后比较,但值不转型。
函数
封装多条语句,只要输入参数,便可返回想要的结果。
function functionName(ag0,ag1……){
statement
}函数中return之后的代码不会被执行。
return后面也可以不跟返回值return ;,这样就返回undefined。这种情况一般用在需要提前停止函数,又不需要返回值的情况。
命名的参数只是提供便利,不是必须的。
在函数体内通过arguments对象访问参数数组,从而获取传递给函数的每一个参数,如第一个元素是arguments[0]。
可以访问arguments的length属性获取有多少个参数传递给了对象。
arguments对象也可以和命名参数混着用,并且它的值始终与命名参数相等。
arguments对象的长度,由传入多少个参数决定。
没有传递值的命名参数的值为undefined。
ECMAScript中函数没有重载,所以如果定义了两个名字相同的函数,后定义的覆盖先定义。