1、switch
允许 case 后面跟任意的表达式,这和C、Java 等有明显不同。匹配时会先计算case后面的表达式再匹配。
匹配时用的是 === 符号,而不是 == 符号,所以匹配过程不允许任何类型转换。
default 放在最后只是逻辑上的需求,而它可以放在 switch 内的任何地方。
var x = 1;
switch (x + 1) {
case '2':
alert('string:2');
break;
default:
alert('default');
break;
case 1 + 1:
alert('number:2');
break;
}
// result:
// 'number:2'
switch (x + 1) {
case '2':
alert('string:2');
break;
default:
alert('default');
break;
case 1 + 1:
alert('number:2');
break;
}
// result:
// 'number:2'
2、 for/in
语法:for(variable in object)
其中 variable 允许任意的表达式,只要计算结果能作为赋值表达式的左侧。
迭代对象属性名时并不保证任何特殊的迭代顺序,
它也只迭代用户自定义的属性,而预定义的属性和方法是不会迭代的(比如:Math 的 cos 属性)。
数组本身是一种特殊的对象,当 for/in 应用于数组时,迭代的是数组的索引。
// 将对象 obj 的属性名复制到数组中
var obj =
{
x: 1,
y: new Date(),
z: function() { }
}
var arr = new Array();
var i = 0;
for (arr[i++] in obj);
alert(arr[0]);// 'x'
alert(arr[1]);// 'y'
alert(arr[2]);// 'z'
var obj =
{
x: 1,
y: new Date(),
z: function() { }
}
var arr = new Array();
var i = 0;
for (arr[i++] in obj);
alert(arr[0]);// 'x'
alert(arr[1]);// 'y'
alert(arr[2]);// 'z'
3、break and continue
break 和 continue 在语法上是相似的,这里只介绍break。
break 在 JS 中有两种语法:
1:break;
2:break labelname;
第一种用法是常见的,此时的 break 只能放在循环语句或switch语句中。
第二种用法比较特别,其中涉及到标签(Label)的用法,标签是用一个唯一标识符来标识一个语句,或一个语句块。
标签语法:identifier: statement;
相当于为一个简单语句或一个语句块命名。
break 的第二种用法主要应用在嵌套循环中,在内层循环中,第一种用法只能跳出内层循环,但利用第二种用法可以直接跳出外层循环。
注意:labelname是一个标识符,不能用单引号或双引号括起来。
var i = 0;
out:
while (true) {
while (true) {
break out;
}
i++;
}
alert(i); // 0
out:
while (true) {
while (true) {
break out;
}
i++;
}
alert(i); // 0
break 的第二种用法不要求一定要应用在循环或switch语句中。
continue 的用法类似,以下给出示例:
var i = 1;
single:
{
if (i == 1)
break single;
i++;
}
alert(i);
out:
while (i == 1 || i == 3) {
while (true) {
i++;
alert(i);
if (i == 2) {
continue;
}
else {
continue out;
}
}
i++;
alert(i);
}
alert(i);
// result:
// 1 2 3 4 4
single:
{
if (i == 1)
break single;
i++;
}
alert(i);
out:
while (i == 1 || i == 3) {
while (true) {
i++;
alert(i);
if (i == 2) {
continue;
}
else {
continue out;
}
}
i++;
alert(i);
}
alert(i);
// result:
// 1 2 3 4 4
标签及break 的用法是不是挺眼熟的?其实就像C语言中的 goto 语句,但它们事实上完全不同。
4、function
方法(function)是在JS代码被解析或编译时被声明定义的。
当解析器遇到方法定义时,解析器对其进行解析并存储在一个以方法名命名的对象属性中。
当这个方法是内嵌在其他方法中时,这个属性是 call 对象的属性(每个方法里都有一个call对象,
而方法里的局部变量或内嵌方法均存储于此对象属性中),否则是全局对象的属性。
方法和变量是在不同时间被解析定义的,方法是在解析的时候被定义的,而变量是在运行的时候被定义的。以下示例可说明此点:
f(50);
var f = 10;
alert(f);
function f(x) {
alert(x);
}
// result
// 50
// 10
var f = 10;
alert(f);
function f(x) {
alert(x);
}
// result
// 50
// 10