-ECMAScript语法
1. 标识符:变量、函数、属性的名字,一般用驼峰格式。字母、_或$开头,不能是关键字或者保留字。
2. 关键字:执行特定操作或者作为控制语句开头。如if、function。
3. 保留字:有可能作为关键字。
4. 变量:可以保存任何类型数据的一个占位符,用var 定义。但var定义的变量是作用域中的局部变量,在定义变量的函数退出后就会销毁。(严格模式下初始化未声明的变量会报错)
test = function() {
var message = "hahaha";
}
test();
alert(message);//浏览器报错为undefined
当省略var时变量为全局变量,就可以被访问到
test = function() {
message = "hahaha";
}
test();
alert(message);//弹出窗口"hahaha"
-数据类型
5种普通string、number、boolean、null、undefined,一种复杂object。用操作数 typeof 来检测数据类型,因为是操作数可以不加括号。
var message;
var age = 10;
var num = 1>2;
var name = "haha";
test = function() {};
alert(typeof message); //undefined
alert(typeof age); //number
alert(typeof num); //bollean
alert(typeof name); //string
alert(typeof null); //**object**
alert(typeof test); //function
1.undefined
var message = "hahaha";
var name;
alert(message); //输出"hahaha"
alert(name); //未初始化变量输出undefined
alert(age); //未定义变量浏览器抛出错误undefined
alert(typeof age); //输出undefined
未定义变量与未初始化变量执行typeof操作符时都返回undefined,为了区分最好给每个变量都定义。
2.null
当变量为对象时,在没有确定对象的值之前,先初始化为null,当对象值确定后就可以直接操作 if(car != null) {…}
undefined是null派生的,所以相等
alert(null == undefined); //true
3.boolean
两个面值:true和false,true不一定为1,false不一定为0。其他数据类型可以转换为布尔型,用 Boolean() 函数。
转换为true:true,任何对象,任何非零数值(包括无穷大),任何非空字符串;
转换为false:false、null、undefined、0或NaN、空字符串;
if(Number.MAX_VALUE){
alert("Value is true"); //Vlaue is true
}
4.number
var num = 080; //十进制
var num1 = 010; //0开头且数字都不大于7,八进制
var num2 = -0x10; //十六进制
var num3 = 0.10;
alert(num); //80
alert(num1); //8
alert(num2); //-16
alert(num3); //0.1
多余的0会被忽略,可以用科学计数法,其中e和后面的数字构成10的指数次幂。
var num4 = 1.23e6;
alert(num4);//1230000
var num5 = 1.23e-6
alert(num5); //0.00000123
ECMAScript可以保存的数值范围:Number.MIN_VALUE ~ Number.MAX _VALUE。
超出时为无穷 Infinity(Number.POSITIVE_INFINITY) 和 -Infinity(Number.NEGATIVE_INFINITY),用函数 isFinite() 判断是否在范围之内。
var num6 = 2*Number.MAX_VALUE;
alert(isFinite(num6)); //false
var num7 = Number.NEGATIVE_INFINITY;
alert(num7); //-Infinity
NaN(Not a Number),用来表示原本应返回数值的操作数未返回数值的情况。两个特点:任何涉及NaN的操作都返回NaN且NaN不等于任何数值包括它本身。isNaN()函数确定一个参数是否“不是数值”。
alert(NaN == NaN); //false
alert(isNaN(NaN)); //true
alert(isNaN(20)); //false
alert(isNaN("10")); //false,字符串可转换为数值
alert(isNaN(false)); //false,布尔值可转换为数值
alert(isNaN("pink")); //true,不可转换为数值
数值转换:将非数值转换为数值有3种方法Number(),parseInt(),parseFloat()。
var num1 = Number(true); //1
var num2 = Number(""); //0
var num3 = Number("006.0"); //6
var num4 = Number(null); //0
var num5 = Number("black"); //NaN
var num6 = Number(0x10); //16,全部转换为十进制
parseInt():将数值转换为整数,从第一个字符开始解析直到字符串末尾,遇到小数点和非数值字符则停止。当跳过空格后的第一个字符不为数值,返回NaN。可以指定转换进制数,parseInt(数值,进制数),将数值看成该进制数转换为十进制数。
var num1 = parseInt("h123"); //NaN
var num2 = parseInt(true); //NaN
var num3 = parseInt("123h"); //123
var num4 = parseInt("10",8); //8,八进制数“10”转换为十进制数8
parseFloat():从第一个字符开始解析直到字符串末尾,遇到无效的浮点数字符则停止。当跳过空格后的第一个字符不为数值,返回NaN。只解析十进制。
var num1 = parseFloat("0x10"); //0
var num2 = parseFloat(true); //NaN
var num4 = parseFloat("0.120"); //0.12
var num5 = parseFloat("0.2blue"); //0.2
5.string
所有字符串都可以用length属性获取长度,ECMAScript中字符串不可变,只能销毁原来的再用一个新的字符串填充变量。
var lang = "java";
lang = lang + "script"; //创建一个填充"javascript"的字符串,再销毁"java"和"script"
alert(lang.length); //10
将其他数据类型转换为string用 toString() 和String() 方法。由于 null 和 undefined 值没有toString()方法,所以使用String() 方法转换,其他类型两者都可以。不确定是哪种类型用String()。toString()中可加参数,转换为几进制数。
var message = null;
var num = 10;
alert(num.toString(8)); //"12"
alert(String(message)); //null
6.object
ECMAScript中的对象是一组数据和功能的集合,用new操作符加要创建的对象类型的名称来创建。其中object类型是该语言中所有对象的基础类型。创建Object类型的实例并为其添加属性和方法。
var o = new Object();
alert(typeof o); //object
Object实例的属性和方法:
- Constructor:保存创建当前对象的函数,上例中为Object();
- hasOwnProperty(propertyName):检查给定属性在当前对象实例中是否存在,propertyName必须为字符串形式,例如o.hasOwnProperty(“name”);
- isPrototypeOf(object):当前传入对象是否为另一对象的原型;
- propertyIsEnumerable(propertyName):检查给定属性是否能用for-in语句枚举,propertyName必须为字符串形式(enumerable [ɪˈnjuːm(ə)rəb(ə)l] 可数的);
- toLocaleString():返回对象的字符串表示,与执行环境的地区对应;
- toString():返回对象的字符串表示;
- valueOf():返回对象的字符串,数值,布尔值表示,通常与toString()返回值相同。
-操作符
操作数据值的操作符,包括算数操作符,关系操作符,位操作符和相等操作符。适用于布尔值、字符串、数字值、对象。
1.一元操作符:只能对一个值进行操作。
递增和递减操作符(++,- -):将操作的变量转换为数值变量,再进行加减。如果变量是对象,用valueOf()获取可供操作的值(结果为NaN时用toString()方法)后再进行加减。
var m = "haha";
var t = true;
var f = 0.20;
var o = {
valueOf: function() {
return -2;
}
}
t++;
alert(m++); //NaN
alert(t); //2
alert(--f); //-0.8
alert(o--); //-2
alert(o--); //-3
一元加和减操作符(+,-):对数值不会有影响,只是将非Number型转化为Number型,减操作符加上负号。
alert(+t); //2
alert(-o); //4
2.位操作符
求一个负数的二进制码:求绝对值的二进制码,求反码再加一,得到负数的二进制码。ECMAScript会隐藏这些过程,向我们展示负号加这个数绝对值的二进制码。
var num = -8;
alert(num.toString(2)); //-1000
-按位非(NOT):由“~”表示,结果为返回数值的反码,即操作数的负值减1
var num = 6;
alert(~num); //-7
-按位与(AND):“&”
-按位或(OR):“|”
-按位异或(XOR):“^”,相等为0,相反为1
-左移:“<<”,不会影响符号位
-有符号的右移:“>>”,不会影响符号位
-无符号的右移:“>>>”,正数不影响,负数增大
var result1 = 8 & 9;
var result2 = 8 | 9;
var result3 = 8 ^ 9;
var result4 = 8 << 1;
var result5 = 8 >> 2;
var result6 = -8 >>> 1;
alert(result1); //72
alert(result2); //9
alert(result3); //1
alert(result4); //16
alert(result5); //2
alert(result6); //2147483644
3.布尔操作符
-逻辑非:“!”,将操作数转换为布尔值再求反;“!!”,相当于Boolean()方法,求操作数的布尔值;
-逻辑与:“&&”,短路操作符,当第一个操作数决定了结果(false),就不对第二个操作数求值。当其中一个操作数为null、NaN、undefined返回他们本身。
alert(!NaN); //true
alert(!!""); //false
var t = false; //为true时报错undefinedVar未定义
var result = (t && undefinedVar);
alert(result); //false
-逻辑或:“||”,短路操作符,当第一个操作数决定了结果(true),就不对第二个操作数求值。当两个操作数都为null、NaN、undefined返回他们本身。
var t = true; //false则报错undefinedVar未定义
var result = (t || undefinedVar);
alert(result); //true
用来给变量赋值,避免出现null或undefined
var myObject = a || b; //默认将a的值赋给变量,当a不包含有效值,则将b赋给变量。
4.乘性操作符
乘法(*)、除法(/)、求模(%,余数)。当操作数是非数值时,后台用Number()方法将其转换为数值再操作。
var result1 = 0 * Infinity; //NaN
var result2 = -2 * Infinity; //-Infinity
var result3 = Infinity * -Infinity; //-Infinity
var result4 = 0 / 0; //NaN
var result5 = -7 / 0; //-Infinity
var result6 = Infinity / Infinity; //NaN
var result7 = Infinity / 8; //Infinity
var result8 = Infinity % -8; //NaN
var result9 = Infinity % Infinity; //NaN
var result10 = 2 % 0; //NaN
var result11 = 10 % Infinity; //10
var result12 = 0 % 10; //0
5.加性操作符
加法(+):当一个字符串与非字符串的数相加,将非字符串用 toString() 或 String()(操作数为null或undefined) 转换为字符串后相连。
var num = -Infinity + Infinity; //NaN
var s1 = 2;
var s2 = 3;
alert("2+3="+s1+s2); //2+3=23
alert("2+3="+(s1+s2)); //2+3=5
减法(-):将非数值通过 Number() 转换为数值后操作,如果是对象,则用 valueOf() 或 toString() 转换为可操作的数值或字符串。
var num = Infinity - Infinity; //NaN
var num1 = NaN - 1; //NaN
var num2 = "" - 2; //-2
6.关系操作符
(>,<,>=,<=)返回布尔值。两字符串根据字符编码值比较;当其中一个操作数为数值则另一个操作数也转换为数值;其中一个操作数为对象用 valueOf() 或 toString(),再比较;布尔值转换为数值比较。
var result = "Black" < "apple"; //true,大写字母的字符编码值小于小写字母
var result1 = "Black".toLowerCase() < "apple".toLowerCase(); //false,按字母表排序
var num = 3 > NaN; //false
var num1 = 3 <= NaN; //false ,NaN的任何操作都返回NaN
7.相等操作符
相等(==)不相等(!=):先转换再比较。一个操作数为字符串或布尔值先转换为数值再比较;一个操作数为对象用valueOf() 再转换为数值;两个操作数都是对象看它们是否指向同一个对象;null和undefined比较前不能转换为其他类型。
alert(NaN != NaN); //true
alert(null == undefined); //true
alert(true == "1"); //true
全等(===)不全等(!==):仅比较不转换。值相同且类型相同才全等
alert(null === undefined); //false
alert("55" != 55); //false
alert("55" !== 55); //true
8.条件操作符
variable = boolean_expression ? true_value : false_value;
9.赋值操作符
复合赋值(+=,-=,>=,<=,<<=,>>=,*=,/=,%=);
10.逗号操作符
var num = 1, num1 = 2, num2 = (1,2,3,4); //声明多个变量
alert(num2); //4,返回表达式中最后一项
-语句
用一个或多个关键字完成给定任务。如通知函数退出,指定重复执行命令的次数。
var i = 0;
do{
i += 2;
}while(i<0); //i=2
while(i<0) {
i += 2; //i=0
}
var count = 10;
var i; //循环中的变量可在外部声明
for(i=0 ; i<count ; i++) {
alert(i);
}
for(var i=0 ; i<count ; i++) {
alert(i);
}
alert(i); //10,循环中声明的变量可以在外部访问
for语句中的三个表达式都是可选的,当都省略就是一个无限循环,只有控制表达式时是一个while循环。
for(;;){
alert("haha"); //不断弹出“haha”
}
var count = 10;
var i = 0;
for(; i<count ;) {
alert(i); //弹出0~9
i++;
}
for-in:精准的迭代语句,枚举对象的属性,声明变量可在循坏外部。
for(var propName in window) {
document.write(propName);
}
label语句:在代码中添加标签,语法 label:statement;可用break或continue引用;一般与for等循环语句配合。
start: for(var i=0 ; i<2; i++) {
alert(i);
}
continue退出后从循环顶部继续执行;break立即退出循环
var num = 0, i, j;
outermost:
for(i=0 ; i<7; i++) {
for(j=0; j<8; j++) {
if(i==5 && j==6) {
break outermost;
//continue outermost; 输出7*8-(8-6)=54
}
num++;
}
}
alert(num); //5*8+6=46
with语句:把代码的作用域设置到同一对象上。with (expression) statement; 在严格模式下不允许使用,开发中不建议使用。
var qs = location.search.substring(1);
var url = location.href;
//相当于:
with(location) {
var qs = serch.substring(1);
var url = href;
}
switch:判断switch中的值与哪一个case中的值全等(仅比较不转换);每一个case表达式中都加break,如果需要合并几个case,需要注释说明。switch中可以使用任意数据类型,case的值也可以是表达式或者变量
var num = 1;
switch (true) {
case num < 0:
alert("num < 0");
break;
case num > 0 && num < 2:
//合并两种情况
case num == 0 && num == 2:
alert("0 <= num <= 2 "); //输出 0 <= num <= 2
break;
default:
alert("num > 2")
}
}
-函数
由关键字function声明,function functionName (arg0,arg1,…,argN) {statements},在任何时候都可以用return实现返回值,return后直接退出函数,return后的语句永远不会被执行。若return;返回undefined,用于提前结束函数不返回值的情况。
function diff(num1,num2) {
if(num1 > num2) {
return num1 - num2;
}else{
return num2 - num1;
}
alert(num1); //永远不会执行
}
var result = diff(2,6); //调用函数
alert(result); //输出4
严格模式下,不能将参数或函数命名为eval或arguments,函数中不能有两个同名参数。
函数的参数可以是任意个任意类型,都保存在arguments对象中,类似一个参数数组,通过方括号语法访问每一个参数,length属性确定数组长度。
function functionName(num1,num2) {
if(arguments.length == 1) {
alert(arguments[0]);
}else if(arguments.length == 2) {
alert(num1 + arguments[1]);
}else{
alert(arguments.length);
}
}
functionName(true); //true
functionName(666,",haha"); //666,haha
functionName(1,2,3); //3
没有传入参数的值自动赋为undefined,(在非严格模式下设置arguments[ ]的值会相应改变命名参数的值,改变命名参数的值不会改变arguments[ ];而严格模式下改变argument的值会报错。???)
不能实现重载(为同一函数编写两个定义,只要两个定义的签名即传入参数的类型和数量不同即可)。ECMAScript中只能是后面的函数覆盖前面的函数。
function addOne(num) {
alert(num + 100);
}
function addOne(num) {
alert(num + 200);
}
addOne(100); //300