我正在学习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
答案 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
应该是假的(null
,undefined
,0
,''
,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就像使用“”一样。