posts - 10, comments - 24, trackbacks - 0, articles - 0

导航

公告

JS 杂七杂八细节——语句

Posted on 2009-04-26 21:26 LucasYang 阅读(...) 评论(...) 编辑 收藏

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'
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'
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
  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
  标签及break 的用法是不是挺眼熟的?其实就像C语言中的 goto 语句,但它们事实上完全不同。
4、function
  方法(function)是在JS代码被解析或编译时被声明定义的。
  当解析器遇到方法定义时,解析器对其进行解析并存储在一个以方法名命名的对象属性中。
  当这个方法是内嵌在其他方法中时,这个属性是 call 对象的属性(每个方法里都有一个call对象,
  而方法里的局部变量或内嵌方法均存储于此对象属性中),否则是全局对象的属性。
  方法和变量是在不同时间被解析定义的,方法是在解析的时候被定义的,而变量是在运行的时候被定义的。以下示例可说明此点:
        f(50);
        
var f = 10;
        alert(f);
        
function f(x) {
            alert(x);
        }
        
// result
        // 50
        // 10