웹 페이지에 성가신 버그가 있습니다.
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);
}
date
파라미터가 아니 었는지 체크 falsy 값 (undefined
,null
,0
,""
, 등 ..)Object.prototype.toString.call(date)
주어진 객체 유형의 네이티브 문자열 표현 을 반환합니다"[object Date]"
. 때문에date.toString()
우선은 부모 방법 , 우리는 필요.call
또는.apply
에서 방법을Object.prototype
직접하는 ..- 동일한 생성자 이름으로 사용자 정의 개체 유형을 무시합니다 (예 : “Date”)
- 또는 과 달리
instanceof
다른 JS 컨텍스트 (예 : iframe)에서 작동Date.prototype.isPrototypeOf
합니다.
!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
답변
UnderscoreJS 와 Lodash 에는 .isDate()
정확히 필요한 것으로 보이는 함수 가 있습니다. Lodash isDate , UnderscoreJs : 각각의 구현을 살펴볼 가치가 있습니다.