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);重要的是这一段,这里面用了什么语法?给详细解释一下
var o = document.getElementsByTagName("*");这是个疑惑点,“*”?
var m = o.length;
while(--m)
!(d=o[m].id) || !hsh[d] && (hsh[d]="*") || (arr[arr.length]=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);
//四个表达式都是赋值语句,真假为赋的值自动转化成布尔变量的值
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数组[最后处的索引]
逻辑比较运算符执行顺序都是从左到右.
然而还有一个规则是当||时,左边的表达式为真的时候,整条表达式肯定为真.所以不用继续判断了.
当&&时,左边的表达式为假时,整条表达式肯定为假.所以就不必做后面的操作了.
所以这个写法一定程度上是将判断和赋值结合在一句话来执行.
但这个写法是在项目上不建议的.因为他的可读性极差.
(a=true)||(b=false)
alert(a)
alert(b)
</script>
你试试上面这段用FF调试.
会看到错误控制台中显示b未定义的.
也就是说但||表达式前面的a为真.
JS就觉得没必要做后面的表达式判断了.
所以B就未定义了.
!(d=o[m].id) || !hsh[d] && (hsh[d]="*") || (arr[arr.length]=d);
alert("重复项为:" + arr.join(""))
这段代码的含义吧?这是为了查找页面中是否有重复的ID,但我看不懂。