var t = new Date(), hsh = {}, arr = [], d;   
     var o = document.getElementsByTagName("*");这是个疑惑点,“*”?
     var m = o.length;
     while(--m)
      !(d=o[m].id) || !hsh[d] && (hsh[d]="*") || (arr[arr.length]=d);重要的是这一段,这里面用了什么语法?给详细解释一下

解决方案 »

  1.   

    var t = new Date(), hsh = {}, arr = [], d;   //声明变量
      var o = document.getElementsByTagName("*");//获取所有DOM对象
      var m = o.length;//获取DOM对象个数
      while(--m)//循环
      !(d=o[m].id) || !hsh[d] && (hsh[d]="*") || (arr[arr.length]=d);
    //当!(d=o[m].id)为假时计算下一表达式!hsh[d]
    //!(d=o[m].id) || !hsh[d]为真时计算下一表达式(hsh[d]="*")
    //!(d=o[m].id) || !hsh[d] && (hsh[d]="*")为假时计算(arr[arr.length]=d);
    //四个表达式都是赋值语句,真假为赋的值自动转化成布尔变量的值
      

  2.   

    var t = new Date(), hsh = {}, arr = [], d;  
      var o = document.getElementsByTagName("*");这是个疑惑点,“*”?
      //获得当前文档对象的所有节点元素
      var m = o.length;
      while(--m)
      !(d=o[m].id) || !hsh[d] && (hsh[d]="*") || (arr[arr.length]=d);重要的是这一段,这里面用了什么语法?给详细解释一下
    ------------------------
    alert(!eles);如果eles没有定义就是true,定义了就是false
    var a = 'aaa';
    alert(!undefined + "-" + !a);
    !(d=o[m].id) 
    o[m].id 是o数组对象的m索引处的id属性
    !hsh[d] 判断hah是否有d属性或是hsh[h]处的索引
    (hsh[d]="*") 赋值
    arr[arr.length]=d 将d赋给arr数组[最后处的索引] 
      

  3.   

    一楼的仁兄说的,当!(d=o[m].id)为假时计算下一表达式!hsh[d],这是怎么回事?||,&&不就是bool的计算比较吗?不明白。
      

  4.   

    顶一下,建议楼主一个一个alert出来就知道了
      

  5.   

    ||和&&是逻辑比较运算符.但JS会尝试"偷懒":
    逻辑比较运算符执行顺序都是从左到右.
    然而还有一个规则是当||时,左边的表达式为真的时候,整条表达式肯定为真.所以不用继续判断了.
    当&&时,左边的表达式为假时,整条表达式肯定为假.所以就不必做后面的操作了.
    所以这个写法一定程度上是将判断和赋值结合在一句话来执行.
    但这个写法是在项目上不建议的.因为他的可读性极差.
      

  6.   

    <script>
    (a=true)||(b=false)
    alert(a)
    alert(b)
    </script>
    你试试上面这段用FF调试.
    会看到错误控制台中显示b未定义的.
    也就是说但||表达式前面的a为真.
    JS就觉得没必要做后面的表达式判断了.
    所以B就未定义了.
      

  7.   

    仁兄,给解释一下 while(--m)
      !(d=o[m].id) || !hsh[d] && (hsh[d]="*") || (arr[arr.length]=d);
    alert("重复项为:" + arr.join(""))
    这段代码的含义吧?这是为了查找页面中是否有重复的ID,但我看不懂。