Encontré un elemento <input type="text" ... en una página, para el cual $('thatElement').val() y $('thatElement')[0].value devuelven el valor, el valor es se muestra en la salida renderizada, pero no hay ningún atributo value="..." en el elemento en sí.
¿Cómo puede no haber un atributo de valor en el HTML para un elemento de entrada, pero aún tiene un valor y aún muestra su valor?
Consola del navegador:
> $('thatElement')[0].value 'The text that the page shows inside of the input' > $('thatElement')[0].outerHTML '<input autocomplete="off" type="text" readonly spellcheck="false">'Hay una diferencia entre la fuente de un documento y su representación DOM. El archivo fuente es estático y no cambiará. El DOM podría cambiar. Creo que depende de cómo lo manipules.
En este ejemplo, el valor de entrada se establece pero el DOM no se actualiza: (ejecutar e inspeccionar el resultado)
document.querySelector('input').value = 42; <input />En este ejemplo, tanto la entrada como el DOM se actualizan:
document.querySelector('input').setAttribute('value', 'foobar'); <input />