Esta pregunta se aplica al lenguaje JavaScript en general, pero el contexto específico con el que encontré este problema fue mientras resolvía problemas de listas enlazadas en LeetCode. En 206. Lista enlazada inversa , puede usar la función Asignación de desestructuración de Javascript para evitar el uso de variables temporales mientras mezcla punteros entre el actual y el anterior, por ejemplo, esta es una solución aceptada donde la asignación de desestructuración cambia correctamente los punteros .next en un objeto vinculado individualmente :
/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ var reverseList = function(head) { let [prev, curr] = [null, head] while (curr != null) { [curr.next, curr, prev] = [prev, curr.next, curr] } return prev }Entonces, ¿por qué esta solución funciona para 141. Ciclo de lista enlazada ...
var hasCycle = function(head) { if (!head) return false let [slow, fast] = [head, head] while (fast) { if (!fast.next) return false slow = slow.next fast = fast.next.next // [slow, fast] = [slow.next, fast.next.next] if (slow == fast) return true } return false }; pero la solución casi idéntica, que intenta utilizar la asignación de desestructuración para simplemente ahorrar espacio, no actualiza el valor del puntero (lo que provoca falsos positivos ya que los valores iniciales que apuntan a la cabeza nunca cambian)? Además, el acto de iniciar sesión en la consola antes de usar la asignación de desestructuración cambia el comportamiento; en lugar del falso positivo, ahora el código arroja un error de tiempo de ejecución para TypeError: Cannot set property '#<ListNode>' of undefined
var hasCycle = function(head) { if (!head) return false let [slow, fast] = [head, head] while (fast) { if (!fast.next) return false // slow = slow.next // fast = fast.next.next console.log(slow.val, fast.val) [slow, fast] = [slow.next, fast.next.next] if (slow == fast) return true } return false }; La única diferencia entre el uso fallido en 141 y el uso exitoso en 206 es usar .next.next en lugar de simplemente .next , lo que me lleva a creer que la asignación de desestructuración está fallando por una razón relacionada con objetos o punteros anidados, pero No puedo encontrar una solución en StackOverflow o buscando en Google.
¿Por qué la línea anterior a la asignación de desestructuración de Javascript no inserta automáticamente un punto y coma usando ASI?
La inserción automática de punto y coma (ASI) no inserta un punto y coma al final de una línea de código cuando la combinación de la línea siguiente daría como resultado un código javascript "válido".
Más específicamente, los ejemplos comunes serían cuando la siguiente línea comienza con a ( o [ , que javascript puede interpretar como una llamada a una función o índice de una matriz, respectivamente.
Los ejemplos que ilustran cuándo es necesario insertar un punto y coma incluyen:
let a = 0 let b = a (0 == false) ? findTruth() : contemplate() // interpreted as // let a = a(0 == false) ...o, dentro del contexto del ejemplo,
let a = 0 let b = 1 [a, b] = [b, a] // interpreted as // let b = 1[a, b] = [b, a]Descubrí que esta referencia era ilustrativa sobre los tipos de casos extremos en los que ASI no insertará punto y coma: https://flaviocopes.com/javascript-automatic-semicolon-insertion/