Every piece of state in OpenGL has a default and all of these defaults are documented in the specification.
you have specifically mentioned ES 3.0 and above, so I’ll cite from the ES 3.0.5 specification at https://www.khronos.org/registry/OpenGL/specs/es/3.0/es_spec_3.0.pdf
Section 2.8, Vertex Specification, states:
The initial values for all generic vertex attributes are (0.0, 0.0, 0.0, 1.0).
So unless you have otherwise specified a value for a vertex attribute, it will have a value of (0.0, 0.0, 0.0, 1.0).
Section 2.9, Vertex Arrays, states:
In the initial state, the boolean values are each false, the memory pointers are each NULL, the strides are each zero, the array types are each FLOAT, the integers representing values per element are each four, the normalized and pure integer flags are each false, and the divisors are each zero.
Table 6.2: Vertex Array Object State, lists the initial enable/disable state for each vertex attrib array false, and we can see that this value is FALSE for VERTEX_ATTRIB_ARRAY_ENABLED. It also states that the arrays are initially configured as though no buffer object were bound.
So to summarize:
[ul]
[li]All vertex attribute arrays are disabled.[/li][li]Each is initialized to the equivalent of glVertexAttribPointer (n, 4, GL_FLOAT, GL_FALSE, 0, NULL);[/li][li]Buffer object 0 is “bound” for the each.[/li][/ul]
What happens if you attempt to read from such an array? Because no buffer object is associated with the array it’s equivalent to reading from a client-side pointer, and because the pointer is initially NULL, you can expect similar behaviour to what happens if you attempt to dereference a NULL pointer in the general case - or at least you would, if the array weren’t initially disabled. I cannot find a reference in the spec to what actually happens, so we may assume that it’s undefined behaviour.