자바 스크립트에서 빈 문자열은 항상 부울로 거짓입니까?


134

자바 스크립트에서

var a = '';
var b = (a) ? true : false;

var b로 설정됩니다 false.

신뢰할 수있는 정의 된 동작입니까?


확실한가요, false여기 에요
anubhava

한 걸음 더 나아갔습니다. 공백이있는 문자열은 사실입니다. if ( '') {console.log ( '!')}하지만 ''== 0이면 true입니다.
Azat

2
내가 @JonH 에디션 잘못이라고 생각, 빈 문자열이 ''부울 컨텍스트에서 false로 평가 그렇다면 a = '';다음 a ? false : true=> '' ? false : true=> false ? false : true=> true(거짓 값에 대한 평가이기 때문에). 나는 var b = (a) ? true : false;다음 진술로 정확 해야한다고 생각합니다 .
PhoneixS

@PhoneixS가 편집되었으므로 더 의미가 있기를 바랍니다.
SwissCoder

1
@SwissCoder 읽을 수는 없지만 다른 답변을 출력합니다. 이제 수정했습니다.
PhoneixS

답변:


191

예. Javascript는 ECMAScript의 방언이며 ECMAScript 언어 사양은이 동작을 명확하게 정의합니다.

부울

인수가 빈 문자열 인 경우 (길이가 0 인 경우) 결과는 false입니다. 그렇지 않으면 결과는 사실이다

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf 에서 인용


Aaaaand 그것이 해결되었습니다
Anthony

28
하나의 경고는 new String("")진실입니다! 짧은 형식 ""은 기본 값 버전을 나타내는 반면 개체이기 때문입니다 . 동일 new Number(0)하고 심지어 간다 new Boolean(false). 코드에서 객체 버전을 사용하지 않는 것이 좋은 이유이며, if (str.length)이 경우 를 처리하는 반면 if (str)그렇지 않은 경우를 의미합니다 .
Chris Middleton

54

예. 모든 false, 0빈 문자열 ''"", NaN, undefined, 그리고 null언제나처럼 평가된다 false; 다른 모든 것입니다 true.

그리고 귀하의 예에서, b는 false평가 후입니다. (잘못 쓴 것 같아요 true)


2
null아니다 false, 어느 쪽도 true, null없습니다 null. jsfiddle.net/sq1Lkpg0
Bruno Finger

7
@Bruno, NaN및로 동일한 테스트를 수행 할 수 있습니다 undefined. 그들은 false아니지만 거짓입니다. 어떤 것이 요청되었습니다.
Joseph

11

var a = '';
var b = (a) ? false : true;   // fixed!
console.log(b);               // => true

var가로 b설정됩니다 true.

신뢰할 수있는 정의 된 동작입니까?

위의 대답으로, , 그 빈 문자열의 정의 된 동작입니다 조건에서 (AN if표현, ||, &&, ? :, ...). ( 표준은 내부 ToBoolean 연산을 적용해야 한다고 말합니다 .)

결과가 거의 동일 하더라도 빈 문자열을 비교에 사용하면 평가가 다릅니다 ( Truth, Equality 및 JavaScript 참조 ) .

// conditional (note: evaluation to false prints false here!)
console.log('' ? true : false); // zero length     => false

// comparisons
console.log('' == true);        // +0 === 1        => false
console.log('' == false);       // +0 === +0       => true
console.log('' === true);       // different types => false
console.log('' === false);      // different types => false

설명 :의 피연산자 때 기본적으로 ==다른 유형을 가지고, 자바 스크립트가에 따라, 숫자로 변환하기 어려운 시도 ( 사용하여 작업을 표준 통화 ToNumberToPrimitive를 ) 다음 내부적으로 적용됩니다 ===. 그러나 ===직접 사용 하는 경우 유형이 변환되지 않으므로 문자열을 부울과 비교하는 것은 항상 false입니다.

대략적으로 말하면, null이 아닌, 0이 아닌, 비어 있지 않은, 거짓이 아닌 값에 대해 JavaScript 조건부 ( ToBoolean ) 테스트 (빈 문자열은 ... 비어 있고 숫자 -0 또는 +0은 ... 제로 NaN이 정의 된 번호가 아닙니다,하지만 빈 개체) 정말 버리지 분명히, 또는 내가 생각하는 등과 같은 조건문 에 대한 시험 A (참) 것 , 동안 비교 명백한 신중하게 변환 된 ( ToPrimitive , ToNumber을 )의 피연산자이며 정확한 동일성을 찾습니다 .=====

if (X) {}        // is X a (true) thing?
if (X == Y) {}   // are the values of X and Y same-ish?
if (X === Y) {}  // are X and Y exactly the same?

거기에 더 예 진실, 평등 및 자바 스크립트 등이 구별은 정말 중요한, '0'이다 true조건에서 (길이가 0이 아닌, 또는 그 일이됩니다 ), 그러나 falseA의 ==비교합니다 ( 값이 제로). '1'다시 말하지만 true두 경우 모두입니다 (사물이며 0이 아닌 값을 가짐).

console.log('' ? true : false);   // zero length     => false
console.log('' == true);          // +0 === 1        => false
console.log('0' ? true : false);  // non-zero length => true
console.log('0' == true);         // +0 === 1        => false
console.log('1' ? true : false);  // non-zero length => true
console.log('1' == true);         //  1 === 1        => true


1
처음에는 "pssh, 그것은 과잉입니다. 이것은 이미 잘 대답되었습니다."라고 생각했습니다. 그러나 그것은 잘 표현되고 유익했습니다. 감사.
Marc L.

8

var b로 설정됩니다 true. 빈 문자열은 다른 값과 마찬가지로 JavaScript에서 'falsey'값으로 계산되기 때문입니다.

잘못된 값 은 http://www.sitepoint.com/javascript-truthy-falsy/참조하십시오.


당신은 당신의 대답에 틀 렸습니다. var b실제로 코드를 보는 true것과 반대이기 때문에 로 설정됩니다 var a.
bombek

@bombek 감사합니다-업데이트하겠습니다. 내 답변 후 원래 질문이 수정 된 것 같습니다 (값이 바뀌 었습니다)
Jonathon Bolster

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.