구성 x = x | y는 무엇을 의미합니까?
JavaScript를 디버깅하고 있는데 어떤 내용인지 설명할 수 없습니다.||
다음 작업을 수행합니다.
function (title, msg) {
var title = title || 'Error';
var msg = msg || 'Error on Request';
}
이 남자는 왜 이 약을var title = title || 'ERROR'
나는 가끔 그것이 없는 것을 본다.var
선언문도 작성했습니다.
즉,title
인수는 옵션입니다.따라서 인수를 지정하지 않고 메서드를 호출하면 기본값인"Error"
.
글을 쓰는 줄임말입니다.
if (!title) {
title = "Error";
}
부울식을 사용한 이러한 종류의 속기 트릭은 Perl에서도 흔히 볼 수 있습니다.다음과 같은 표현으로:
a OR b
평가하다true
어느 쪽이든a
또는b
이true
그래서 만약에a
확인할 필요가 없는 것은 사실입니다.b
조금도.이것은 단락 부울 평가라고 불리며, 따라서 다음과 같습니다.
var title = title || "Error";
기본적으로는 체크합니다.title
까지 평가하다.false
이 경우 "복귀"됩니다."Error"
그렇지 않으면 반환됩니다.title
.
이중 파이프 연산자란?||
)?
이중 파이프 연산자(||
)는 논리연산자입니다.대부분의 언어에서는 다음과 같이 동작합니다.
- 첫 번째 값이
false
두 번째 값을 확인합니다.그게 맞다면true
, 반환됩니다.true
두 번째 값이false
, 반환됩니다.false
. - 첫 번째 값이
true
, 항상 반환됩니다.true
두 번째 값이 무엇이든 상관없습니다.
기본적으로 다음과 같은 기능을 수행합니다.
function or(x, y) {
if (x) {
return true;
} else if (y) {
return true;
} else {
return false;
}
}
그래도 이해가 안 가는 경우 다음 표를 참조하십시오.
| true false
------+---------------
true | true true
false | true false
즉, 두 값이 모두 false일 때만 false가 됩니다.
JavaScript에서는 어떻게 다른가요?
JavaScript는 약간 다릅니다. 왜냐하면 그것은 느슨하게 타이핑된 언어이기 때문입니다.이 경우, 이것은 다음 명령을 사용할 수 있음을 의미합니다.||
부울이 아닌 값을 가진 연산자.의미가 없지만 함수 및 개체와 함께 이 연산자를 사용할 수 있습니다.
(function(){}) || {}
거기서 무슨 일이 벌어지나요?
값이 부울이 아닌 경우 JavaScript는 암묵적으로 부울로 변환합니다.즉, 값이 false일 경우(예:0
,""
,null
,undefined
('JavaScript의 모든 falsey 값'도 참조), 다음과 같이 처리됩니다.false
; 그 이외의 경우로 취급됩니다.true
.
따라서 위의 예는 다음과 같습니다.true
빈 함수는 truthy이기 때문입니다.글쎄, 그렇지 않아.빈 함수를 반환합니다.그 이유는 자바스크립트의||
처음에 쓴 것처럼 오퍼레이터가 작동하지 않습니다.다음과 같은 방법으로 동작합니다.
- 첫 번째 값이 falsey일 경우 두 번째 값이 반환됩니다.
- 첫 번째 값이 truthy일 경우 첫 번째 값이 반환됩니다.
놀랐어요?사실 기존 제품과 '호환성'||
, 다음과 쓸 수요.이것은 다음과 같은 함수로 작성될 수 있습니다.
function or(x, y) {
if (x) {
return x;
} else {
return y;
}
}
을 truthy로 x
됩니다.x
한 값, 진부한 값 진부한 값. 나중에 나나용 it if
§:
(function(x, y) {
var eitherXorY = x || y;
if (eitherXorY) {
console.log("Either x or y is truthy.");
} else {
console.log("Neither x nor y is truthy");
}
}(true/*, undefined*/));
에 넣다"Either x or y is truthy."
.
ifx
eitherXorY
y
「 」, 「 」, 「 」, 「 」가 됩니다."Either x or y is truthy."
y
진부하다. 그렇지 않으면"Neither x nor y is truthy"
.
실제 질문
요.||
동작하고 있기 에, 아마 알 수 입니다.아마도 당신은 무엇을 하는지 알 수 있을 것입니다.x = x || y
만약x
"truthy" 입니다.x
is is is is is 。x
도 일어나지 않습니다. 않으면 아무 일도 일어나지 않습니다.그렇지 않으면y
is is is is is 。x
함수에서 기본 파라미터를 정의할 때 일반적으로 사용됩니다.단, 잘못된 값을 전달할 수 없기 때문에 잘못된 프로그래밍 관행으로 간주되는 경우가 많습니다(반드시 그런 것은 아닙니다).undefined
또는null
)를 파라미터로 합니다.다음의 예를 검토해 주세요.
function badFunction(/* boolean */flagA) {
flagA = flagA || true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
그것은 언뜻 보기에 유효해 보인다.하지만, 만약 당신이 합격한다면 어떻게 될까요?false
~하듯이flagA
파라미터(부울형이기 때문에 다음과 같이 할 수 있음)true
또는false
?가 됩니다.이 예에서는, 다음과 같이 설정할 수 없습니다.flagA
로.false
.
확실히 체크하는 것이 좋을 것 같습니다.flagA
이undefined
다음과 같은 경우:
function goodFunction(/* boolean */flagA) {
flagA = typeof flagA !== "undefined" ? flagA : true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
더 길지만, 항상 효과가 있고 이해하기 쉬워요.
ES6 구문을 기본 함수 매개 변수로 사용할 수도 있지만 IE와 같은 이전 브라우저에서는 작동하지 않습니다.이러한 브라우저를 지원하려면 Babel로 코드를 변환해야 합니다.
MDN 의 논리 연산자도 참조해 주세요.
제목이 설정되지 않은 경우 기본값으로 'ERROR'를 사용합니다.
더 일반:
var foobar = foo || default;
foobar 설정 확인foo
또는default
. 여러 번 연결할 수도 있습니다.
var foobar = foo || bar || something || 42;
이걸 좀 더 설명하자면...
그||
연산자는 논리-or
교환입니다.결과는 첫 번째 부분이 참이면 참이고 두 번째 부분이 참이면 참이고 두 번째 부분이 모두 참이면 참입니다.알기 쉽게 하기 위해 다음 표에 기재되어 있습니다.
X | Y | X || Y
---+---+--------
F | F | F
---+---+--------
F | T | T
---+---+--------
T | F | T
---+---+--------
T | T | T
---+---+--------
이제 뭔가 눈치채셨나요?한다면X
결과는 항상 진실입니다.그래서 우리가 그걸 안다면X
우리가 확인할 필요가 없는 것은 사실이다.Y
조금도.따라서 많은 언어가 논리적으로 다음과 같은 "단락" 평가자를 구현한다.or
(논리적으로도)and
다른 방향에서 오고 있다).첫 번째 요소를 체크하고 그것이 사실이라면 두 번째 요소를 체크하지 않습니다.결과는 (논리적인 측면에서) 동일하지만, 두 번째 요소를 계산하는 데 비용이 많이 든다면 실행 측면에서 큰 차이가 있을 수 있습니다.
그럼 이게 예시와 무슨 상관이죠?
var title = title || 'Error';
한번 볼까요?그title
요소가 함수에 전달됩니다.JavaScript에서 매개 변수를 전달하지 않으면 기본적으로 null 값이 됩니다.또한 JavaScript에서는 변수가 null 값인 경우 논리 연산자에 의해 false로 간주됩니다.따라서 이 함수가 지정된 제목으로 호출되면 이는 거짓이 아닌 값이며 따라서 로컬 변수에 할당됩니다.단, 값이 지정되지 않은 경우에는 늘 값이기 때문에 false입니다.논리적인...or
연산자는 두 번째 식을 평가하고 대신 'Error'를 반환합니다.이제 로컬 변수에는 'Error' 값이 지정됩니다.
이는 JavaScript에서 논리식을 구현하기 때문에 작동합니다.올바른 부울 값이 반환되지 않습니다(true
또는false
) 대신 일부 규칙에 따라 주어진 값을 반환합니다.true
그리고 무엇이 동등하다고 생각되는가?false
JavaScript 참조를 검색하여 부울 컨텍스트에서 JavaScript가 참 또는 거짓으로 간주하는 내용을 확인합니다.
||는 부울 OR 연산자입니다.JavaScript와 마찬가지로 undefined, null, 0, false는 false 값으로 간주됩니다.
간단히 말하면
true || true = true
false || true = true
true || false = true
false || false = false
undefined || "value" = "value"
"value" || undefined = "value"
null || "value" = "value"
"value" || null = "value"
0 || "value" = "value"
"value" || 0 = "value"
false || "value" = "value"
"value" || false = "value"
의 값'이 '앞의 값'인지 합니다.||
true로 합니다.'의 '예'의 경우는 [예(Yes)]의 값을 합니다.||
.
다음 값 뒤에 있는 값을 취할 값||
(제 기억으로는)
- 정의되어 있지 않다
- 거짓의
- 0
- " (늘 또는 늘 문자열)
Cletus의 답변은 맞지만 JavaScript의 "Evaluate to false"에 대해 좀 더 자세히 추가해야 한다고 생각합니다.
var title = title || 'Error';
var msg = msg || 'Error on Request';
제목/메시지가 제공되었는지 여부뿐만 아니라 다음 중 하나라도 거짓인지 여부도 확인합니다.
- 거짓의.
- 0(제로)
- " (빈 문자열)
- 특수한 순서입니다.
- 정의되지 않았습니다.
- NaN(Not-a-Number!를 의미하는 특별한 숫자 값)
그래서 줄서서
var title = title || 'Error';
제목이 truthy(즉, 거짓이 아님, 제목 = "titleMessage" 등)인 경우, Boolean OR(||) 연산자는 true로 평가되는 'true' 값을 하나 찾았기 때문에 short-intering 후 True 값(예: true 값)을 반환합니다.
제목이 위 목록 중 하나일 경우 부울 OR(||) 연산자는 '거짓' 값을 찾았으므로 이제 연산자의 다른 부분인 '오류'를 평가해야 합니다. 이 값은 true로 평가되어 반환됩니다.
또한 (일부 빠른 Firebug 콘솔 실험 후) 연산자의 양쪽이 false로 평가되면 두 번째 'falsy' 연산자를 반환합니다.
예.
return ("" || undefined)
returns undefined(정의되지 않음)를 반환합니다.이것은, 실행 후에, 「」의 타이틀/메시지를 디폴트 하려고 할 때에, 이 질문에서 질문된 동작을 사용할 수 있도록 하기 위해서일 가능성이 있습니다.
var foo = undefined
foo = foo || ""
foo는 "로 설정됩니다.
이중 파이프는 논리적인 "OR"을 나타냅니다.이는 "파라미터가 설정되지 않음"의 경우에는 실제로 해당되지 않습니다. 이는 자바스크립트에서는 다음과 같은 코드가 있을 경우 엄격하게 적용되기 때문입니다.
function foo(par) {
}
그러면 콜을 합니다.
foo()
foo("")
foo(null)
foo(undefined)
foo(0)
동일하지 않습니다.
이중 파이프(||)는 첫 번째 인수를 부울에 캐스팅하고 결과 부울이 참이면 할당을 수행합니다. 그렇지 않으면 올바른 부품이 할당됩니다.
이 문제는 설정되지 않은 매개 변수를 확인하는 경우에 중요합니다.
예를 들어 옵션 파라미터가1개 있는 setSalary 함수가 있다고 합시다.사용자가 파라미터를 지정하지 않으면 기본값 10을 사용해야 합니다.
다음과 같이 체크할 경우:
function setSalary(dollars) {
salary = dollars || 10
}
이것에 의해, 다음과 같은 콜에 대해서 예기치 않은 결과가 됩니다.
setSalary(0)
위에서 설명한 흐름에 따라 10이 계속 설정됩니다.
이중 파이프 연산자
이 예는 도움이 될 수 있습니다.
var section = document.getElementById('special');
if(!section){
section = document.getElementById('main');
}
다음과 같은 경우도 있습니다.
var section = document.getElementById('special') || document.getElementById('main');
앞에서 말한 모든 것에 설명을 덧붙이자면 논리적 개념을 이해하기 위한 예를 몇 가지 들겠습니다.
var name = false || "Mohsen"; # name equals to Mohsen
var family = true || "Alizadeh" # family equals to true
즉, 왼쪽이 참문으로 평가되면 종료되고 왼쪽이 반환되어 변수에 할당됩니다.그 외의 경우 우측이 반환되어 할당됩니다.
그리고 오퍼레이터는 아래와 같은 정반대의 구조를 가지고 있습니다.
var name = false && "Mohsen" # name equals to false
var family = true && "Alizadeh" # family equals to Alizadeh
인용문: "구성 x = x | | y"는 무엇을 의미합니까?
기본값 할당
즉, x가 아직 값을 대기하고 있지만 아직 값을 수신하지 않았거나 기본값으로 되돌리기 위해 의도적으로 생략된 경우 y ~x 기본값을 제공합니다.
그리고 한 가지 더 덧붙여야 합니다.이 짧은 속기는 혐오스럽다.인터프리터 최적화를 잘못 사용하여(첫 번째 작업이 비정상인 경우 두 번째 작업이 필요하지 않음) 할당을 제어합니다.그 사용은 오퍼레이터의 목적과는 무관합니다.나는 그것이 사용되어야 한다고 믿지 않는다.
예를 들어 초기화에는 3진 연산자를 선호합니다.
var title = title?title:'Error';
이것은 올바른 목적을 위해 한 줄의 조건부 연산을 사용합니다.여전히 진실성을 가지고 보기 흉한 게임을 하지만, 그것은 당신을 위한 JavaScript입니다.
언급URL : https://stackoverflow.com/questions/2802055/what-does-the-construct-x-x-y-mean
'programing' 카테고리의 다른 글
datetime 값을 얻으려면 어떻게 해야 합니까?python에서 timezone을 인식하고 있습니까? (0) | 2022.09.19 |
---|---|
명령줄에서 MySQL 덤프를 다운로드하는 중 (0) | 2022.09.19 |
FFmpeg C API 매뉴얼/튜토리얼 (0) | 2022.09.19 |
'isPresent' 체크 없이 'Optional.get()'을 클릭합니다. (0) | 2022.09.19 |
Python MySQL이 새로 고쳐지지 않음 (0) | 2022.09.19 |