Javascript console.dir是否会对其使用的变量产生副作用';这叫什么?

Javascript console.dir是否会对其使用的变量产生副作用';这叫什么?,javascript,mochikit,Javascript,Mochikit,我在玩一些JavaScript代码,发现当我取出“console.dir”语句时,结果是不同的。在调用console.dir之后,某些属性似乎变得可见。例如,下面的代码将打印x1.\u rgbString的“未定义”,但将打印x2.\u rgbString的实际值 var x1 = MochiKit.Color.Color.fromHexString("#ad3f40"); console.log(x1._rgbString); var x2 = MochiKit.Color.Color.fr

我在玩一些JavaScript代码,发现当我取出“console.dir”语句时,结果是不同的。在调用console.dir之后,某些属性似乎变得可见。例如,下面的代码将打印x1.\u rgbString的“未定义”,但将打印x2.\u rgbString的实际值

var x1 = MochiKit.Color.Color.fromHexString("#ad3f40");
console.log(x1._rgbString);

var x2 = MochiKit.Color.Color.fromHexString("#ad3f40");
console.dir(x2);
console.log(x2._rgbString);
完整测试代码如下:

如果我在console.log(x1.\u rgbString)之前添加console.dir(x1),那么console.log(x1.\u rgbString)将开始打印一个值,而不是打印未定义的值

为什么在对象上调用console.dir会影响对象上字段的值?console.dir是否有副作用,或者我缺少了什么


*我知道下划线通常表示private,但我在记录这个值时,惊讶地发现它在没有第一次调用console.dir时显示为“undefined”

原因是console.dir(以及console.log)对传递给它的值调用
toString()
。这通常没有副作用,但Mochikit.Color.Color的toString()反过来调用
toRGBString()
。而toRGBString()将其结果缓存在
中。\u rgbString

toRGBString: function () {
    var c = this.rgb;
    var ccc = MochiKit.Color.clampColorComponent;
    var rval = this._rgbString;
    if (!rval) {
        var mid = (
            ccc(c.r, 255).toFixed(0)
            + "," + ccc(c.g, 255).toFixed(0)
            + "," + ccc(c.b, 255).toFixed(0)
        );
        if (c.a != 1) {
            rval = "rgba(" + mid + "," + c.a + ")";
        } else {
            rval = "rgb(" + mid + ")";
        }
        this._rgbString = rval; // <-- _rgbString is set
    }
    return rval;
},
toRGBString:函数(){
var c=this.rgb;
var ccc=MochiKit.Color.clampcolor组件;
var rval=此值。\u rgbString;
如果(!rval){
变量mid=(
ccc(c.r,255)。toFixed(0)
+“,”+ccc(c.g,255).toFixed(0)
+“,”+ccc(c.b,255)。固定(0)
);
如果(c.a!=1){
rval=“rgba”(“+mid+”,“+c.a+”);
}否则{
rval=“rgb(“+mid+”);
}

原因是console.dir(以及console.log)对传递给它的值调用
toString()
。这通常没有副作用,但是Mochikit.Color.Color的toString()依次调用
toRGBString()
。而toRGBString()则将其结果缓存在

toRGBString: function () {
    var c = this.rgb;
    var ccc = MochiKit.Color.clampColorComponent;
    var rval = this._rgbString;
    if (!rval) {
        var mid = (
            ccc(c.r, 255).toFixed(0)
            + "," + ccc(c.g, 255).toFixed(0)
            + "," + ccc(c.b, 255).toFixed(0)
        );
        if (c.a != 1) {
            rval = "rgba(" + mid + "," + c.a + ")";
        } else {
            rval = "rgb(" + mid + ")";
        }
        this._rgbString = rval; // <-- _rgbString is set
    }
    return rval;
},
toRGBString:函数(){
var c=this.rgb;
var ccc=MochiKit.Color.clampcolor组件;
var rval=此值。\u rgbString;
如果(!rval){
变量mid=(
ccc(c.r,255)。toFixed(0)
+“,”+ccc(c.g,255).toFixed(0)
+“,”+ccc(c.b,255)。固定(0)
);
如果(c.a!=1){
rval=“rgba”(“+mid+”,“+c.a+”);
}否则{
rval=“rgb(“+mid+”);
}

这个。_rgbString=rval;//刚刚尝试了这个,你是对的。谢谢你提供的信息!刚刚尝试了这个,你是对的。谢谢你提供的信息!