【问题标题】:Why does JavaScript sometimes convert null to empty string and sometimes to "null" string?为什么 JavaScript 有时会将 null 转换为空字符串,有时会转换为“null”字符串?
【发布时间】:2014-11-17 10:56:40
【问题描述】:

我正在学习 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 元素获得了空值。但第二个示例返回“字符串”。为什么?本教程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

【问题讨论】:

  • 关于您的编辑,ToString() 也会产生 "null"
  • @Ja͢ck 但是 toString() 在 Chrome 中返回空字符串...
  • 那你说的是哪个toString()
  • 我在上面的“Edited 2”中添加了示例,说明了不同的行为

标签: javascript string null


【解决方案1】:

我认为这里没有真正的约定; 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 返回空字符串。我更新了我的问题。谢谢。
【解决方案2】:

你写道:

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

但恐怕这两个断言都是错误的。

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

顺便说一句,String(null)should never be used 的形式。

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

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

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

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

如果whateverVariable 是假的(nullundefined0-0''NaNfalse),空字符串@9876546542@ 将被分配给@983 @。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2020-06-20
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多