selected 是布尔属性,仅对 有效,写上即默认选中,html 中声明最可靠;js 应优先设 select.value 而非 option.selected;defaultselected 只读,反映初始 html 状态。

selected 属性只对 <option></option> 元素生效,且必须是布尔属性——写上就代表“默认选中”,不写就不选中。它不会动态响应 JS 赋值(比如 option.selected = true 后 DOM 不会自动加 selected 属性),但会影响表单提交值和初始 UI 高亮。
HTML 中直接写 selected 是最稳妥的默认选中方式
浏览器在解析 HTML 时,遇到带 selected 的 <option></option> 就立刻高亮并设为初始值。这比 JS 操作更可靠,尤其在 SSR 或首屏渲染场景下。
- 只能在一个
<select></select>内部的<option></option>上用一次(多个selected时,仅第一个生效) - 不要写
selected="true"或selected="selected"—— 它是布尔属性,写selected就够了 - 示例:
<select name="city"><option value="bj">北京</option> <option value="sh" selected>上海</option> <option value="gz">广州</option></select>
JS 设置默认选中时,优先改 select.value,不是操作 option.selected
直接修改 <select>.value</select> 更简洁、兼容性更好,且能同步触发 change 事件(如果需要);手动设 option.selected = true 容易漏掉清除其他选项的 selected 状态。
-
select.value = "sh"会自动定位并高亮对应<option value="sh"></option>,无需遍历 - 如果选项
value是空字符串或重复值,select.value可能不按预期工作——此时才需手动操作option.selected - 注意:用 JS 设置后,DOM 中的
selected属性不会自动添加(这是正常行为,不影响功能)
selected 和 defaultSelected 的区别容易混淆
defaultSelected 是 JS 中的只读属性,反映的是 HTML 中是否写了 selected;它不会随用户选择变化,也不能用来设置默认值。
-
option.defaultSelected === true→ 表示该<option></option>在 HTML 中带有selected属性 -
option.selected是可读写的,表示当前是否被选中(受用户操作或 JS 影响) - 别用
option.defaultSelected = true来“设置”默认值——无效
真正要注意的是:服务端渲染或模板引擎(如 Jinja、EJS)里动态插入 selected 时,容易因条件判断漏掉空值或布尔转换错误,导致没加成功。建议统一用字符串模板拼接,而不是依赖数据字段的真假值做判断。











