JavaScript에서 null, undefined 또는 blank 변수를 확인하는 표준 함수가 있습니까?


2260

변수가 그렇지 않은하는 가치와 보장하지만이 수표를 가지고있는 보편적 인 자바 스크립트 기능이 있습니까 undefined또는 null? 이 코드가 있지만 모든 경우에 해당되는지 확실하지 않습니다.

function isEmpty(val){
    return (val === undefined || val == null || val.length <= 0) ? true : false;
}


78
Protip, 절대하지 마십시오 (truthy statement) ? true : false;. 그냥하세요 (truthy statement);.
David Baucum 17

5
@GeorgeJempty는 dup이 아닙니다. 왜냐하면 다른 답변은 특히 문자열 에 대해 묻는 반면, 이것은 답변에 대한 것 입니다 .
Madbreaks

2
이 질문에 대한 정답은 전적으로 "공백"을 정의하는 방법에 달려 있습니다.
Madbreaks

3
@Jay 코드 실행까지 아무 것도 해치지 않습니다. 너무 장황하다. "배고파요?"라고 말하지 않을 것입니다. 당신은 단지 "배고파요"코드에서 if (hungry) …대신에 말합니다 if (hungry === true) …. 이 방식의 모든 코딩 작업과 마찬가지로 맛의 문제 일뿐입니다. OP에 의해 제공된 예에 더 구체적으로, 그는 "그게 사실이라면, 사실이라면, 그렇지 않다면 거짓"이라고 더 장황하게 말하고 있습니다. 그러나 그것이 사실이라면, 그것은 이미 사실입니다. 그리고 그것이 거짓이라면, 이미 거짓입니다. 이것은 "배가 고프면 그렇지 않다면 그렇지 않다"고 말하는 것과 비슷합니다.
David Baucum

답변:


4378

변수truthy값 이 있는지 여부를 확인할 수 있습니다 . 그 의미는

if( value ) {
}

로 평가됩니다 true경우 value입니다 하지 :

  • 없는
  • 찾으시는 주소가 없습니다
  • NaN
  • 빈 문자열 ( "")
  • 0
  • 그릇된

위 목록은 falsyECMA- / Javascript에서 가능한 모든 값을 나타냅니다 . 섹션 의 사양 에서 찾으십시오 ToBoolean.

당신이하지 않으면 또한, 알고 변수가 존재하는지 여부 (이 경우 수단은 것을 선언 ) 당신은 확인해야 typeof연산자. 예를 들어

if( typeof foo !== 'undefined' ) {
    // foo could get resolved and it's defined
}

당신이 확신 할 수있는 경우 변수가 적어도 선언 그것은이있는 경우, 당신은 직접 확인해야합니다 truthy위에 표시와 같은 값입니다.

추가 읽기 : http://typeofnan.blogspot.com/2011/01/typeof-is-fast.html


110
값이 의도 한 거짓 부울 인 경우 어떻게됩니까? 때로는 값이 없으면 기본값을 지정하려고합니다. 거짓 부울이 전달되면 작동하지 않습니다.
TruMan1

100
@ TruMan1 : 이러한 경우 (논리가 유효성을 지시하는 경우) 다음과 같이 진행해야합니다 if( value || value === false ). 모든 허위 값대해서도 마찬가지 입니다. 명시 적으로 유효성을 검증해야합니다.
jAndy

28
값이 배열 인 경우를 제외하고. 해석 truthy이 오해의 소지가 있습니다. 이 경우 value.length != 0비어 있지 않은 배열을 확인해야합니다 .
사용자

12
if구문이 구문 적으로 너무 무겁다 고 생각 되면 삼항 연산자를 사용할 수 있습니다 var result = undefined ? "truthy" : "falsy". 그냥 부울 값으로 강제 변환하려는 경우 또는, 사용 !!예 연산자를 !!1 // true, !!null // false.
KFL

7
또한 공백 문자 만 포함하는 문자열은 검사하지 않습니다.
Christophe Roussy 10

221

값이 정의되지 않았거나 null인지 확인하는 자세한 방법은 다음과 같습니다.

return value === undefined || value === null;

==연산자를 사용할 수도 있지만 모든 규칙알고 있어야합니다 .

return value == null; // also returns true if value is undefined

33
확인 만하 null거나 undefined다음과 같이 수행 할 수 있습니다 if (value == null).. ==강제 하는 운영자를 염두에 두십시오. 이 방법을 확인 if (value === null || value === undefined)하면 Javascript가 어떻게 강요되는지 잊어 버렸습니다. webreflection.blogspot.nl/2010/10/…
Christiaan Westerbeek

32
@ChristiaanWesterbeek : arg == null와 동일한 결과 를 생성하는 요점 arg === undefined || arg === null. 그러나 후자의 예제를 더 읽기 쉽다고 생각합니다.
Salman A

10
arg == null내 경험에서 꽤 일반적입니다.
Bryan Downing

8
return value === (void 0)undefined슬프게도 범위 내에서 합법적 인 변수가 될 수있는 테스트보다 안전 합니다.
x0n

4
@Sharky 정의되지 않은 변수와 선언되지 않은 변수에는 차이가 있습니다. lucybain.com/blog/2014/null-undefined-undeclared
Christiaan Westerbeek

80
function isEmpty(value){
  return (value == null || value.length === 0);
}

이것은에 대한 true를 반환합니다

undefined  // Because undefined == null

null

[]

""

함수 length는 선언 된 매개 변수의 수 이므로 인수 함수 가 없습니다.

후자의 범주를 허용하지 않으려면 빈 문자열 만 확인하면됩니다.

function isEmpty(value){
  return (value == null || value === '');
}

7
undefined == null하지만undefined !== null
이안 보이드

2
@IanBoyd는 ==와 ===을 비교하기 때문입니다. 이것은 undefined == null (true) undefined! = null (false) undefined === null (false) undefined! == null (true)는 도움을주고 사람들을 밀기 위해 조금 더 많은 정보를 제공하는 것이 좋습니다 올바른 방향으로. 차이점 developer.mozilla.org/en-US/docs/Web/JavaScript/
Corey Young

43

이것은 가장 안전한 검사이며 여기에 정확하게 게시 된 것을 보지 못했습니다.

if (typeof value !== 'undefined' && value) {
    //deal with value'
};

이 정의되지 않은 경우 와 다음 중 하나 를 다룹니다 .

  • 없는
  • undefined (정의되지 않은 값은 정의되지 않은 매개 변수와 동일하지 않음)
  • 0
  • ""(빈 문자열)
  • 그릇된
  • NaN

편집 : 엄격한 평등 (! ==)으로 변경되었습니다. 지금은 표준이기 때문입니다.)


10
필자는 공감하지는 않았지만 엄격한 평등 비교와 관련하여 일반적인 규칙은 엄격한 비교보다 암시 적 유형 변환이 필요 하지 않다는 것입니다.
J.Steve

2
귀하의 의견을위한 감사합니다 Steve. 그 일반적인 규칙은 괜찮습니다. 나는 ppl이 왜 그들이 하나를 사용하는지 이해하기를 기대합니다. ppl은 자바 스크립트에서 가장 중요한 것처럼 항상 항상 엄격한 사용에 대해 설교하게되어 기쁘다. if (val! == null) 과 같은 경우가 너무 많아서 원치 않는 결과가 나왔습니다. 의심 스러울 때는 엄격하게 사용하되 의심하지 않는 것이 좋습니다.
guya December

6
여기서 요점은 typeof연산자가 문자열을 반환하므로 엄격한 동등성 검사를 사용하는 것이 기술적으로 더 정확하고 구체적이며 빠르다는 것입니다. 따라서 느슨한 비교를 사용해야 할 이유가 없습니다. 또한 val !== null많은 경우에 완벽하게 유효합니다-나는 항상 그것을합니다. 나는 당신의 부적합한 주장에 동의하지만, 이것은 그것을 만들기에 나쁜 예라고 생각합니다. 당신을 트롤하려고하지 않습니다.
Bryan Downing

귀하의 의견에 대한 감사의 말 Bryan, val! == null을 사용하고 있습니다. 초보자는 val이 잘못되었을 때 폴백을 원할 것입니다. 그러나 val은 null이 아니며 정의되지 않습니다. "항상 항상 엄격하게 사용"하라는 조언을 듣지 않으면 버그가 줄어 듭니다. 나는 이것이 프로덕션 코드에서 발생하는 것을 보았습니다. typeof는 항상 문자열을 반환하고 속도 차이는 중복됩니다. 따라서 위의 경우 엄격한 사용에 대한 유일한 주장은 일관성입니다. 나는“엄격한 평등이 필요 없다”고 말했습니다. 그것은 당신이 원하거나 코드를보다 일관성있게 만들 수 없다는 것을 의미하지는 않습니다.
guya

28

다음 기능이 유용 할 수 있습니다.

function typeOf(obj) {
  return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}

또는 ES7에서 (추가 개선의 경우 의견)

function typeOf(obj) {
  const { toString } = Object.prototype;
  const stringified = obj::toString();
  const type = stringified.split(' ')[1].slice(0, -1);

  return type.toLowerCase();
}

결과 :

typeOf(); //undefined
typeOf(null); //null
typeOf(NaN); //number
typeOf(5); //number
typeOf({}); //object
typeOf([]); //array
typeOf(''); //string
typeOf(function () {}); //function
typeOf(/a/) //regexp
typeOf(new Date()) //date
typeOf(new WeakMap()) //weakmap
typeOf(new Map()) //map

"바인드 연산자 (: :)는 ES2016 (ES7) 또는 ECMAScript 표준의 이후 버전에 전혀 포함되지 않습니다. 현재 언어에 도입하기위한 단계 0 (스트로 맨) 제안입니다." – Simon Kjellberg. 저자는 왕의 승천을 받기위한이 아름다운 제안에 대한지지를 추가하기를 원합니다.


+1 'regexp' , 'array'및 'function' 유형의 객체를 아는 것이 도움이됩니다
Yash

@ Vix, ES7 버전이 더 나은 이유는 무엇입니까?
GollyJer

할당 해체, 바인드 연산자를 사용하여 동일한 기능을 표현하는 더 읽기 쉬운 방법으로 실험하지 않았습니다.
Vix

2
바인드 연산자 ( ::)는 ES2016 (ES7) 또는 ECMAScript 표준의 이후 버전에 전혀 포함되지 않습니다. 현재이 언어를 소개하기위한 단계 0 (strawman) 제안입니다.
Simon Kjellberg

25

최고 등급의 첫 번째 답변이 잘못되었습니다. 값이 정의되어 있지 않으면 최신 브라우저에서 예외가 발생합니다. 다음을 사용해야합니다.

if (typeof(value) !== "undefined" && value)

또는

if (typeof value  !== "undefined" && value)

3
eee ... 나는 빈 값 / 배열을 제외하고는 (값)이 충분하다고 생각합니다. 값이 '정의되지 않은'경우 'if'confition은 전달되지 않습니다.
Oskar Szura

3
이는 정의되지 않은 변수 (평가시 ReferenceError를 발생시키는 변수)를 병합하며 undefined값 이있는 변수와 다릅니다 .
콴타스 94 헤비

2
여기에 같은 오류가 있습니다. x가 정의되지 않은 경우 if (x), if (! x), if (!! x)는 모두 오류를 발생시킵니다.
shaosh

if(value === 0) gameOver(); ;)
Madbreaks

이 답변은 value0이 아닐 때 false를 반환하기 때문에 잘못되었습니다. 이는 op가 찾고 있는 것이 아닙니다 .
Madbreaks

17

이 상태 확인

if (!!foo) {
    //foo is defined
}

당신이 필요한 전부입니다.


나는 이것이 단지 스 니펫이라고 가정합니다. 그러나 if이미 거짓 검사를 수행합니다. 이는 부울로 변환됩니다. 정상 if(foo)이 포착하지 못하는 경우를 포착합니까?
Daan van Hulst

1
이것은 인라인 무언가가 필요할 때 완벽합니다. 예를 들어 문자열이 비어 있지 않은 경우에 해당하는 반응 속성 (액티브라고 함)이 필요합니다. if 문이 과잉이되어 사용할 수 있습니다active={!!foo}
Ben Kolya Mansley

16

! 확인 빈 문자열 ( "") 널 (null), 정의되지 않은 허위 숫자 0과 NaN가. 문자열이 비어 var name = ""있으면를 console.log(!name)반환합니다 true.

function isEmpty(val){
  return !val;
}

이 함수는 val비어 있거나 null, undefined, false, 숫자 0 또는 NaN 인 경우 true를 반환합니다 .

또는

문제 도메인에 따르면 !val또는 처럼 사용할 수 있습니다 !!val.


변수가 비어 있는지 여부는 실제로 말하지 않습니다. false와 0은 유효한 값일 수 있고 빈 값을 구성 할 수 없기 때문입니다. isEmpty 함수의 값은 비어있는 것으로 예상되는 값이 true를 리턴하는지 확인하는 것입니다. 내 의견으로는 null, undefined, NaN 및 빈 문자열은 비어있는 값입니다.
Corey Young

9
isEmpty(val)당신이 할 수 있다면 왜 사용 합니까 !val?
Allen Linatoc

너하기에 달렸다. 가독성을 높이기 위해 사용할 수 있습니다. 그렇지 않으면 당신이 일하는 팀이 더 진보 된 코더라고 생각한다면 문제 도메인에 따라 !val또는 사용할 수 있습니다 !!val.
Arif

15

내가 많이 좋아하는 솔루션 :

빈 변수가 null, 또는 undefined길이이거나 길이가 0이거나 객체 인 경우 키가없는 것으로 정의 해 보겠습니다 .

function isEmpty (value) {
  return (
    // null or undefined
    (value == null) ||

    // has length and it's zero
    (value.hasOwnProperty('length') && value.length === 0) ||

    // is an Object and has no keys
    (value.constructor === Object && Object.keys(value).length === 0)
  )
}

보고:

  • 사실 : undefined , null, "", [],{}
  • 거짓 : true , false, 1, 0, -1, "foo", [1, 2, 3],{ foo: 1 }

14

당신은 그것을 약간 과장하고 있습니다. 변수에 값이 제공되지 않았는지 확인하려면 undefined 및 null 만 확인하면됩니다.

function isEmpty(value){
    return (typeof value === "undefined" || value === null);
}

이 가정되고 0, ""그리고 개체 (심지어 빈 객체 어레이)의 유효 "값"이다.


10

일반 자바 스크립트를 선호하는 경우 다음을 시도하십시오.

  /**
   * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a
   * length of `0` and objects with no own enumerable properties are considered
   * "empty".
   *
   * @static
   * @memberOf _
   * @category Objects
   * @param {Array|Object|string} value The value to inspect.
   * @returns {boolean} Returns `true` if the `value` is empty, else `false`.
   * @example
   *
   * _.isEmpty([1, 2, 3]);
   * // => false
   *
   * _.isEmpty([]);
   * // => true
   *
   * _.isEmpty({});
   * // => true
   *
   * _.isEmpty('');
   * // => true
   */

function isEmpty(value) {
    if (!value) {
      return true;
    }
    if (isArray(value) || isString(value)) {
      return !value.length;
    }
    for (var key in value) {
      if (hasOwnProperty.call(value, key)) {
        return false;
      }
    }
    return true;
  }

그렇지 않으면 이미 밑줄이나 lodash를 사용중인 경우 다음을 시도하십시오.

_.isEmpty(value)

3
코드를 사용해보십시오. "캐치되지 않은 참조 오류 : isArray ()가 정의되지 않았습니다."라는 오류 메시지가 콘솔에 표시됩니다. 그렇지 않으면 작동하면 좋을 것입니다.
crmprogdev

11
lodash의 경우, 적어도 _.isNil당신이 찾고있는 기능이 아닙니다 _.isEmpty. isNil 문서 , isEmpty 문서
Snixtor

값이 부울이고 값이 true 인 경우 실패합니다.
kalyanbk

3
일반 자바 스크립트에는에 isArray또는 isString기능 이 없습니다 window.
GFoley83

@ GFoley83-당신은 나를 잡았다! Windows를 사용하지 않는 이유가 있습니다. 나는 실제로 소프트웨어 언어의 역사와 진행에 관해 이야기하는 장의 주제를 다룹니다. 더 관련성이 높은 정보는 아마도 내 책인 Learn Functional Programming in Go에서 Monadic Error Handling을 보여주는 토론 / 코드 일 것입니다. 건배!
l3x

9

여기에 광산이 있습니다-value가 null, undefined 등이거나 공백 인 경우 true를 반환합니다 (예 : 공백 만 포함).

function stringIsEmpty(value) {

    return value ? value.trim().length == 0 : true;

}

1
나는 몇 가지 방법에 대한 테스트를 여기에서했다. undefined를 확인하면 함수가 훌륭하게 작동합니다. 따라서 if (typeof value! == 'undefined'&&! IsEmpty (value))를 사용하거나 실제로 비어 있는지 확인하려면 if (typeof value === 'undefined'|| IsEmpty2 (value) ). 이것은 null에 대해 작동합니다. 찾으시는 주소가 없습니다; 0; ""; ""; false
RationalRabbit

6
return val || 'Handle empty variable'

많은 곳에서 처리하는 정말 좋고 깔끔한 방법이며 변수를 할당하는데도 사용할 수 있습니다

const res = val || 'default value'

장소를 많이하지만, 기본값은하지 않을 때 true와 사용자가 제공 또는를 반환하려는 valfalse.
Molomby

@Molomby 그것은 매우 특정한 엣지 케이스이지만 쉽게 처리됩니다const res = falsyValue ? true : falsyValue
cubefox

5

변수가 선언되지 않은 경우 오류가 발생하기 때문에 함수를 사용하여 정의되지 않은 테스트를 수행 할 수 없습니다.

if (foo) {}
function (bar) {}(foo)

foo가 선언되지 않으면 둘 다 오류를 생성합니다.

변수가 선언되었는지 테스트하려면 다음을 사용할 수 있습니다

typeof foo != "undefined"

foo가 선언되었고 값이 있는지 테스트하려는 경우 사용할 수 있습니다.

if (typeof foo != "undefined" && foo) {
    //code here
}

5

기본값을 확인하려면

function typeOfVar (obj) {
      return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}
function isVariableHaveDefaltVal(variable) {
    if ( typeof(variable) === 'string' ) {  // number, boolean, string, object 
        console.log(' Any data Between single/double Quotes is treated as String ');        
        return (variable.trim().length === 0) ? true : false;
    }else if ( typeof(variable) === 'boolean' ) {
      console.log('boolean value with default value \'false\'');
        return (variable === false) ? true : false;
    }else if ( typeof(variable) === 'undefined' ) {
        console.log('EX: var a; variable is created, but has the default value of undefined.'); 
        return true;
    }else if ( typeof(variable) === 'number' ) { 
        console.log('number : '+variable);
        return (variable === 0 ) ? true : false;
    }else if ( typeof(variable) === 'object' ) {
   //   -----Object-----
        if (typeOfVar(variable) === 'array' && variable.length === 0) {
            console.log('\t Object Array with length = ' + [].length); // Object.keys(variable)
            return true;
        }else if (typeOfVar(variable) === 'string' && variable.length === 0 ) {
            console.log('\t Object String with length = ' + variable.length);
            return true;
        }else if (typeOfVar(variable) === 'boolean' ) {
            console.log('\t Object Boolean = ' + variable);
            return (variable === false) ? true : false;
        }else if (typeOfVar(variable) === 'number' ) {
            console.log('\t Object Number = ' + variable);
            return (variable === 0 ) ? true : false;
        }else if (typeOfVar(variable) === 'regexp' && variable.source.trim().length === 0 ) {
       console.log('\t Object Regular Expression : ');
        return true;
        }else if (variable === null) {
       console.log('\t Object null value');
        return true;
        }
    }
    return false;
}
var str = "A Basket For Every Occasion";
str = str.replace(/\s/g, "-");
//The "g" flag in the regex will cause all spaces to get replaced.

결과 확인 :

isVariableHaveDefaltVal(' '); // string          
isVariableHaveDefaltVal(false); // boolean       
var a;           
isVariableHaveDefaltVal(a);               
isVariableHaveDefaltVal(0); // number             
isVariableHaveDefaltVal(parseInt('')); // NAN isNAN(' '); - true         
isVariableHaveDefaltVal(null);              
isVariableHaveDefaltVal([]);               
isVariableHaveDefaltVal(/ /);              
isVariableHaveDefaltVal(new Object(''));               
isVariableHaveDefaltVal(new Object(false));            
isVariableHaveDefaltVal(new Object(0)); 
typeOfVar( function() {} );

@Vix function ()을 사용하여 어떤 유형의 객체를 확인했습니다.

instansof 사용하기«

var prototypes_or_Literals = function (obj) {
    switch (typeof(obj)) {
        // object prototypes
        case 'object':
            if (obj instanceof Array)
                return '[object Array]';
            else if (obj instanceof Date)
                return '[object Date]';
            else if (obj instanceof RegExp)
                return '[object regexp]';
            else if (obj instanceof String)
                return '[object String]';
            else if (obj instanceof Number)
                return '[object Number]';

            else
                return 'object';
        // object literals
        default:
            return typeof(obj);
    }   
};
output test «
prototypes_or_Literals( '' ) // "string"
prototypes_or_Literals( new String('') ) // "[object String]"
Object.prototype.toString.call("foo bar") //"[object String]"        

비교 연산자== [데이터]를 확인합니다 . === [Data, Type Of Object] JS 번호는 국제 IEEE 754 표준에 따라 항상 배정 밀도 부동 소수점 숫자로 저장됩니다. // Number Type [int, float literals ] var int = 77; var float = 77.7; console.log( int.toFixed(10) + '\t' + float.toFixed(10) ); // Object Type var number = new Number( 77 ); if( int != float ) console.log('Data Not Equal'); if( int == number && int !== number ) console.log('Data is Equal & Types vary');
Yash

5
function isEmpty(obj) {
    if (typeof obj == 'number') return false;
    else if (typeof obj == 'string') return obj.length == 0;
    else if (Array.isArray(obj)) return obj.length == 0;
    else if (typeof obj == 'object') return obj == null || Object.keys(obj).length == 0;
    else if (typeof obj == 'boolean') return false;
    else return !obj;
}

공백 문자열을 처리하기위한 트림 기능이있는 ES6에서 :

const isEmpty = value => {
    if (typeof value === 'number') return false
    else if (typeof value === 'string') return value.trim().length === 0
    else if (Array.isArray(value)) return value.length === 0
    else if (typeof value === 'object') return value == null || Object.keys(value).length === 0
    else if (typeof value === 'boolean') return false
    else return !value
}

1
훌륭한 기능, 감사합니다! 모든 유형의 가치를 처리-다른 모든 솔루션에는 숫자가 제외됩니다!
Fabian von Ellerts 님이

1
@FabianvonEllerts 다른 사람의 답변으로 추가 코드를 편집하지 마십시오. 답변 아래에 의견으로 자신의 답변으로 게시하거나 답변 자체를 업데이트하라는 의견을 요청하십시오.
TylerH

5

유용 할 수 있습니다.

배열의 모든 값은 원하는 것을 나타내고 (널, 정의되지 않은 또는 다른 것) 원하는 것을 검색합니다.

var variablesWhatILookFor = [null, undefined, ''];
variablesWhatILookFor.indexOf(document.DocumentNumberLabel) > -1

2
설명해 주시겠습니까? 거기에 무슨 일이
일어나

배열은 비어 있다고 가정 한 변수를 포함합니다.
ddagsan

@JoshKisb 배열의 모든 값은 원하는 것을 나타내고 (널, 정의되지 않은 또는 다른 것) 원하는 것을 검색합니다.
ddagsan 2016 년

1
@ddagsan JoshKisb가 귀하의 답장을 보내주실 수 있지만 귀하는 설명이 아닌 답변에 설명을 입력해야합니다.
Nick

4

"값이 "인 경우를 사용 TypeScript하지 않고 사용 하지 않으려 false 경우이 방법이 적합합니다.

먼저: import { isNullOrUndefined } from 'util';

그때: isNullOrUndefined(this.yourVariableName)

참고 : 아래에서 언급했듯이 더 이상 사용되지 않으므로 value === undefined || value === null대신 사용하십시오. 심판 .


2
나는 이것이 시원하다고 생각하여 처음에 투표를 취소했지만 Node.js는 더 이상 사용되지 않습니다. 유형 정의 파일의 내용 :/** @deprecated since v4.0.0 - use "value === null || value === undefined" instead. */
atomictom

@atomictom 나는 그 typescript일을 생각했다 . 문서의 링크를 제공 할 수 있습니까?
BlackBeard

여기 : nodejs.org/api/util.html#util_util_isnullorundefined_object . 또한 "나는이 멋진 내가 처음이라고 생각 upvoted :) 읽어야"
atomictom

왜 이렇게 유용한 간단한 것이 더 이상 사용되지 않습니까? eeeeee.
틱톡

3

공허

전 세계의 값이 비어 있는지 계산하는 함수를 정의하거나 사용하지 않는 것이 좋습니다. "빈"다는 것은 무엇을 의미합니까? 내가 가지고 있다면 let human = { name: 'bob', stomach: 'empty' }, isEmpty(human)반환 해야 true합니까? 내가 가지고 있다면 let reg = new RegExp('');, isEmpty(reg)반환 해야 true합니까? 무엇에 대해 isEmpty([ null, null, null, null ])-이 목록은 그래서 그 자체가 비워 목록입니다, 공허함이 들어? 자바 스크립트에서 "vacuousness"(기존의 연관성을 피하기 위해 의도적으로 모호한 단어)에 대한 몇 가지 참고 사항을 제시하고자합니다. 그리고 자바 스크립트 값의 "vacuousness"는 일반적으로 처리되지 않아야한다고 주장하고 싶습니다.


진실 / 거짓

값의 "빈도"를 결정하는 방법을 결정하려면 값이 "거실"인지 "거짓"인지에 대한 자바 스크립트의 내장 된 고유 한 의미를 수용해야합니다. 당연히, null그리고 undefined모두 "falsy"입니다. 덜 자연스럽게, 숫자 0(및 다른 숫자는 제외 NaN)도 "거짓"입니다. 가장 자연스럽게 : ''허위이지만 [], 그리고 {}(그리고 new Set(), 그리고 new Map())는 진실합니다 – 비록 모두 공허하게 보입니다!


널 대 정의되지 않음

관련된 논의도있다 nullundefined우리가 정말 우리의 프로그램에서 vacuousness을 표현하기 위해 모두 필요합니까는? - 나는 개인적으로 문자 u, n, d, e, f, i, n, e, d가 순서대로 내 코드에 나타나는 것을 피합니다. 나는 항상 null"진실함"을 나타내는 데 사용 합니다. 그러나 다시, 우리는 자바 스크립트의 고유 한 방식 null과 방법을 수용해야합니다 undefined.

  • 존재하지 않는 재산에 접근하려고하면 undefined
  • 함수를 호출 할 때 매개 변수를 생략하면 해당 매개 변수가 수신됩니다 undefined.

let f = a => a;
console.log(f('hi'));
console.log(f());

  • 기본값이있는 매개 변수는 다음 undefined이 아닌 지정된 경우에만 기본값을받습니다 null.

let f = (v='hello') => v;
console.log(f(null));
console.log(f(undefined));


제네릭 비폭력

나는 공허함이 일반적인 방식으로 다루어지지 않아야한다고 믿는다. 대신 데이터가 비어 있는지 확인하기 전에 항상 데이터에 대한 자세한 정보를 얻을 수있는 엄격함을 가져야합니다. 주로 처리하는 데이터 유형을 확인하여이 작업을 수행합니다.

let isType = (value, Cls) => {
  try {
    return Object.getPrototypeOf(value).constructor === Cls;
  } catch(err) {
    return false;
  }
};

이 함수는 다형성을 무시합니다 . 하위 클래스의 인스턴스가 아닌 value직접 인스턴스 일 것으로 예상 됩니다 . 두 가지 주요 이유로 피 합니다.ClsClsinstanceof

  • ([] instanceof Object) === true ( "배열은 객체이다")
  • ('' instanceof String) === false ( "문자열은 문자열이 아닙니다")

Object.getPrototypeOf같은 경우를 방지하기 위해 사용되는 기능은 여전히 제대로 반환 (거짓) 및 (참).let v = { constructor: String };isTypeisType(v, String)isType(v, Object)

전반적으로이 isType기능을 다음 팁과 함께 사용하는 것이 좋습니다 .

  • 알 수없는 유형의 코드 처리 값을 최소화하십시오. 예를 들면, 위해 let v = JSON.parse(someRawValue);, 우리의 v변수는 현재 알 수없는 유형이다. 가능한 빨리, 우리는 가능성을 제한해야합니다. 이를 수행하는 가장 좋은 방법은 특정 유형을 요구하는 것입니다. 예 : if (!isType(v, Array)) throw new Error('Expected Array');-의 일반적인 특성을 제거하고 v항상임을 보장 하는 정말 빠르고 표현적인 방법 Array입니다. 그러나 때로는 v여러 유형 을 허용해야합니다 . 이 경우 v가능한 빨리 더 이상 일반적이지 않은 코드 블록을 만들어야 합니다.

if (isType(v, String)) {
  /* v isn't generic in this block - It's a String! */
} else if (isType(v, Number)) {
  /* v isn't generic in this block - It's a Number! */
} else if (isType(v, Array)) {
  /* v isn't generic in this block - it's an Array! */
} else {
  throw new Error('Expected String, Number, or Array');
}

  • 유효성 검사를 위해 항상 "화이트리스트"를 사용하십시오. 예를 들어 문자열, 숫자 또는 배열과 같은 값이 필요한 경우 이러한 "백색"가능성을 확인하고 3 중 어느 것도 만족하지 않으면 오류를 발생시킵니다. 우리는 "검은 색"가능성에 대한 검사가 그다지 유용하지 않다는 것을 알 수 있어야합니다. 우리가 글을 씁니다 if (v === null) throw new Error('Null value rejected');-이것은 null가치가 그것을 달성하지 못하도록하는 데 유용 하지만, 가치 그것을 달성하면 여전히 거의 알지 못합니다 그것에 대해 무엇이든. 값 v이 널 검사를 통과 여전히 매우 일반적입니다 - 그것의 아무것도하지만null ! 블랙리스트는 일반성을 거의 없애지 않습니다.
  • 값이 null인 경우가 아니면 "진실한 값"을 고려하지 마십시오. 대신, "진공적인 X"를 고려하십시오. 본질적으로, 같은 기능을 수행하는 것을 고려하지 마십시오 if (isEmpty(val)) { /* ... */ }-그 isEmpty기능이 어떻게 구현 되는지에 관계없이 (알고 싶지 않습니다 ...), 의미가 없습니다! 그리고 너무 일반적인 방법입니다! 변동성은 val의 유형에 대한 지식으로 만 계산해야 합니다. 변동성 점검은 다음과 같아야합니다.

    • "문자없는 문자열": if (isType(val, String) && val.length === 0) ...
    • "소품이 0 인 객체": if (isType(val, Object) && Object.entries(val).length === 0) ...
    • "0보다 작거나 같은 숫자": if (isType(val, Number) && val <= 0) ...
    • "항목이없는 배열": if (isType(val, Array) && val.length === 0) ...

    • 유일한 null기능은 특정 기능을 나타내는 데 사용되는 경우 입니다. 이 경우 다음과 같이 말하는 것이 의미가 있습니다. "빈 값":if (val === null) ...


나는 당신이 이것에 대해 생각한 것을 볼 수 있습니다 :>
Rui Marques

3

다른 논리로 시도하십시오 . 자바 스크립트와 jquery에서 null이 아니고, 비어 있지 않고, 정의되지 않았으며 0이 아닌이 코드 (! (! (variable))) 만 사용하는 것과 같이 유효성 검사를 위해 four (4) 조건을 모두 확인하기 위해 다음 코드를 사용할 수 있습니다.

function myFunction() {
    var data;  //The Values can be like as null, blank, undefined, zero you can test

    if(!(!(data)))
    {
        alert("data "+data);
    } 
    else 
    {
        alert("data is "+data);
    }
}


2
function isEmpty(val){
    return !val;
}

그러나이 솔루션은 과도하게 설계되어 비즈니스 모델 요구에 대해 나중에 함수를 수정하지 않으려는 경우 코드에서 직접 사용하는 것이 더 깨끗합니다.

if(!val)...

2
var myNewValue = myObject && myObject.child && myObject.child.myValue;

절대 오류가 발생하지 않습니다. 경우 즉, myObject , 자녀 , 또는 myValue가 null의 다음 myNewValue는 null가됩니다. 오류가 발생하지 않습니다


2

비슷한 질문을하기 위해 여기에 오는 모든 사람들에게 다음은 훌륭하게 작동하며 지난 몇 년 동안 내 도서관에 있습니다.

(function(g3, $, window, document, undefined){
   g3.utils = g3.utils || {};
/********************************Function type()********************************
* Returns a lowercase string representation of an object's constructor.
* @module {g3.utils}
* @function {g3.utils.type}
* @public
* @param {Type} 'obj' is any type native, host or custom.
* @return {String} Returns a lowercase string representing the object's 
* constructor which is different from word 'object' if they are not custom.
* @reference http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
* http://stackoverflow.com/questions/3215046/differentiating-between-arrays-and-hashes-in-javascript
* http://javascript.info/tutorial/type-detection
*******************************************************************************/
g3.utils.type = function (obj){
   if(obj === null)
      return 'null';
   else if(typeof obj === 'undefined')
      return 'undefined';
   return Object.prototype.toString.call(obj).match(/^\[object\s(.*)\]$/)[1].toLowerCase();
};
}(window.g3 = window.g3 || {}, jQuery, window, document));

2

jAndy의 답변 에 따라 값이 다음 중 하나 인 경우 true를 피하려면 :

  • 없는
  • 찾으시는 주소가 없습니다
  • NaN
  • 빈 문자열 ( "")
  • 0
  • 그릇된

진실한 가치를 얻지 못하는 한 가지 가능한 해결책은 다음과 같습니다.

function isUsable(valueToCheck) {
    if (valueToCheck === 0     || // Avoid returning false if the value is 0.
        valueToCheck === ''    || // Avoid returning false if the value is an empty string.
        valueToCheck === false || // Avoid returning false if the value is false.
        valueToCheck)             // Returns true if it isn't null, undefined, or NaN.
    {
        return true;
    } else {
        return false;
    }
}

다음과 같이 사용됩니다.

if (isUsable(x)) {
    // It is usable!
}
// Make sure to avoid placing the logical NOT operator before the parameter (isUsable(!x)) and instead, use it before the function, to check the returned value.
if (!isUsable(x)) {
    // It is NOT usable!
}

이러한 시나리오 외에도 객체 또는 배열 이 비어 있으면 false를 반환 할 수 있습니다 .

당신은 이런 식으로 갈 것입니다 :

function isEmptyObject(valueToCheck) {
    if(typeof valueToCheck === 'object' && !Object.keys(valueToCheck).length){
        // Object is empty!
        return true;
    } else {
        // Object is not empty!
        return false;
    }
}

function isEmptyArray(valueToCheck) {
    if(Array.isArray(valueToCheck) && !valueToCheck.length) {
        // Array is empty!
        return true;
    } else {
        // Array is not empty!
        return false;
    }
}

모든 공백 문자열 ( "")을 확인하려면 다음을 수행하십시오.

function isAllWhitespace(){
    if (valueToCheck.match(/^ *$/) !== null) {
        // Is all whitespaces!
        return true;
    } else {
        // Is not all whitespaces!
        return false;
    }
}

참고 : hasOwnProperty변수가 변수로 선언 된 경우 빈 문자열, 0, false, NaN, null 및 undefined에 대해 true를 반환하므로 사용하기에 가장 적합하지 않을 수 있습니다. 함수가 선언되었음을 나타 내기 위해 함수를 수정할 수 있지만 사용할 수는 없습니다.


2

GitHub의 코드

const isEmpty = value => (
  (!value && value !== 0 && value !== false)
  || (Array.isArray(value) && value.length === 0)
  || (isObject(value) && Object.keys(value).length === 0)
  || (typeof value.size === 'number' && value.size === 0)

  // `WeekMap.length` is supposed to exist!?
  || (typeof value.length === 'number'
      && typeof value !== 'function' && value.length === 0)
);

// Source: https://levelup.gitconnected.com/javascript-check-if-a-variable-is-an-object-and-nothing-else-not-an-array-a-set-etc-a3987ea08fd7
const isObject = value =>
  Object.prototype.toString.call(value) === '[object Object]';

가난한 사람의 시험 😁

const test = () => {
  const run = (label, values, expected) => {
    const length = values.length;
    console.group(`${label} (${length} tests)`);
    values.map((v, i) => {
      console.assert(isEmpty(v) === expected, `${i}: ${v}`);
    });
    console.groupEnd();
  };

  const empty = [
    null, undefined, NaN, '', {}, [],
    new Set(), new Set([]), new Map(), new Map([]),
  ];
  const notEmpty = [
    ' ', 'a', 0, 1, -1, false, true, {a: 1}, [0],
    new Set([0]), new Map([['a', 1]]),
    new WeakMap().set({}, 1),
    new Date(), /a/, new RegExp(), () => {},
  ];
  const shouldBeEmpty = [
    {undefined: undefined}, new Map([[]]),
  ];

  run('EMPTY', empty, true);
  run('NOT EMPTY', notEmpty, false);
  run('SHOULD BE EMPTY', shouldBeEmpty, true);
};

시험 결과:

EMPTY (10 tests)
NOT EMPTY (16 tests)
SHOULD BE EMPTY (2 tests)
  Assertion failed: 0: [object Object]
  Assertion failed: 1: [object Map]

좋은 기능, 여기에 다른 모든 답변은 당신이 주소로 나타나는 여러 문제를 가지고 나는 내 자신의 기록했던 전에, 난 그냥 그것을 발견 좋겠 : p는 당신이 내 작품에서 살펴 것 같아서 생각 stackoverflow.com/ 질문 / 5515310 /… 두 함수 모두 정확히 동일한 출력을 갖는 것으로 보이지만 코드를 약간 줄였습니다. 내가 놓친 부분이 있으면 알려주십시오.
Sean Bannister

👍 내 "가난한 사람의 시험"을 시도 했습니까? 필자는 Map, WeakMap 및 Date, RegExp와 같은 특수한 경우에 대해 더 많은 테스트를 추가했다고 생각합니다. 확실 value.constructor === Object합니까? 이것을 확인 하십시오 .
파스칼 Polleunus

예, 테스트를 실행했습니다. 덕분에 두 함수 모두 두 테스트에서 동일한 결과를 반환합니다. 이 테스트 케이스 이외의 것을 놓치고 있는지 궁금합니다. 나는 value.constructor === Object자바 스크립트 IF OR 문에 실행 순서가 있으므로 이전 문이 TRUE를 반환하지 않고 이미 검사 한 경우에만 OR 문이 실행되도록 괜찮습니다 Null. 실제로 마지막 OR 문의 유일한 목적은 감지 {}해서는 안되는 것들에 대해 TRUE를 반환하지 않도록 감지 하고 보장하는 것입니다.
Sean Bannister

1

불확정 중첩의 변수가 정의되어 있지 않은지 확인합니다.

function Undef(str) 
{
  var ary = str.split('.');
  var w = window;
  for (i in ary) {
    try      { if (typeof(w = w[ary[i]]) === "undefined") return true; }
    catch(e) { return true; }
  }
  return false;
}

if (!Undef("google.translate.TranslateElement")) {

위의 구글 번역 함수 TranslateElement가 존재하는지 확인합니다. 이것은 다음과 같습니다.

if (!(typeof google === "undefined" 
 || typeof google.translate === "undefined" 
 || typeof google.translate.TranslateElement === "undefined")) {

1

선택적 연결 연산자를 사용하면 참조 또는 함수가 정의되지 않았거나 null 일 수있는 경우 연결된 개체를 통해 값에 쉽게 액세스 할 수 있습니다.

let customer = {
  name: "Carl",
  details: {
    age: 82,
    location: "Paradise Falls" // detailed address is unknown
  }
};
let customerCity = customer.details?.address?.city;

null이없는 병합 연산자는 옵션 체인이 없으면 기본값이없는 경우 기본값을 만들기 위해 사용할 수 있습니다.

let customer = {
  name: "Carl",
  details: { age: 82 }
};
const customerCity = customer?.city ?? "Unknown city";
console.log(customerCity); // Unknown city

1
function notEmpty(value){
  return (typeof value !== 'undefined' && value.trim().length);
}

또한 다음과 함께 공백 ( '')을 검사합니다.

  • null, 정의되지 않음, NaN, 비어있는, 문자열 ( ""), 0, 거짓

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