2011-09-19 49 views
2

screenshot of google chrome developer tools showing that both objects have value这是如何评估为假?

当我逐句通过这段代码时,图中的数值会导致cssLoaded = 0;从我可以看到,长度大于0,并且cssStylesheet.sheet具有属性,所以应该为true,因此应将cssLoaded设置为1,但不会发生。我必须在这里失去一些东西..?

function _cssIsLoaded(cssStylesheet, stylePath) { 
var cssLoaded = 0; 
if (tryCount == 3){ 
    console.log('oops'); 
} 
if (cssStylesheet.href == stylePath){ 
    try { 
     if (cssStylesheet.sheet && cssStylesheet.sheet.cssRules.length > 0){ 
      cssLoaded = 1;} 
     else if (cssStylesheet.styleSheet && cssStylesheet.styleSheet.cssText.length > 0){ 
      cssLoaded = 1;} 
     else if (cssStylesheet.innerHTML && cssStylesheet.innerHTML.length > 0){ 
      cssLoaded = 1;} 
     } 
     catch(ex){ } 
} 
    if(cssLoaded) { 
     //alert('cssloadedcomplete'); 
     resetPops(); 
     $('#video-overlay').show(); 
     positionElements(); 
     saveBizzmail(); 
     console.log('try:' + tryCount) 
    } else { 
     tryCount+=1; 
     console.log('try:' + tryCount); 
     setTimeout(function() { this._cssIsLoaded(cssStylesheet); }, 2000); 
    } 
} 
+4

这样的条件:'if(cssStylesheet.href == stylePath){'pass? – jasonbar

+0

'cssStylesheet.sheet'评估的是什么? –

+0

@jasonbar哇..哟。就像一匹带着眼罩的马! :p做到了! – Damon

回答

2

有三种可能的方式获得你的代码cssLoaded == 0;

  1. if (cssStylesheet.href == stylePath)评估为false
  2. 全部三个if/else陈述评估为false
  3. 其中一个if/else语句抛出异常,因此其他if/else语句不会执行。

在对您的问题进行故障排除时,您应该验证前两个不是问题,因为这些可能只是比较中的逻辑错误,或者进入函数的数据并非您预期的那样。

对于第三个问题,您可以实施防御性编码以确保通过将代码更改为此来检查所有三个if/else语句(您甚至不需要try/catch,因为它允许您的代码绕过一些测试):

function _cssIsLoaded(cssStylesheet, stylePath) { 
    var cssLoaded = 0; 
    if (tryCount == 3){ 
     console.log('oops'); 
    } 
    if (cssStylesheet && cssStylesheet.href == stylePath) { 
     if (cssStylesheet.sheet && cssStylesheet.sheet.cssRules && cssStylesheet.sheet.cssRules.length > 0) { 
      cssLoaded = 1; 
     } 
     else if (cssStylesheet.styleSheet && cssStylesheet.styleSheet.cssText && cssStylesheet.styleSheet.cssText.length > 0) { 
      cssLoaded = 1; 
     } 
     else if (cssStylesheet.innerHTML && cssStylesheet.innerHTML.length > 0) { 
      cssLoaded = 1; 
     } 
    } 
    if(cssLoaded) { 
     //alert('cssloadedcomplete'); 
     resetPops(); 
     $('#video-overlay').show(); 
     positionElements(); 
     saveBizzmail(); 
     console.log('try:' + tryCount) 
    } else { 
     tryCount+=1; 
     console.log('try:' + tryCount); 
     setTimeout(function() { this._cssIsLoaded(cssStylesheet); }, 2000); 
    } 
} 
1

你必须检查该元素的存在,否则可能会出现错误(cssStylesheet.sheetundefined)。一个表达式会假时:

  • 变量不存在(undefinednullvoid 0
  • 的Equals 0(零)
  • 的Equals false
  • 的Equals空字符串(""''
  • A非数值(0/0,NaN

请注意,空对象{}的计算结果为true,因为它是一个对象。

又如:

if(window.addEventListener) window.addEventListener("load", function(){}, true); 
else if(window.attachEvent) window.attachEvent("onload", function(){}); 
else window.onload = function(); 

如果if条件不存在,则代码将抛出在旧版本的IE,其不具有这种称为window.addEventListener的方法的错误。

+0

有道理..但我的主要问题是,在上述情况下,为什么两者或两者都是'虚假'。那另外一个问题并没有真正相关,只是意识流。我把它编辑出来了。 – Damon

+0

If,* One *:“是否存在cssStylesheet.sheet?” If,* Two *:“cssStylesheet.sheet.cssRules'的长度属性是否大于0”?如果* One *和* Two *为真,则评估表达式。第一个表达式用于防止JavaScript错误,第二个表达式是特定的功能逻辑。 –

+1

+1添加到列表中:'NaN' :) – pimvdb

1

以前的检查确保您避免类似情况的NPE(通过检查cssStylesheet.sheet不为空)。