一、空白
1. 空白可能表现为被格式化的字符或注释的形式。通常没有意义,但是有时用来分隔字符序列,否则就会合成为一个符号。例如,如下代码:
var that = this;
var 和 that之间的空格是不能移除的,但是其他字符可以移除。
2. 注释包括两种形式,一种是块注释/* */,一种是行注释//,注释用于提高代码的可读性,一定要精确描述代码。
3. 在JavaScript中,有些字符出现在正则表达式字面量中,所以块注释对于注释代码块来说是不安全的。例如:
/*
var rm_a = /a*/.match(s);
*/
上面注释导致了一个语法错误,所以避免使用/* */注释,用//注释代替他。
二、标识符
标识符不能使用var,for,return,void,infinity,try等关键字(具体参考《JavaScript权威指南》)。其中包含一些JavaScript中没有的保留字,不允许作为变量或参数。JavaScript也不允许使用保留字来作为对象的属性名进行点运算符提取对象属性。
//以下声明变量名均错误
var void;
var finally;
var try;
三、数字
1. JavaScript中只有数字类型,内部被表示为64位浮点数。1和1.0的值相等,避免了短整型的溢出问题。
2. 一个数字的字面量有指数部分,这个字面量的值等于e之前的数与e之后的数的次方和。例如:
var num1 = 1e2; //1 * 10^2 = 100
console.log(num1 === 100); //true
3. 负数可以用前置运算符-加数字构成。
4. NaN是一个数值,它表示一个不能产生正常结果的运算结果。NaN不等于任何值,包括他自己。
console.log(NaN === NaN); //false
console.log(isNaN(1)); //false
console.log(isNaN('a')); //true
console.log(isNaN('1')); //false
5. Infinity表示所有大于1.79769313486231570e+308的值。
四、字符串
1. 字符串字面量可以被包在一对单引号或双引号中,可能包含0个或多个字符。所有的字符都是16位。
var str1 = '字符串1'; //用单引号包括的字符串
var str2 = "字符串2"; //用双引号包括的字符串
2. JavaScript没有字符类型。
3. 转义字符\把正常情况下不被允许的字符插入到字符串中,如反斜线用\\,引号用\',控制字符\n。其中\u约定用于指定数字字符编码。
console.log('A' === '\u0041'); //true
4. 字符串有一个length属性,例如:
console.log('seven'.length); //5
5. 字符串是不可变的。但可以通过+运算符连接其他字符串创建一个新的字符串。两个字符串相同当且仅当有着完全相同的字符和字符顺序。所以:
console.log('c' + 'a' + 't' === 'cat'); //true
五、语句
1. <script>标签提供一个被编译且立即执行的编译单元。因为缺少链接器,JavaScript把他们一起抛到一个公共的全局名字空间中。
2. var 语句被用在函数内部时,它定义的是这个函数的私有变量。
3. switch、while、for和do语句允许有一个可选的前置标签,配合break语句使用。
loop1:
for (var i = 0; i < 3; i++) {
for (var j = 0; j < 3; j++) {
if (i == 1 && j == 1)
break loop1;
console.log('i = ' + i + ',j = ' + j);
}
}
/* i = 0, j = 0
i = 0, j = 1
i = 0, j = 2
i = 1, j = 0 */
4. 语句通常按照从上到下的顺序执行,JavaScript可以通过条件语句、循环语句、强制跳转语句和函数调用来改变执行顺序。
5. 代码块是包在一对花括号中的一组语句。JavaScript中的代码块不会创建新的作用域,因此变量应该被定义在函数的头部,而不是在代码块中。
6. if表达式为真时执行跟在其后的代码块,否则执行可选的else分支。
if (表达式) {
//表达式为真执行该代码块
}else{
//表达式为假执行该代码块
}
7. 以下值被当做假(false):false,null,undefined,空字符串‘ ’,数字0,数字NaN。其他所有的值被当做真,包括true,字符串‘false’以及所有的对象。
8. switch语句执行一个多路分支,把表达式的值和所有指定的case条件进行匹配。精确匹配时,执行匹配的case从句中的语句。如果没有找到任何匹配,执行可选的default语句。
9. 一个case从句包含一个或多个case表达式,case表达式不一定必须是常量,为了防止继续执行下一个case,case从句后应该跟随一个强制跳转语句,如break
switch (表达式) {
case '值1': case表达式; break;
case '值2': case表达式; break;
defualt: 代码块
}
10. while语句执行一个简单的循环,表达式为真执行代码块;表达式为假终止循环。
11. for语句包含:初始化从句、条件从句、增量从句。初始化从句的作用通常是初始化循环变量。如果条件从句别省略则返回条件为真;条件从句为假则终止循环;条件为真执代码块,执行增量从句,重复执行条件从句。
for (var i = 0; i < 3; i++) {
console.log(i); //0 1 2
}
12. for in 语句会枚举一个对象的所有属性名,每次循环中,object的下一个属性名字符串被赋值给variable。通常需要检测object.hasOwnProperty(variable)来确定这个属性名是该对象的成员还是来自原型链。
for (myvar in obj) {
if (obj.hasOwnProperty (myvar)) {
//代码块
}
}
13. do语句就像while语句,唯一的区别就是do语句的代码块至少要执行一次。
14. try语句执行一个代码块,并捕获该代码块抛出的任何异常。catch从句定义一个新的变量来接收抛出的异常对象。
15. throw语句抛出一个异常。如果throw语句在try代码块中,那么控制流会跳转到catch从句中。如果throw语句在函数中,则该函数调用被放弃,控制流跳到该函数的try语句的catch从句中。
try {
throw new Error('abc');
} catch (error) {
console.log('程序错误');
}
16. throw语句中的表达式通常是一个对象字面量,包含一个name属性和message属性。
17. return语句会导致从函数中提前返回,也可以指定返回值,如果没有指定返回值,默认为undefined。
function fun () {
console.log(1); //输出1
return; //跳出函数
console.log(2);
}
18. JavaScript不允许在return和表达式之间换行,也不允许在break和标签之间换行。
六、表达式
1. 最简单的表达式是字面量值(字符串和数字)、变量、内置的值(true、false、null、undefined、NaN和Infinity)、以new开头的调用表达式、以delete开头的属性提取表达式、包在圆括号中的表达式、以一个前置运算符作为前导的表达式。
2. 三元运算符? : 有3个运算数。如果第一个运算数为真,产生第二个运算数的值;如果第一个运算数的值为假,则产生第三个运算数的值。
console.log(true ? 1 : 2); //1
console.log(false ? 1 : 2); //2
3. 运算符优先级
4. typeof运算符产生的值有'number','string','boolean','undifined','function'和'object'。如果运算数是数组或null,那么结果是'object'。
console.log(typeof(1)); //number
console.log(typeof('好')); //tring
console.log(typeof(true)); //boolean
var a;
console.log(typeof(a)); //undifined
function fun() {};
console.log(typeof(fun)); //function
var Obj = {};
console.log(typeof(Obj)); //object
var arr = [1, 2, 3];
console.log(typeof(arr)); //object
console.log(null); //object
5. 如果!的运算数的值为真,那么产生false,否则产生true。
console.log(!true); //false
console.log(!false); //true
6. +运算符可以进行加法运算或字符串连接。如果想要加法运算,请确保两个运算数都是数字
console.log(1 + 2); //3
console.log('1' + '2'); //12
console.log(1 + '2'); //12
7. /运算符可能产生一个非整数结果,即使两个运算符都是整数
console.log(5/3); //1.6666666666666667
8. &&运算中,如果第一个运算数的值为假,那么就返回第一个运算数的值,否则返回第二个产生运算数的值。
console.log(1 && 2); //2
console.log(0 && 1); //0
9. ||运算中,如果第一个运算数的值为真,那么就返回第一个运算数的值,否则产生第二个运算数的值。
console.log(1 || 2); //1
console.log(0 || 1); //1