最安全遍历data-*属性的方式是array.from(element.attributes).filter(attr => attr.name.startswith('data-')),它兼容ie11、保留原始命名、无驼峰转换;而object.fromentries(array.from(element.dataset))仅适用于现代浏览器且要求属性名合规。

用 Array.from(element.attributes) 安全遍历所有 data-* 属性
直接遍历 element.dataset 会失败,因为它不是普通对象——for...in、Object.keys()、Object.entries() 全部返回空或报错。最兼容、最可控的方式是退到 element.attributes 这个原生集合,再过滤出 data-* 属性:
- 它在所有浏览器(包括 IE11)都可用,不依赖 dataset 规范支持
- 能拿到所有合法的
data-*属性,无论命名是否含数字、大写或下划线(比如data-1st-load或data-API-Key) - 返回的是原始属性名和值,无驼峰转换、无 trim、无静默丢弃
示例代码:
const el = document.querySelector('div');
const dataAttrs = Array.from(el.attributes)
.filter(attr => attr.name.startsWith('data-'))
.reduce((acc, attr) => {
acc[attr.name] = attr.value;
return acc;
}, {});
// 结果形如:{ 'data-user-id': '1001', 'data-api-endpoint': 'https://api.example.com' }
用 Object.fromEntries(Array.from(element.dataset)) 快速转成对象(现代环境)
Chrome 84+、Firefox 68+、Safari 14+ 支持将 element.dataset 直接转为标准对象,但必须用 Array.from() + Object.fromEntries() 组合,不能跳步:
-
Object.fromEntries(element.dataset)❌ 报错,因为dataset不是可迭代对象 -
Object.fromEntries(Array.from(element.dataset))✅ 正确,会把驼峰键名(如userId)和对应字符串值提取出来 - 注意:只包含符合命名规范的属性(全小写+连字符),
data-_id、data-2024-year等会被忽略
适用场景:你确认 HTML 中 data-* 全部合规,且只需读取简单配置类字段(如 data-role、data-index)。
为什么 for (let k in element.dataset) 大概率失效
这不是写法错误,而是语义错配:element.dataset 是 DOMStringMap,不是继承自 Object 的普通对象。它的原型链上没有 hasOwnProperty,也不暴露自身键名给 for...in。
- 在某些旧版 Safari 或 IE 中,
for...in可能遍历到空结果,或意外列出toString等方法 -
Object.keys(element.dataset)返回空数组,因为dataset没有ownKeystrap - 即使控制台打印
element.dataset看起来像对象,也不能按对象方式遍历
结论:只要看到 for...in dataset 或 Object.keys(dataset),就该立刻替换成 Array.from(attributes) 路径。
批量读取时别漏掉类型和空值判断
所有 data-* 值都是字符串,且空属性(如 <div data-flag></div>)返回空字符串 "",不是 null 或 undefined:
- 判断是否存在:用
'flag' in element.dataset或element.hasAttribute('data-flag'),而不是element.dataset.flag != null - 转数字:用
+element.dataset.count或Number(element.dataset.count),避免element.dataset.count + 1拼接成字符串 - 转布尔:约定用
element.dataset.enabled === 'true',别用!!element.dataset.enabled(空字符串也是 false,但data-flag无值时也应算 true) - JSON 字符串:必须用
JSON.parse(element.getAttribute('data-config')),且加try/catch,dataset.config可能因驼峰转换错位(如 HTML 是data-initial-state,JS 里是initialState,但服务端可能输出了data-initial_state)
真正容易被忽略的点:SSR 渲染后首次 JS 执行时,dataset 已就绪,但若元素是动态插入的,需确保 DOM 已解析完成再读取;而 getAttribute() 在任何时机都更稳定。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











