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

6
我正在学习JavaScript,以下内容让我感到困惑:
document.getElementById("demo").innerHTML = typeof (document.getElementById("demo").innerHTML);

它将“字符串”分配给HTML元素。好的。所以我想当我尝试分配一些不同类型的值(而不是字符串)时,它将首先被转换为字符串:
document.getElementById("demo").innerHTML = null; //null will be converted to string first

像这样:

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

在第一个例子中,HTML元素的值为空。但是第二个例子返回了“string”。为什么?这个教程http://www.w3schools.com/js/js_type_conversion.asp说String(null)返回“null”,但并不是空字符串。我认为这只适用于第二个例子。
如何理解JavaScript这种令人困惑的转换行为?为什么第一个例子没有返回“string”?
编辑:现在我部分地理解了。 JS使用toString()而不是String()。对于null,toString()返回空字符串。因此,现在我的问题是:为什么toString()和String()产生不同的值?
编辑2: 例如:
document.getElementById("demo").innerHTML = String(null); //returns an empty string 
document.getElementById("demo").innerHTML = null.toString(); //returns "null" string

关于您的编辑,ToString() 也会产生 "null" - Ja͢ck
@Ja͢ck 但是在 Chrome 中 toString() 返回空字符串... - Anatolii Humennyi
你说的是哪个 toString() 方法? - Ja͢ck
1
在Safari中,当我尝试使用null.toString()时,会出现“TypeError: null is not an object”的错误提示...因此,这很可能是一些实现细节,不能依赖它。 - Ja͢ck
但是 [1,2,3,null,5].join(" ") --> '1 2 3 5' - Paul
显示剩余3条评论
2个回答

9

你写道:

document.getElementById("demo").innerHTML = String(null); //returns an empty string 
document.getElementById("demo").innerHTML = null.toString(); //returns "null" string
很遗憾,这两个断言都是错误的。 String(null) 从不返回空字符串,而是返回一个类型为 string 的原始值,其值为 "null"。
顺便说一下,表单 String(null) 永远不应该使用
另一方面,new String(null) 返回一个对象,它是 String(注意首字母大写)的实例,其原始值(内部属性 [[PrimitiveValue]])为 "null"
在我所知道的每个 JS 引擎中,null.toString() 都会引发错误:尽管由于历史 bug,null 可能被认为是一个对象,但它没有属性,因此没有 'method' toString()(我引用了 'method',因为实际上 JS 中没有方法)。
无论如何,为了保持一致,您可以使用以下内容:
document.getElementById("demo").innerHTML = whateverVariable || '';

如果whateverVariable为假值(nullundefined0-0''NaNfalse),则空字符串''将分配给document.getElementById("demo").innerHTML

4

我认为这里没有真正的约定;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的行为就像使用了空字符串。


谢谢你的回答!也许是真的。但我调查了一下,发现toString()和String()对于null返回不同的值。可能在给html赋值之前,JS使用toString(),因为它对于null返回空字符串。我更新了我的问题。谢谢。 - Anatolii Humennyi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接