Estoy inspeccionando un código y encontré algo que me gustaría que ejecutaran los veteranos de Javascript. Me siento bastante cómodo con Javascript, pero siempre me las arreglo para encontrarme con algo que me hace decir: "¡No sabía eso sobre Javascript!".
Espero que esta sea una de esas situaciones:
if (this.props.referralId != prevProps.referralId || this.props.referralValidationStatus != prevProps.referralValidationStatus || this.props.customerName != prevProps.customerName && !!prevProps.personId != !this.props.personId) { // perform whatever logic is here... }Mis preguntas:
Estoy desconcertado sobre cuál debería ser la lógica aquí. Si tuviera que reescribir esto, lo haría así:
if ((this.props.referralId !== prevProps.referralId || this.props.referralValidationStatus !== prevProps.referralValidationStatus || this.props.customerName !== prevProps.customerName) && (!!prevProps.personId === !!this.props.personId)) { // Perform logic }Sin embargo, me gustaría confirmar y asegurarme de que no me estoy perdiendo algo que podría haberme perdido sobre JS.
Gracias de antemano por confirmar mi corazonada o educarme sobre algo nuevo cuando se trata de JS. Espero sus comentarios y/o respuestas.
Como la mayoría de los lenguajes, hay una regla de precedencia en Javascript. && se evalúan antes || como se puede ver aquí . Entonces, si necesita verificar todos los ors y luego usar el resultado final para hacer and , ¡tiene razón! Usa el paréntesis.
También tienes razón sobre el !! refactorización:
!!prevProps.personId != !this.props.personIdEs lo mismo que:
!!prevProps.personId === !!this.props.personId En otras palabras, está comprobando si tanto prevProps.personId como this.props.personId tienen algún valor (evaluado como True como booleano), o si ambos están vacíos/indefinidos/Nan (evaluado como False como booleano).
La primera declaración dice (pseudocódigo):
if ( //the first statement returns truthy this.props.referralId != prevProps.referralId || // or the second statement returns truthy this.props.referralValidationStatus != prevProps.referralValidationStatus || // or the combination of the third and fourth statements returns truthy this.props.customerName != prevProps.customerName && !!prevProps.personId != !this.props.personId ) // then... { // perform whatever logic is here }Su versión reescrita dice (pseudocódigo):
if ( // one of these three statements is truthy (this.props.referralId !== prevProps.referralId || this.props.referralValidationStatus !== prevProps.referralValidationStatus || this.props.customerName !== prevProps.customerName) && // AND! // this statement also evaluates truthy (!!prevProps.personId === !!this.props.personId) ) // then... { // perform whatever logic is here }Esperemos que esto explique las diferencias entre los bloques de código.
@rafaelodon es por lo demás correcto