空の文字列 alt=”” と値のない alt は同じ意味か? 仕様書を見る

結論
同じ意味。
調べるに至った背景
Web フレームワーク Astro で画像に対して alt="" を指定すると、自動的に ="" の部分が除去されて、alt のみになる。これについて、「alt="" と意味が違うのではないのか?」という指摘を受けたので、調べてみることにした。
調べる前の予想
alt="" と alt は同じ意味を持つ。なぜなら、Chrome のデベロッパーツールでは、alt="" は省略されて alt と表示されるから。
仕様書を見る その 1
HTML Living Standard の仕様書を見てみよう。見るべきは「13. The HTML syntax」である。そして、属性への言及がされているのは「13.1.2.3 Attributes」である。ここでは、属性の設定方法についての方法を紹介していて、最初に「Empty attribute syntax」という構文、つまり空の属性についての構文が紹介されている。そして、
Just the attribute name. The value is implicitly the empty string.
とあるように、属性名だけを指定した構文は、暗然的に空の文字列を指すことになるとある。
つまり、属性名だけを記述すると、それは暗然的に空の文字列を指定したのと同じということになり、<attr>="" という指定と <attr> は等価であるということになる。
仕様書を見る その 2
続いて W3C の HTML Accessibility API Mappings 1.0 も見てみる。こちらはブラウザが HTML をアクセシビリティ的な観点からどのように解釈すべきかを定義する Working Draft (草案)である。
こちらでは、<img> 要素に対して 2 通りの解釈があり、それが「(ただの) 画像」と、「空文字列または値なしの alt 属性がある画像」の 2 つになる。前者は WAI-ARIA でいう img ロールになり、後者は none ロールになる。
つまり、空文字列と値なしの alt 属性が同じ解釈になるというのが、アクセシビリティ的な観点からもそうあるべきとなりつつある。
W3C と WHATWG での議論を見る
https://github.com/w3c/html/issues/1243
https://github.com/whatwg/html/issues/3502
GitHub で W3C と WHATWG のこの件に対する議論を確認できた。
The value, along with the “
=” character, can be omitted altogether if the value is the empty string.
そもそも Living Standard のもっと前の節「A quick introduction to HTML」でも解説済だった……。
まとめ
ということで、<img> 要素の alt="" と alt は同じ意味であることが分かった。まあ普通に HTML 書くなら alt="" なんだけど、alt で書いてもオッケー、ということで。