Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What do you call the double pipe in javascript, as used in this context?

Tags:

javascript

People often write this in order to specify default values:

var thing = this || that;

which is, AFAIK, the same thing as this:

var thing = !!this ? this : that;

What do you call the technique used to specify defaults in the first code block?

NOTE: I am not asking what a logical OR is called. I am asking what the alternative to ternary notation (as written in the first code block) is called.

like image 680
Dany Joumaa Avatar asked Oct 02 '22 14:10

Dany Joumaa


2 Answers

I'd call:

var a = A || B;

conditional assignment, since it is effectively:

if (!!A) {
  a = A;
} else {
  a = B;
}

and it is a replacement for the conditional operator : ?

var a = A? A : B;

It might also be called "logical assignment" since it involves a logical OR expression, but it doesn't seem to fit with what it's doing.

like image 192
RobG Avatar answered Oct 05 '22 13:10

RobG


As mentioned elsewhere it is a logical OR.

The evaluation in question is a short-circuit evaluation.

It might help to look at it like this:

if ((foo = bar)) {

} else {
    foo = baz;
}

The if statement evaluates to the value of bar. If bar is false, null etc the evaluation would be false.


Edit: Note:

It is perfectly valid to evaluate an assignment. If we say:

if ((a = b)) { ...

note that it is not:

if (a === b) { ...

the evaluation is done on the result of the assignment. Here it would evaluate to true if (b).

One should however always wrap them in parenthesis. This makes it clear that we are evaluating the assignment and not comparing the variables.

If one do not like it that is fair enough, (I'm rather used to it from C), but in this case it is merely for the sake of the answer to the question.


In the same way we have:

if ((foo = foo)) {

} else {
     foo = baz;
}


var x = false;
console.log((x = x)); // False

As such we can say:

(x = x) || (x = y)

And to make it short:

x = (x || y);

or shorter:

x = x || y;
like image 25
user13500 Avatar answered Oct 05 '22 12:10

user13500