有关参数的问题。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        #box{
            color: red
        }
    </style>
    <script>
        window.onload=function(){
            var base=new Base();
            
            base.removeRule(0,0);  
            
            //base.removeRule(0);//为什么这里传一个参数也能正常执行函数?
        
            }
            
        function Base(){};
        Base.prototype.removeRule=function(num,index){
            var sheet=document.styleSheets[num];
                if(typeof sheet.deleteRule !='undefined'){//W3C
                    sheet.deleteRule(index);
                }else if(typeof sheet.removeRule!='undefined'){//IE
                    sheet.removeRule(index);
                }
            return this;
        }
    </script>
</head>
<body>
    <div id='box'>box</div>
</body>
</html>
阅读 2k
2 个回答

不传的话,执行的时候

sheet.deleteRule(undefined);

可以执行,但是没法删除

尝试了一下 sheet.deleteRule() 会报错 1 argument required, but only 0 present,也就是说,参数是一定要给的。

但是 sheet.deleteRule(void 0) 可以执行,而且可以删除,感觉很神奇的样子。

首先申明 void 0 的结果是 undefined,这个可以证明:

console.log(void 0, typeof void 0)
// undefined "undefined"

然后试试怎么处理 undefined 可以把它变成整数呢,如果 parseInt(void 0),得到的是 NaN;然后用一个常用的简洁的转换方式 ~~(void 0),这回得到了 0

所以猜测 deleteRule 的实现过程是这样的

CSSStyleSheet.prototype.deleteRule = function() {
    if (arguments.length < 1) {
        throw new Error("1 argument required, but only 0 present.");
    }

    // this.rules 是个伪数组
    [].splice.call(this.rules, ~~arguments[0], 1);
};
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题