后面跟任意的表达式,JS两种语法有明显不同。匹配时会先计算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'
语法:for(variable in object)
其中 variable 允许任意的表达式,只要计算结果能作为赋值表达式的左侧,迭代对象属性名时并不保证任何特殊的迭代顺序,它也只迭代用户自定义的属性,而预定义的属性和方法是不会迭代的(比如:Math 的 cos 属性)数组本身是一种特殊的对象,当JS两种语法应用于数组时,迭代的是数组的索引。
- // 将对象 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'
当解析器遇到方法定义时,解析器对其进行解析并存储在一个以方法名命名的对象属性中。JS两种语法当这个方法是内嵌在其他方法中时,这个属性是 call 对象的属性(每个方法里都有一个call对象。
- 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:
而方法里的局部变量或内嵌方法均存储于此对象属性中),JS两种语法否则是全局对象的属性,方法和变量是在不同时间被解析定义的,方法是在解析的时候被定义的,而变量是在运行的时候被定义的。