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 = {};

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 :)


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

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.


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


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]

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.