null加null有时为0,有时为“nullnull”

时间:2014-04-09 11:04:08

标签: gwt

在编译模式下。

String s1 = null;
String s2 = null;
s2 = s1 + s2;
Window.alert("null + null = " + s2);

结果:

"null + null = nullnull"

但这段代码:

public String getValue(DocListsInfo object) {
    String s1 = object.getUrlForApplication();
    Window.alert("2: " + s1);
    String s2 = object.getEodLink();
    Window.alert("3: " + s2);
    String s3 = s1 + s2;
    Window.alert("4: " + s3);
    return s3;
}

=>
// compiled javascript:
function NUb(a){var b,c,d;b=a.q;$wnd.alert('2: '+b);c=a.g;$wnd.alert('3: '+c);d=b+c;$wnd.alert('4: '+d);return d}
如果两个getter都返回null,则

返回0。

1 个答案:

答案 0 :(得分:1)

我对GWT编译器内部工作原理的了解非常有限,但我想我可能知道发生了什么。

首先,两个片段之间的区别是什么?关于第一个的每个细节在编译时都是已知的(String都是null),而我们对第二个不太了解。

现在,Java中的null + null是什么? nullnull可以阅读here

然而,JavaScript中的null + null是什么?它是0,因为您只需在浏览器中进行测试即可。


现在我的想法如下:让我们从您的第二个代码段开始。它被编译为JavaScript,然后JavaScript将根据s1确定s2object的内容。然后它会尝试添加/连接它们,结果是0。嗯,没关系,因为这是你在使用JavaScript时所期望的(好吧,如果你只是了解Java,那就不那么了)。

第一个代码片段(这是我的猜测)似乎是通过编译器的前/后处理步骤进行优化的(因为我们已经知道它们都是null)。因此,JavaScript看到的所有内容(编译器产生的内容)都是常量。


也许其他人可以对我猜想的步骤有所了解。