3.1语法
3.1.1区分大小写:
ECMAScript中的一切(变量、函数名和操作符)都区分大小写。变量名test和Test表示两个完全不同的变量。
3.1.2 标识符:
指变量、函数、属性的名字,或者函数上午参数。标识符第一个字符必须是一个字母,下划线_,或美元符号$。其他字符可以是字母,下划线,美元符号或数字。按照惯例,ECMAScript标识符采用驼峰大小写格式,即第一个字母小写,剩下的每个单词的首字母大写。如myCar
不能把关键字、保留字、true、false和null用作标识符。
关键字
break |
do |
indtanceof |
typeof |
case |
else |
new |
var |
catch |
finally |
return |
void |
continue |
for |
switch |
while |
debugger* |
function |
this |
with |
default |
if |
throw |
delete |
in |
try |
||||
|
|
|
|
|
保留字
abstract |
enum |
int |
short |
bollean |
export |
interface |
static |
byte |
extends |
long |
super |
char |
final |
notive |
synchronized |
class |
float |
package |
throws |
dconst |
goto |
private |
transient |
debugger |
implements |
protected |
volatile |
double |
import |
public |
3.1.3注释
ECMAScript由单行注释和块级注释,
//单行注释
/*
*这是一个多行
*注释
*
*/
HTML注释<!--注释-->
3.1.4严格模式
在脚本中启用严格模式可以在顶部添加如下代码: "use strict"
3.1.5语句
JS中语句一分号";"结尾,如果省略分号,则由解析器确定语句结尾(不推荐省略分号)
代码块使用花括号表示: { 代码块 }
3.2 变量
1.ECMPScript中的变量是松散类型的,即可以不先指定变量的类型。
使用var操作符定义变量,后跟变量名: var message; 该变量可以保存任何值(未初始化的变量是undefined)
注意: 使用var定义的变量是定义该变量的作用域的局部变量,如果在函数中定义了一个局部变量,这个变量在函数结束后就会销毁
function text(){
var message="hi";
}
test();
alert(message);//错误
当不使用var时会定义一个全局变量,但不推荐使用,容易引起混乱。
function text(){
message="hi";
}
test();
alert(message);//hi
2.可以使用一条语句定义多个变量,每个变量用逗号隔开:
var message="hi",found=false,
age=29;
3.3数据类型
ECMAScript有5种基本数据类型: Undefined,Null,Boolean,Number和String.还有一种复杂的数据类型: Object, Object本质上是由一组无序的名值对组成的,ECMAScript不支持任何创建自定义类型的机制.
typeof操作符
返回变量的数据类型。 typeof null会返回object,因为null被认为是一个空对象的引用。
Udefined类型:
Undefined类型只有一个值即undefined。使用var声明的变量没有初始化时其值就是undefined。对未初始化和未声明的变量执行typeof都会返回undefined。
Null类型:
Null类型也只有一个值:null。null值表示一个空对象指针。如果定义的变量准备在将来用于保存对象,最好将该变量初始化为null。
Boolean类型:
只有两个值true和false (区分大小写)。
ECMAScript中所有的类型的值都可以转换为其对应的Boolean值
数据类型 |
转换为true的值 |
转换为false的值 |
Boolean |
true |
false |
String |
任意非空字符串 |
" "空字符串 |
Number |
任何非零数字值(包括无穷大) |
0和NaN |
Object |
任何对象 |
null |
Undefined |
n/a(not applicable的缩写) |
undefined |
Number类型
使用IEEE745格式表示整数和浮点数值。有十进制,八进制(第一位必须是零,每位为0-7,如果超出这个范围前导零会被忽略,被当做十进制解析)和十六进制(前两位位是0x)。
算数计算时八进制和十六进制都将被转换成十进制。JS中数值可保存+0和-0,且认为相等。
浮点数值
- 该数值必须包含小数点,且小数点后必须有一位数字。
- 保存浮点数值需要的内存空间是保存整数数值的两倍。ECMAScript会适时的将浮点数值转换为整数数值。
- 可用科学计数法表示浮点数:3.123e5=3.123*100000.
- 浮点数值的最高精度是17位小数,但计算时精确度不如整数。
数值范围
ECMAScript能表示的最大值保存在Number.MAX_VALUR中,为1.7976931348623157e+308,最小值保存在Number.MIN_VALUR中,为5e-324.超出这个范围会被转换成InFinite或-InFinite。
可以使用 isFinite()函数来判断一个数值是不是有穷的。1
NaN
- NaN即非数值(Not a Number),用于表示一个本来要返回一个数值的操作数未返回数值的情况。任何数值除以非数值都会返回NaN。任何涉及NaN的操作都会返回NaN。
- NaN与任何值都不相等,包括NaN本身。
- isNaN();
数值转换
Number():转换规则:
Boolean: true-1,false-0; null: 0; undefined: NaN; 对字符串,则:
|
parseInt():可以有两个参数
|
|
String类型
字符串可以由双引号(” ”)或单引号表示(’ ’),但前后必须对应。
- 字符字面量(转义字符):
字面量 |
含义 |
\n |
换行 |
\t |
制表 |
\b |
退格 |
\r |
回车 |
\f |
进纸 |
\\ |
\ |
\’ |
‘ |
\” |
“ |
\xnn |
以十六进制数字nn表示的一个字符 |
\unnnn |
以十六进制代码nnnn表示的一个Unicode字符。如\u03a3表示字符Σ |
- ECMAScript中字符串不可变。要改变某个变量保存的字符串,首先要销毁原来的字符串。
- 转换为字符串:
toString()方法。数值、布尔值、对象和字符串(生成一个副本)都有toString()方法。但null和undefined没有该方法。在不知道值是否为null和undefined的情况下仍然可以使用该方法,如果值有toString( )方法,则返回相应的结果,如果值是null则返回null,如果值是undefined则返回undefined。
多数情况下toString()方法不需要参数,但也可以传递一个参数:指定输出数值的基数。
var num=10;
alert (num.toString()); //”10”
alert (num.toString(2)); //”1010”
alert (num.toString(8)); //”12”
alert (num.toString(10)); //”10”
alert (num.toString(16)); //”a”
Sting()函数,能将任何类型的值转换为字符串
如果值有toString()方法,则调用该方法(没有参数)并返回结果; 如果是null,则返回“null”; 如果是undefined,则返回“undefined”。
|
Object类型
ECMAScript中的对象是属性和方法的集合。对象可以通过new操作符后跟要创建的对象的名字来创建。如 var o=new Object();
Object 每个实例都有下列属性和方法:
constructor : 保存着用于创建当前对象的函数; hasOwnProperty: 用于检查给定的属性在当前对象中是否存在(不是在实例原型中)。属性名(propertyName)必须以字符串形式指定如:o.hasOwnProterty(“name”); isPrototyOf(object): 检查传入的对象是否是当前对象的原型。 propertyIsEunmerable(propertyName): 检查给的的属性是否可枚举(使用for-in); toLocalString(): 返回对象的字符串表示,该字符串与执行环境的地区对应? toString(): 返回对象的字符串表示; valueOf(): 返回对象的字符串、数组或布尔值表示。 |
3.4操作符
3.4.1 一元操作符
1.自增++,自减--
当自增与自减前置时会先加减1再进行后面的计算,当后置时会先进行后面的计算在加减1.
自增自减对任何值都适用。(++和—优先级比较低)
2. 一元+ 和-操作
前置时只改变正负。适用于任意值。会转换数值类型。
3.4.2 位操作符
ECMAScript所有数值都是以64位格式存储,但进行位操作时,现将64位的值转换成32位整数,然后执行操作,再将结果转回64位。
对于有符号的整数,32位中的31位用来表示大小,最高位(符号位)用来表示符号:0表示正,1表示负。
1、按位非(~)
该操作本质:操作数的负值减1;
2、按位与(&):同1则1,有0则0.
3、按位或(|):同0则0,有1则1.
4、按位异或(^)同则0,异则1.
5、左移(<<)所有位向左移指定位数右侧补0(×2的n次方),不会影响符号位。
6、有符号的右移(>>)(保留符号的右移)所有为右移指定位数,左侧补0(符号位不变)(÷2的n次方)。
7、无符号位右移(>>>)会将操作数的32位都向右移动,左侧补0。对正数与>>结果相同,对负数>>>结果将变成正直并且结果非常大(求负数的二级制码为绝对值的二进制码按位取反在加1)
3.4.3布尔操作符
1、逻辑非(!):可用于ECMAScript中的任何值,都会返回一个布尔值。使用Boolean()为true的,非后都会返回false。使用两个逻辑非操作(!!)可将一个值转换为对应的布尔值。
2、逻辑与(&&):可用于任何类型的操作数。两个值对应的Boolean值都为true则返回true,有一个false就返回false。该操作属于短路操作,即如果第一个操作数能决定结果,就不会再对第二个数求值。第一个值为false就会返回false。
3、逻辑或(||):与(&&)类似,两个值对应的Boolean值有一个true则返回true,都为false就返回false,该操作也属于短路操作,即如果第一个操作数能决定结果,就不会再对第二个数求值。
3.5.4乘性操作符
操作数非数值时后台会先使用Number()函数将其转换为数值, n表示有限的数值。
1、乘法(*):
n*NaN=NaN;
Infinity*n=Infinity;
Infinity*0=NaN;
2、除法(/):
n/NaN=NaN;
NaN/n=NaN;
n/0=NaN;
Infinity/n=()Infinity符号取决于n;
3、求模(%):返回余数
Infinity/n=NaN;
n/0=NaN;
Infiniyr/Infinity=NaN;
3.4.5加性操作符
1、加法(+)
n+NaN=NaN;
Infinity+Infinity=Infinity;
-Infinity+-Infinity=-Infinity;
-Infinity+Infinity=NaN;
+0++0=+0;
-0+-0=-0;
+0+-0=+0;
如果有一个操作数是字符串,则将另一个操作数也转换成字符串,然后将两个字符串拼接起来。如果两个都是字符串则拼接。
如果有一个操作数是对象、数值或布尔值,则调用toString()方法将他们转换成字符串再按照前面关于字符串的规则运算。
2、减法(-)
n-NaN=NaN;
Infinity-Infinity=NaN;
-Infinity--Infinity=NaN;
-Infinity-Infinity=-Infinity;
Infinity--Infinity=Infinity
+0-+0=+0;
-0-+0=-0;
-0--0=+0;
如果有一个数是字符串、布尔值、null或undefined则先调用Number()转换为数值后计算。如果有一个操作数是对象,则调用valueOf()方法取得该对象的数值后计算,如果对象没valueOf()方法则调用toString()方法转换成字符串再转换成数值后计算。
3.4.6关系操作符
小于(<)、大于(>)、≤、≥
如果两个操作数都是字符串则比较编码值。
如果有一个数是数字则将另一个也转换成数字就行比较;
如果有一个操作数是对象,则调用valueOf()方法取得该对象的数值后计算,如果对象没valueOf()方法则调用toString()方法转换成字符串后比较;
如果一个操作数是布尔值则将其转换为数值后比较。
3.4.7相等操作符
1、==和!=
两个操作数会先转换操作数然后比较;
如果一个操作数是布尔值则将其转换为数值后比较,true-1,false-0;
如果一个是字符串,另一个是数值,将字符串转换成数值在比较:“55”=55 (true)
如果一个操作数是对象,则调用valueOf()方法取得该对象的数值后比较。
null=undefined; null和undefined在比较是不能转换为其他值;
如果有一个操作数是NaN,==返回false !=返回true。NaN不等于NaN;
如果两个操作数都是对象且指向同一对象,则相等,否则不等。
2、全等和不全等 ===和!==
两个操作数不会转换,其他规则与==和!=相同。“55”===55(false).
3.4.8条件操作符
variable=boolean_expression?true_value:false_value;
例如 var max=num1>num2? num1:num2;
3.4.9 赋值操作符=
(+=、-=、*=、/=、%=、<<=、>>=、>>>=)
3.4.10 逗号操作符
使用逗号操作符可以在一条语句中执行多个操作。
3.5语句
- if 语句,推荐在if语句中使用块代码{}
- do-while语句,是后测试循环语句,会先执行一次循环体
- while语句,是前测试循环语句。
- for语句也是前测试循环语句,for(var i=1;i<count;i++){};
- for-in语句,是一种精准的迭代语句,可以用来枚举对象的属性。在使用for-in循环之前,先检测确认该对象的值不是null或undefined。
- lable语句
使用label语句在代码中添加标签,以便将来使用。
label: statement
start: for(var i=1;i<count;i++){alert(i);}加标签的语句一般都与for语句等循环语句配合使用。
- break和continue语句
break会立即跳出循环,执行循环后的语句。continue也会立即跳出循环,但退出循环后会在循环的顶部继续执行。
break和continue都可以与label语句联合使用,break label会跳出label标记的块,continue label 会跳出当前块并回到label标记的位置继续执行。
如:
var num=0;
outermost:
for( var i=0; i<10;i++){
for(var j=0;j<10;j++){
if(i==5&&j==5){
break outermost;
}
num++
}
}//num=55 在i=5, j=5时,break会强制语句跳出外循环。
var num=0;
outermost:
for( var i=0; i<10;i++){
for(var j=0;j<10;j++){
if(i==5&&j==5){
continue outermost;
}
num++
}
}//num=95 在i=5, j=5时,continue会强制语句跳出内循环,执行外循环。
- with语句
with语句的作用是将代码的作用域设置到一个特定的对象中。
with(expression) statement;
如:with(location){
var a=search.substring;
var b=hostname;
var c=href;
}
相当于:
var a=location.search.substring;
var b= location.hostname;
var c= location.href;
严格模式下不允许使用with语句。
编写大型代码时也不推荐使用with语句。
- switch语句
属于流控制语句,expression可以使任何数据类型。switch语句在比较时使用全等操作符,所以不会进行类型转换。
switch(expression){
case value: statement;
break;
case value: statement;
break;
……
case value: statement;
break;
default: statement;
}
执行value=expression的语句,如果省略break语句,则执行完当前case语句后会继续执行后面的case;
3.6函数
function functionName(arg0, arg1, arg2, arg3……){
statements
}
函数中有return语句时,会在执行完return语句后立即退出,return后的语句永远不会执行。函数可以不指定返回值,这种函数是一种特殊的undefined值。
严格模式下:不能把函数和参数命名为 eval或argument;
不能出现两个命名参数相同的情况。
3.6.1 参数
ECMAScritp可以传入任意类型和任意数量的参数。函数的参数在内部是用一个数组来表示的。函数可以通过arguments对象来访问这个数组。即可以通过arguments对象访问传入函数的参数。
例如
function sum() {
alert(arguments[0]+arguments[1]);
}
和
function anyHi(num1,num2){
alert(num1+num2);
} 是一样的。
还可以定义为
function anyHi(num1,num2){
alert(arguments[0]+arguments[1]);
}
argument[0]和num1 的内存空间是独立的但它们的值会同步。
function anyHi(num1,num2){
argument[1]=10; //会重写第二个参数,将第二个参数修改为10
alert(arguments[0]+arguments[1]);
}
可以在函数中调用arguments.length获知有多少个参数传给了函数。
严格模式下重写arguments的值会导致语法错误。
36.2 没有重载
重载即相同的函数名可以通过传入不同的参数类型和不同的参数个数来表示不同的函数
ECMAScript不能实现这一点,即不能重载。如果定义了同名的函数,则后面的函数会覆盖前面的。