이 코드 조각이 있습니다 ( 이 질문 에서 가져 왔습니다 ).
var walk = function(dir, done) {
var results = [];
fs.readdir(dir, function(err, list) {
if (err)
return done(err);
var pending = list.length;
if (!pending)
return done(null, results);
list.forEach(function(file) {
file = path.resolve(dir, file);
fs.stat(file, function(err, stat) {
if (stat && stat.isDirectory()) {
walk(file, function(err, res) {
results = results.concat(res);
if (!--pending)
done(null, results);
});
} else {
results.push(file);
if (!--pending)
done(null, results);
}
});
});
});
};
나는 그것을 따르려고 노력하고 있으며, 나는 그것이 끝나는 끝을 제외하고는 모든 것을 이해한다고 생각합니다 !--pending
. 이러한 맥락에서 그 명령은 무엇을 하는가?
편집 : 추가 의견을 보내 주셔서 감사하지만 질문에 여러 번 대답했습니다. 어쨌든 고마워!
답변
!
값을 반전시키고 반대의 부울 값을 제공합니다.
!true == false
!false == true
!1 == false
!0 == true
--[value]
숫자에서 1을 빼고 작업 할 수를 반환합니다.
var a = 1, b = 2;
--a == 0
--b == 1
따라서 !--pending
보류 중 하나를 뺀 다음 진실 / 거짓 값의 반대 값을 반환합니다 (여부에 관계없이 0
).
pending = 2; !--pending == false
pending = 1; !--pending == true
pending = 0; !--pending == false
네, ProTip을 따르십시오. 이것은 다른 프로그래밍 언어의 일반적인 관용어 일 수 있지만 대부분의 선언적 JavaScript 프로그래밍의 경우 꽤 외계인처럼 보입니다.
답변
그것은 특별한 연산자가 아니며, 두 개의 표준 연산자입니다.
- 접두사 감소 (
--
) - 논리적이지 않은 (
!
)
이로 인해 pending
감소한 다음 0인지 확인하기 위해 테스트됩니다.
답변
답변의 숫자는 설명 어떤 이 명령하지,하지만 왜 그것을 여기에서 그런 식으로 이루어집니다.
나는 C 세계에서 왔으며, 실제로 생각하지 않고 !--pending
“카운트 다운 pending
하고 0인지 확인 “으로 읽 습니다. 비슷한 언어의 프로그래머가 알아야 할 관용구입니다.
이 함수는 readdir
파일과 서브 디렉토리 목록을 가져 오는 데 사용 하며,이를 총칭하여 “항목”이라고합니다.
변수 pending
는 처리 될 남아있는 수를 추적합니다. 목록의 길이로 시작하여 각 항목이 처리 될 때 0을 향해 아래로 계산됩니다.
이러한 항목은 순서가 잘못 처리 될 수 있으므로 단순한 루프를 사용하는 대신 카운트 다운해야합니다. 때 모든 항목이 처리 된 콜백 done
이 사실상 원래 호출자에게 통지하기 위해 호출된다.
첫 번째 호출에서 done
앞에 접두사가 붙습니다 return
. 값을 반환하려는 것이 아니라 단순히 그 시점에서 함수 실행을 중지시키기 위해서입니다. 를 삭제 return
하고에 대안을 넣는 것이 더 깨끗한 코드 일 것 else
입니다.
답변
속기입니다.
!
아니다”.
--
값을 줄입니다.
따라서 !--
값 감소 결과를 무효화하여 얻은 값이 false인지 확인합니다.
이 시도:
var x = 2;
console.log(!--x);
console.log(!--x);
x의 값이 1이므로 두 번째는 true입니다. x의 값은 0이므로 첫 번째는 false입니다.
참고 사항 :
!x--
x가 먼저 false인지 확인한 다음 감소시킵니다.
답변
!
JavaScript NOT 연산자입니다
--
사전 감소 연산자입니다. 그래서,
x = 1;
if (!x) // false
if (!--x) // becomes 0 and then uses the NOT operator,
// which makes the condition to be true
답변
if(!--pending)
방법
if(0 == --pending)
방법
pending = pending - 1;
if(0 == pending)
답변
적절한 운영자가 아닌 사전 운영자입니다.
따라서 pending
값이 1 인 정수인 경우
val = 1;
--val; // val is 0 here
!val // evaluates to true