Notación de punto y corchete

Estoy tratando de entender la diferencia entre la notación de punto y corchete. Mientras revisaba varios ejemplos aquí en SO y en algunos otros sitios, me encontré con estos dos ejemplos simples:

var obj = { "abc" : "hello" };
var x = "abc";
var y = obj[x];
console.log(y); //output - hello

var user = {
  name: "John Doe",
  age: 30
};
var key = prompt("Enter the property to modify","name or age");
var value = prompt("Enter new value for " + key);
user[key] = value;
alert("New " + key + ": " + user[key]);

El primer ejemplo devuelve y para ser indefinido si en la tercera línea reemplazo elobj[x] conobj.x. Por qué no"hello"

Pero en el segundo ejemplo la expresiónuser[key] simplemente se puede reemplazar conuser.key sin ningún comportamiento anómalo (al menos para mí). Ahora esto me confunde, ya que recientemente aprendí que si queremos acceder a las propiedades por nombre almacenado en una variable, usamos la notación de corchetes [].

Respuestas a la pregunta(2)

Su respuesta a la pregunta