[javascript] 물체가 날짜인지 확인하는 방법?

웹 페이지에 성가신 버그가 있습니다.

date.GetMonth ()는 함수가 아닙니다

그래서 내가 잘못하고 있다고 생각합니다. 변수 date가 유형의 객체가 아닙니다 Date. Javascript에서 데이터 유형을 확인하려면 어떻게합니까? 을 추가하려고 시도했지만 if (date)작동하지 않습니다.

function getFormatedDate(date) {
    if (date) {
       var month = date.GetMonth();
    }
}

따라서 방어 코드를 작성하고 날짜가 아닌 날짜를 지정하지 않으려면 어떻게해야합니까?

감사!

업데이트 : 날짜 형식을 확인하고 싶지 않지만 메소드에 전달 된 매개 변수 getFormatedDate()가 유형 인지 확인하고 싶습니다 Date.



답변

통해 오리 타이핑의 대안으로

typeof date.getMonth === 'function'

instanceof연산자 를 사용할 수 있습니다. 즉, 유효하지 않은 날짜에 대해서도 true를 반환합니다. 예 new Date('random_string')를 들어 Date의 인스턴스이기도합니다.

date instanceof Date

객체가 프레임 경계를 통과하면 실패합니다.

이에 대한 해결 방법은 다음을 통해 객체의 클래스를 확인하는 것입니다.

Object.prototype.toString.call(date) === '[object Date]'


답변

다음 코드를 사용할 수 있습니다 :

(myvar instanceof Date) // returns true or false


답변

값이 표준 JS-date 오브젝트의 유효한 유형인지 확인하기 위해이 술어를 사용할 수 있습니다.

function isValidDate(date) {
  return date && Object.prototype.toString.call(date) === "[object Date]" && !isNaN(date);
}
  1. date파라미터가 아니 었는지 체크 falsy 값 ( undefined, null, 0, "", 등 ..)
  2. Object.prototype.toString.call(date)주어진 객체 유형의 네이티브 문자열 표현 을 반환합니다 "[object Date]". 때문에 date.toString()우선은 부모 방법 , 우리는 필요 .call또는 .apply에서 방법을 Object.prototype직접하는 ..
  3. !isNaN(date)마지막으로 값이 아닌지 여부를 확인합니다 Invalid Date.

답변

기능은 getMonth()아닙니다 GetMonth().

어쨌든, 이것을 수행하여 객체에 getMonth 속성이 있는지 확인할 수 있습니다. 반드시 객체가 Date임을 의미하는 것은 아니며 getMonth 속성을 가진 모든 객체입니다.

if (date.getMonth) {
    var month = date.getMonth();
}


답변

위에 표시된 것처럼 함수를 사용하기 전에 함수가 있는지 확인하는 것이 가장 쉬운 방법 일 것입니다. 함수가 Date있는 객체가 아니라 a 인 경우 실제로 getMonth()다음을 시도하십시오.

function isValidDate(value) {
    var dateWrapper = new Date(value);
    return !isNaN(dateWrapper.getDate());
}

이 경우 값의 복제본을 Date만들거나 유효하지 않은 날짜를 만듭니다. 그런 다음 새 날짜 값이 유효하지 않은지 확인할 수 있습니다.


답변

모든 유형에 대해 Object 프로토 타입 함수를 준비했습니다. 그것은 당신에게 유용 할 수 있습니다

Object.prototype.typof = function(chkType){
      var inp        = String(this.constructor),
          customObj  = (inp.split(/\({1}/))[0].replace(/^\n/,'').substr(9),
          regularObj = Object.prototype.toString.apply(this),
          thisType   = regularObj.toLowerCase()
                        .match(new RegExp(customObj.toLowerCase()))
                       ? regularObj : '[object '+customObj+']';
     return chkType
            ? thisType.toLowerCase().match(chkType.toLowerCase())
               ? true : false
            : thisType;
}

이제 확인할 수 있습니다 있는 이런 종류 :

var myDate     = new Date().toString(),
    myRealDate = new Date();
if (myRealDate.typof('Date')) { /* do things */ }
alert( myDate.typof() ); //=> String

진행중인 통찰력을 기반으로 [ 2013 년 3 월 편집 ]이 더 나은 방법입니다.

Object.prototype.is = function() {
        var test = arguments.length ? [].slice.call(arguments) : null
           ,self = this.constructor;
        return test ? !!(test.filter(function(a){return a === self}).length)
               : (this.constructor.name ||
                  (String(self).match ( /^function\s*([^\s(]+)/im)
                    || [0,'ANONYMOUS_CONSTRUCTOR']) [1] );
}
// usage
var Some = function(){ /* ... */}
   ,Other = function(){ /* ... */}
   ,some = new Some;
2..is(String,Function,RegExp);        //=> false
2..is(String,Function,Number,RegExp); //=> true
'hello'.is(String);                   //=> true
'hello'.is();                         //-> String
/[a-z]/i.is();                        //-> RegExp
some.is();                            //=> 'ANONYMOUS_CONSTRUCTOR'
some.is(Other);                       //=> false
some.is(Some);                        //=> true
// note: you can't use this for NaN (NaN === Number)
(+'ab2').is(Number);                 //=> true


답변

UnderscoreJSLodash 에는 .isDate()정확히 필요한 것으로 보이는 함수 가 있습니다. Lodash isDate , UnderscoreJs : 각각의 구현을 살펴볼 가치가 있습니다.