为什么JavaScript有时会将null转换为空字符串,有时会转换为“null”字符串?

时间:2014-11-17 10:56:40

标签: javascript string null

我正在学习JavaScript,我对以下内容感到困惑:

document.getElementById("demo").innerHTML = typeof (document.getElementById("demo").innerHTML);

它将“string”分配给HTML元素。好。那么我想当我尝试分配一些不同类型的值(不是字符串)时,它将首先转换为字符串:

document.getElementById("demo").innerHTML = null; //null will be converted to string first
像这样:

document.getElementById("demo").innerHTML = String(null);

HTML元素在第一个示例中获取为空值。但第二个例子返回“字符串”。为什么?本教程http://www.w3schools.com/js/js_type_conversion.asp表示String(null)返回“null”,但不返回空字符串。我认为只有第二个例子才是真的。

如何理解JavaScript的这种令人困惑的转换行为?为什么第一个例子不返回“string”?

编辑:

现在部分我明白了。 JS使用toString()但不使用String()。并且toString()返回null的空字符串。 现在我的问题是:为什么toString()String()会产生不同的值?

已编辑2:

示例:

document.getElementById("demo").innerHTML = String(null); //returns an empty string 
document.getElementById("demo").innerHTML = null.toString(); //returns "null" string

2 个答案:

答案 0 :(得分:5)

我的答案'是一个评论,但似乎太长,不能留下评论,更不用说它不容易阅读。既然你说你正在学习JS,我认为这会很有趣。我希望我不会得到太多的downvotes ......

您写道:

document.getElementById("demo").innerHTML = String(null); //returns an empty string 
document.getElementById("demo").innerHTML = null.toString(); //returns "null" string

但我担心这两个断言都是假的。

String(null)永远不会返回空字符串,而是返回string类型的基元,其值为" null"。

BTW,表格String(null) should never be used

另一方面,

new String(null)返回一个对象,String的实例(注意大写的第一个字母),其原始值([[PrimitiveValue]]内部属性)为"null"

null.toString()在我知道的每个JS引擎中引发错误:虽然事件null可能被视为对象(由于历史错误),但它没有属性,因此没有'方法& #39; toString()(我引用了'方法'因为JS中没有方法,真的)。

无论如何,为了保持一致,你可以使用它:

document.getElementById("demo").innerHTML = whateverVariable || '';

whateverVariable应该是假的(nullundefined0''NaN还是false),字符串''将分配给document.getElementById("demo").innerHTML

答案 1 :(得分:2)

我认为这里没有真正的惯例; Element.innerHTML是一个测试给定值以确定要执行的操作的属性。在Safari中它的行为如下:

if (value === null || value === '') {
    // remove all contents
} else {
    // parse string representation of value into the elements contents
}

因此""(空字符串)和null被认为是相同的,并且赋值将删除所有内容;我找不到可以建议其他浏览器以这种方式工作的确凿证据,但很可能它应该被视为一个你不应该依赖的实现细节(参见更新)。

也就是说,清除元素的文档方法是将空字符串赋给此属性。

更新

我发现这个(不确定的)email thread关于这个主题,强调这种行为没有标准化:

  

对于.innerHTML = null Opera和Internet Explorer就像文字一样   使用字符串“null”。 Firefox就像使用“”一样。