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

Ana*_*nyi 2 javascript string null

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

document.getElementById("demo").innerHTML = typeof (document.getElementById("demo").innerHTML);
Run Code Online (Sandbox Code Playgroud)

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

document.getElementById("demo").innerHTML = null; //null will be converted to string first
Run Code Online (Sandbox Code Playgroud)

像这样:

document.getElementById("demo").innerHTML = String(null);
Run Code Online (Sandbox Code Playgroud)

在第一个示例中,HTML元素获取空值。但是第二个示例返回“字符串”。为什么?本教程http://www.w3schools.com/js/js_type_conversion.asp表示String(null)返回“ null”,但不返回空字符串。如我所见,这仅适用于第二个示例。

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

编辑:

现在我了解了一部分。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
Run Code Online (Sandbox Code Playgroud)

lar*_*iss 6

我的“答案”是一个评论,但似乎太长了,不能留下评论,更不用说它不容易阅读了。因为您说您正在学习JS,所以我认为这很有趣。我希望我不会得到太多反对票...

你写了:

document.getElementById("demo").innerHTML = String(null); //returns an empty string 
document.getElementById("demo").innerHTML = null.toString(); //returns "null" string
Run Code Online (Sandbox Code Playgroud)

但是,恐怕这两种说法都是错误的。

String(null)从不返回空字符串,而是返回string值为“ null” 的基本类型。

顺便说一句,该表格String(null) 应该永远不会被使用

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

null.toString()在我知道的每个JS引擎中都会引发一个错误:尽管事件null可能被视为一个对象(由于历史错误),但它没有属性,因此没有“方法” toString()(我引用“方法”是因为JS中没有方法,真)。

无论如何,为了保持一致,您可以使用以下命令:

document.getElementById("demo").innerHTML = whateverVariable || '';
Run Code Online (Sandbox Code Playgroud)

应该whateverVariable是falsy( ,nullundefined,,0 或),空字符串将被分配到。''NaNfalse''document.getElementById("demo").innerHTML


Ja͢*_*͢ck 4

我不认为这里有真正的约定;Element.innerHTML是一个测试给定值以确定要做什么的属性。在 Safari 中,它的行为如下:

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

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

也就是说,清除元素的记录方法是将空字符串分配给该属性。

更新

我发现了关于该主题的这个(不确定的)电子邮件线程,强调这种行为不是标准化的:

对于 .innerHTML = null Opera 和 Internet Explorer 的行为就好像使用了文字字符串“null”。Firefox 的行为就像使用了“”。