You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何给DOM元素style属性赋值字符串后,获取到的却是对象?

为什么给DOM元素的style赋值字符串后,获取时得到的是对象?

嘿,这个问题问到点子上了——这可不是JavaScript的“BUG”,而是DOM API特意设计的行为,和普通JS对象的属性规则完全不一样~

核心原因:style是访问器属性(Getter/Setter),不是普通数据属性

普通的JavaScript对象属性,比如:

const obj = {};
obj.myProp = 'hello';
console.log(obj.myProp); // 输出 'hello'

这是因为myProp是个「数据属性」,赋值什么就直接存什么,读取时也直接返回存储的值。

但DOM元素的style属性是个「访问器属性」——它背后有一套浏览器内置的读写逻辑:

  • 当你赋值字符串时:触发的是style的setter函数。这个函数会把你传入的字符串解析成CSS规则,然后将这些样式应用到元素上,同时更新内部维护的CSSStyleDeclaration对象。
  • 当你读取style时:触发的是style的getter函数,它直接返回这个CSSStyleDeclaration对象,而不是你之前赋值的那个字符串。

为什么要这么设计?

浏览器这么做是为了给开发者提供更灵活的样式操作能力:

  • CSSStyleDeclaration对象允许你单独读写某一个样式属性,比如p.style.color = 'blue'、console.log(p.style.fontSize),比只能操作整段字符串方便太多。
  • 如果你确实想直接操作样式字符串,可以用style.cssText属性——这才是对应你赋值的那段字符串的属性:
    let p = document.getElementById('myp');
    p.style.cssText = 'color: red; font-size: 16px';
    console.log(p.style.cssText); // 输出 'color: red; font-size: 16px'
    

再补个验证小例子

你可以试试这段代码,就能清晰看到差异:

let p = document.getElementById('myp');
p.style = 'color: red; background: yellow';

// 读取style返回对象
console.log(typeof p.style); // 输出 'object'
console.log(p.style instanceof CSSStyleDeclaration); // 输出 true

// 可以通过对象操作单个样式
p.style.background = 'orange';
console.log(p.style.color); // 输出 'red'

// 用cssText获取完整的样式字符串
console.log(p.style.cssText); // 输出 'color: red; background: orange;'

内容的提问来源于stack exchange,提问作者Dave C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:33:51