programing tip

할당 내 자바 스크립트 AND 연산자

itbloger 2020. 12. 15. 08:17
반응형

할당 내 자바 스크립트 AND 연산자


JavaScript에서 다음을 수행 할 수 있다는 것을 알고 있습니다.

var oneOrTheOther = someOtherVar || "these are not the droids you are looking for...";

여기서 변수 oneOrTheOther첫번째 식의 값에 걸릴 것이 아닌 경우 null, undefined또는 false. 어떤 경우에는 두 번째 문의 값에 할당됩니다.

그러나 oneOrTheOther논리 AND 연산자를 사용할 때 변수는 무엇에 할당됩니까?

var oneOrTheOther = someOtherVar && "some string";

someOtherVar거짓이 아닌 경우 어떻게 됩니까? 거짓
이면 어떻게 someOtherVar됩니까?

JavaScript를 배우는 중이고 AND 연산자와 함께 할당하면 어떤 일이 발생하는지 궁금합니다.


기본적으로 논리 AND 연산자 ( &&)는 첫 번째 피연산자가 진실 이면 두 번째 피연산자 의 값을 반환하고 , 그 자체가 거짓 이면 첫 번째 피연산자의 값을 반환합니다 . 예를 들면 다음과 같습니다.

true && "foo"; // "foo"
NaN && "anything"; // NaN
0 && "anything";   // 0

참고 것을 falsy 값은 그에게 강제 변환 점이다 false불리언 문맥에서 사용하는 경우는, 그들이 null, undefined, 0, NaN, 빈 문자열, 그리고 물론 false, 어떤 다른 강제 변환에를 true.


&&경비원 이라고도합니다 .

variable = indicator && value

지표가 진실 인 경우에만 값을 설정하는 데 사용할 수 있습니다.


Douglas Crockford 1 인용 :

&&제 피연산자 falsy 경우 작업자는 먼저 피연산자의 값을 생성한다. 그렇지 않으면 두 번째 피연산자의 값을 생성합니다.


1 Douglas Crockford : JavaScript : 좋은 부분 -페이지 16


초보자 예

"user.name"에 액세스하려고하는데 다음이 발생하는 경우 :

Uncaught TypeError: Cannot read property 'name' of undefined 

두려워하지 마십시오. 할당에서 && 연산자사용 하거나 정의되지 않은 오류가 발생하는 것을 "보호"하기 때문에 종종 가드 연산자 라고도이 문제를 해결할 수 있습니다 .

다음은 이상 할 수 있지만 나중에 설명하는대로 계속 읽으십시오.

var user = undefined;
var username = user && user.username;
// no error, "username" assigned value of "user" which is undefined

user = { username: 'Johnny' };
username = user && user.username;
// no error, "username" assigned 'Johnny'

user = { };
username = user && user.username;
// no error, "username" assigned value of "username" which is undefined

설명 : 가드 작전에서 각 항은 한 번에 하나씩 왼쪽에서 오른쪽으로 평가 됩니다 . 평가 된 값이 거짓이면 평가가 중지되고 해당 값이 할당됩니다. 마지막 항목에 도달하면 위조 여부에 관계없이 할당됩니다.

falsy 수단 이들 값 중 하나입니다 undefined, false, 0, null, NaN, ''truthy 하지 falsy 단지 의미합니다.

가드 방식의 간편한 버튼

lodash의 아름다운 가드 연산자를 사용하여 다음과 같이 중첩 된 데이터에 액세스합니다.

// need to access obj.has.some.very.nested.stuff
var val = _.get(obj, 'has.some.very.nested.stuff');

편리한 방법으로 사용하기 좋으면서 후드 아래의 && 물건을 처리하기 때문에. Lodash _.get 소스 코드

보너스 : OR 연산자

실제 사용되는 다른 유용한 이상한 할당 은 일반적으로 다음과 같은 플러그인에 사용되는 OR 연산자 입니다.

this.myWidget = this.myWidget || (function() {
   // define widget
})();

which will only assign the code portion if "this.myWidget" is falsy. This is handy because you can declare code anywhere and multiple times not caring if its been assigned or not previously, knowing it will only be assigned once since people using a plugin might accidentally declare your script tag src multiple times.

Explanation: Each value is evaluated from left-to-right, one at a time. If a value is truthy, it stops evaluation and assigns that value, otherwise, keeps going, if the last item is reached, it is assigned regardless if it is falsy or not.

Extra Credit: Combining && and || in an assignment

You now have ultimate power and can do very strange things such as this very odd example of using it in a palindrome.

function palindrome(s,i) {
 return (i >= s.length/2) || (s[i] === s[s.length -1 - i]) && palindrome(s, ++i);
}

In depth explanation here: Palindrome check in Javascript

Happy coding.


According to Annotated ECMAScript 5.1 section 11.11:

In case of the Logical OR operator(||),

expr1 || expr2 Returns expr1 if it can be converted to true; otherwise, returns expr2. Thus, when used with Boolean values, || returns true if either operand is true; if both are false, returns false.

In the given example,

var oneOrTheOther = someOtherVar || "these are not the droids you are looking for...move along";

The result would be the value of someOtherVar, if Boolean(someOtherVar) is true.(Please refer. Truthiness of an expression). If it is false the result would be "these are not the droids you are looking for...move along";

And In case of the Logical AND operator(&&),

Returns expr1 if it can be converted to false; otherwise, returns expr2. Thus, when used with Boolean values, && returns true if both operands are true; otherwise, returns false.

In the given example,

case 1: when Boolean(someOtherVar) is false: it returns the value of someOtherVar.

case 2: when Boolean(someOtherVar) is true: it returns "these are not the droids you are looking for...move along".


I have been seeing && overused here at work for assignment statements. The concern is twofold: 1) The 'indicator' check is sometimes a function with overhead that developers don't account for. 2) It is easy for devs to just see it as a safety check and not consider they are assigning false to their var. I like them to have a type-safe attitude, so I have them change this:

var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex();

to this:

var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex() || 0;

so they get an integer as expected.

ReferenceURL : https://stackoverflow.com/questions/3163407/javascript-and-operator-within-assignment

반응형