name属性必须与document.forms索引名完全一致:仅当form的name是合法javascript标识符(如login、userlogin)时,才可用document.forms.name访问;含连字符(user-form)或数字开头(1form)则必须用document.forms["name"]或索引访问,且严格区分大小写。

name属性必须与document.forms索引名完全一致
只有当 form 标签显式设置了 name 属性,且该值是合法的 JavaScript 标识符(不能以数字开头、不能含空格或特殊符号),才能用 document.forms.name 直接访问。比如 <form name="login"></form> → 可写 document.forms.login;但 <form name="user-form"></form> 就不行,因为连字符不是合法标识符,会报 ReferenceError。
常见错误现象:document.forms.myForm 报错 “Cannot read property 'xxx' of undefined”,八成是 HTML 里写成了 name="my-form" 或 name="1form",或者压根没写 name。
- 推荐做法:只用字母、数字、下划线、美元符,且首字符不为数字,例如
name="userLogin"、name="order_form" - 若 name 含非法字符,只能退而求其次用
document.forms["user-form"]或document.forms[0] - 大小写敏感:HTML 中
name="Login"和 JS 中document.forms.login不匹配
document.forms 是命名集合,不是普通对象
document.forms 返回的是一个 HTMLCollection,它同时支持按索引、按 name 字符串、甚至按 name 作为属性名三种方式访问——但后两者依赖 name 值是否可作属性名。这和数组不同,它没有 forEach,也不响应 length 的动态变化(它是实时集合)。
使用场景:你想快速获取某个表单,又不确定它在页面中的位置,用 name 索引最稳;但若要遍历所有表单,得用 for (let i = 0; i ,不能用 <code>for...of(老版本 IE 不支持)。
-
document.forms["search"]和document.forms.search效果一样,但前者更安全,兼容所有 name 值 -
document.forms.item(0)等价于document.forms[0],但前者语义更明确 - 不要对
document.forms做Array.from()或扩展运算符操作,IE 不认
name缺失时,document.forms仍存在,但无法按名访问
哪怕没写 name,<form></form> 依然会进入 document.forms 集合,只是它只能靠索引([0]、[1]…)或 getElementsByName(注意:这个 API 返回的是 NodeList,且只查 name 属性,对 form 本身无效)访问。很多人误以为“没 name 就进不了 forms”,其实不是——它进了,只是“叫不出名字”。
容易踩的坑:调试时用 console.log(document.forms) 看到长度是 2,却死活 document.forms.main 报 undefined,回头一看 HTML 里那个 form 根本没写 name 属性。
- 检查手段:打开 DevTools 控制台,执行
[...document.forms].map(f => f.name),一眼看出哪些 form 缺 name - DOM 加载顺序无关:即使
form在 JS 执行之后才插入,只要它在文档中,就会被纳入document.forms - name 为空字符串(
name="")等价于未设置,不会出现在document.forms[""]中
name与id混用导致的隐性冲突
name 和 id 语义完全不同,但浏览器在全局作用域里会把 form 的 name 自动挂到 window 上(如 <form name="cart"></form> → window.cart 可访问),如果恰好有个 <div id="cart">,就可能覆盖或干扰变量引用,尤其在旧版 IE 中更明显。
<p>这不是规范行为,而是历史遗留的“便利特性”,现代标准不鼓励这种写法,但现实项目里仍常见。</p>
<ul>
<li>避免全局污染:不要依赖 <code>window.formName,一律用 document.forms.formName
cart.submit() 看似简洁,实则脆弱no-restricted-globals 可捕获这类隐式全局变量使用document.forms 就能稳定工作;一旦其中任一环松动,调试时就得花时间来回比对 HTML 和 JS 的字符串是否真的一模一样。











