考虑以下来自HTML文件的示例代码:
<div id="book"
data-id="47909"
data-title="Under The Dome"
data-author="Stephen King"
data-year="2009">
</div>
使用以下命令选择书籍元素:
book = document.querySelector("#book");
每当我将某个属性设置为 null
或 undefined
时,它都会分别将其设置为字符串"null"、"undefined":
book.dataset.author = null
typeof book.dataset.author
"string"
book.dataset.year = undefined
typeof book.dataset.year
"string"
而
let a = null;
typeof a
"object"
let b = undefined;
typeof b
"undefined"
有人可以解释一下为什么它的行为是这样的吗?这是否与最终所有内容都将转换为字符串这一事实有关,因为它是元素属性的性质?
谢谢!
数据集的规范
在获取时,数据集 IDL 属性必须返回一个 DOMStringMap,其 关联的元素就是这个元素。
并根据 DOMString 的价值规格
属性具有命名空间(null 或非空字符串(、命名空间 前缀(空或非空字符串(、本地名称(非空字符串(、 值(字符串(和元素(null 或元素(。
因此,该值在返回之前被强制转换为字符串
String(null); //"null"
String(undefined); //"undefined"
String(1); //"1"
来自文档
HTMLElement.dataset属性允许在读取和 写入模式,到上设置的所有自定义数据属性 (data-*( 元素,无论是在 HTML 中还是在 DOM 中。 这是一张 DOMString 的地图,一个 每个自定义数据属性的条目。
实质上,这意味着所有属性都强制转换为字符串。
String(null)
// 'null'
String(undefined)
// 'undefined'
点 - 1:在下面,你把值null
book.dataset.author = null
这意味着您所做的值是null
,但默认情况下,对于 HTML 数据类型为 String
的数据集,数据类型是String
的。
点 - 2:在下面的代码中
let a = null;
值是null
,但数据类型取决于 JavaScript 中的值,所以只要值默认为空,它就是一个Object