물체가 날짜인지 확인하는 방법?
웹 페이지에 성가신 버그가 있습니다.
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 : 각각의 구현을 살펴볼 가치가 있습니다.
내가 찾은 가장 좋은 방법은 다음과 같습니다.
!isNaN(Date.parse("some date test"))
//
!isNaN(Date.parse("22/05/2001")) // true
!isNaN(Date.parse("blabla")) // false
Date 객체와 관련된 기능이 있는지 확인할 수 있습니다.
function getFormatedDate(date) {
if (date.getMonth) {
var month = date.getMonth();
}
}
또한 짧은 형식을 사용할 수 있습니다
function getClass(obj) {
return {}.toString.call(obj).slice(8, -1);
}
alert( getClass(new Date) ); //Date
또는 이와 같은 것 :
(toString.call(date)) == 'Date'
나는 훨씬 간단한 방법을 사용했지만 이것이 ES6에서만 사용할 수 있는지 확실하지 않습니다.
let a = {name: "a", age: 1, date: new Date("1/2/2017"), arr: [], obj: {} };
console.log(a.name.constructor.name); // "String"
console.log(a.age.constructor.name); // "Number"
console.log(a.date.constructor.name); // "Date"
console.log(a.arr.constructor.name); // "Array"
console.log(a.obj.constructor.name); // "Object"
그러나 생성자가 없으므로 null 또는 undefined에서는 작동하지 않습니다.
이 함수는 true
날짜 또는 false
다른 경우 반환 됩니다 .
function isDate(myDate) {
return myDate.constructor.toString().indexOf("Date") > -1;
}
모든 해결 방법 대신 다음을 사용할 수 있습니다.
dateVariable = new Date(date);
if (dateVariable == 'Invalid Date') console.log('Invalid Date!');
나는이 핵을 더 잘 발견했다!
실제로 날짜는 유형 Object
입니다. 그러나 객체에 getMonth
메소드가 있고 호출 가능한지 확인할 수 있습니다 .
function getFormatedDate(date) {
if (date && date.getMonth && date.getMonth.call) {
var month = date.getMonth();
}
}
또 다른 변형 :
Date.prototype.isPrototypeOf(myDateObject)
try / catch를 사용하는 접근법
function getFormatedDate(date = new Date()) {
try {
date.toISOString();
} catch (e) {
date = new Date();
}
return date;
}
console.log(getFormatedDate());
console.log(getFormatedDate('AAAA'));
console.log(getFormatedDate(new Date('AAAA')));
console.log(getFormatedDate(new Date(2018, 2, 10)));
당신은 단지 사용할 수 없습니다
function getFormatedDate(date) {
if (date.isValid()) {
var month = date.GetMonth();
}
}
참고 URL : https://stackoverflow.com/questions/643782/how-to-check-whether-an-object-is-a-date
'Programing' 카테고리의 다른 글
Bash에서 해시 테이블을 정의하는 방법은 무엇입니까? (0) | 2020.02.12 |
---|---|
.NET에서 두 바이트 배열 비교 (0) | 2020.02.12 |
내용에 맞게 UITextView의 크기를 어떻게 조정합니까? (0) | 2020.02.12 |
event.layerX 및 event.layerY와 관련된 WebKit 문제 (0) | 2020.02.12 |
InvariantCulture와 서수 문자열 비교의 차이점 (0) | 2020.02.12 |