Ruby's || = (o igual) en JavaScript?

128

Me encanta el ||=mecanismo de Ruby . Si una variable no existe o es nil, entonces créala y ponla igual a algo

amount # is nil
amount ||= 0 # is 0
amount ||= 5 # is 0

Necesito hacer algo similar en JavaScript ahora. ¿Cuál es la convención o la forma correcta de hacer esto? Sé ||=que no es una sintaxis válida. 2 formas obvias de manejarlo son:

window.myLib = window.myLib || {};

// or

if (!window.myLib)
  window.myLib = {};
a.
fuente

Respuestas:

152

Ambos son absolutamente correctos, pero si está buscando algo que funcione como ||=en ruby. El primer método que es variable = variable || {}el que estás buscando :)

Dzung Nguyen
fuente
xTenga cuidado al usar esto si un valor válido para es falso, como false, y solo desea establecer un valor predeterminado cuando xno está definido.
Joshua Pinter
22

Puede usar el operador lógico OR ||que evalúa su operando correcto si lVales un valor falso.

Los valores falsos incluyen, por ejemplo, null, false, 0, "", undefined, NaN

x = x || 1
Moritz Roessler
fuente
xTenga cuidado al usar esto si un valor válido para es falso, como false, y solo desea establecer un valor predeterminado cuando xno está definido.
Joshua Pinter
4

Si está trabajando con objetos, puede usar la desestructuración (desde ES6) así:

({ myLib: window.myLib = {} } = window);

... pero no obtienes nada sobre la respuesta aceptada, excepto confusión.

Indicio
fuente
1
"pero no obtienes nada sobre la respuesta aceptada, excepto confusión" - agradable. :)
lindes
Apuesto a que alguien tomará esto como una razón para odiar JavaScript
Volper
-1

Ruby || = asignación de cortocircuitos del operador. Se puede pensar así:

return a || a = b

Entonces, en JavaScript, esto se ve muy similar:

return a || (a = b);

Parece como se señala en los comentarios a continuación, sin embargo, que esta forma de rubí literal es menos eficiente que el lenguaje estándar de JavaScript a = a || si.

Para referencia: http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html

Chris
fuente
1
En la práctica parece que la a = a || bforma es más óptima jsperf.com/x-or-x-equals-0-vs-x-equals-x-or-0/3
jchook
Ah herramienta genial. ¿cómo se vería si x tiene un valor y, por lo tanto, cortocircuitos?
Chris
Creo que el desmontaje debe ser explícito en jsperf, por lo que esta prueba debe mostrar el rendimiento del cortocircuito. Supongo que V8 tiene una optimización especial para el formulario a = a || b.
jchook
3
FYI Parece que cualquier diferencia que haya habido ahora se ha optimizado.
Charles Wood
a || (a = b)tiene la semántica correcta para inferir nombres de funciones. Actualmente está en discusión para la nueva propuesta.
user4642212
-1

Puede lograr el comportamiento deseado utilizando el operador | = en javascript solo para enteros. Pero primero debe definir la variable.

let a = 0
a |= 100
console.log(a) // 100

Para objetos

let o = {}
o.a |= 100
console.log(o) // {a: 100}

Para matrices

let arr = []
arr[0] |= 100
console.log(arr) // [100]
Wallgeek
fuente
La pregunta no es sobre |o |=. El comportamiento deseado en la pregunta no está relacionado con las operaciones bit a bit.
user4642212
Tienes razón
editaré
Editado Espero que tenga sentido ahora.
wallgeek