@lizlalala
2015-12-05T21:49:47.000000Z
字数 2275
阅读 1204
codewars
javascript
@(高程)[codewars]
总结来说:
* step 1: obj.constructor.toString().match来判断
* step 2: null用===
* step 3: undefined用typeof
方法 | 内置基本类型 | 内置引用类型 | 自定义对象 |
---|---|---|---|
typeof | √(1) | (2) | |
Object.prototype.toString | √ | √ | |
constructor | √(3) | √ | √ |
instanceof | √ | √ |
* typeof:(1处)null除外,会把null识别为object,(2)处type能识别function类型,但不能识别其他任何对象类型。
* constructor:(3)处,null与undefined是无法判断的,因为他们没有构造函数。其他类型则是可以判断的,具体方法如下:
function isTypeOf(input,typename)
{
return input &&input.constructor && input.constructor.toString().match(/function\s*(\w*)/)[1]==typename;
}
function getConstructorName(input)
{
return input.constructor.toString().match(/[A-Z]\w+/);
}
//!!需要注意的是,constructor判断Number类型时也有点问题,因为NaN会被认为是Number类型。因此还需要进一步判断
function(input){return getConstructiorName(input,"Number") && !isNaN(input);}
举个栗子
function hello(){}
function Point(x, y) {
this.x = x;
this.y = y;
}
var p = new Point(1, 2);
那么null与undefined该怎么判断呢?
//最简单的方法:===
var value = null;
value === null
//方法二:
function isNull()
{return !exp && typeof exp != "undefined" && exp != 0}
用typeof去判断
回归正题
* prototype:不能识别自定义对象类型。具体方法:
Object.prototype.toString.call(input).match(/[A-Z]\w+/)
因为
* instanceof:不能识别自定义对象类型。具体方法:
p instanceof Point
var typer = (function() {
function getConstructiorName(input,typename)
{
return input &&input.constructor &&input.constructor.toString().match(/function\s*(\w*)/)[1]==typename;
}
return {
isNumber: function(input){return getConstructiorName(input,"Number") && !isNaN(input);}, isNaN的constructor出来是Number.比如Number("h")
isString: function(input){return getConstructiorName(input,"String");},
isArray: function(input){return Array.isArray(input);},
isFunction: function(input){return getConstructiorName(input,"Function");},
isDate: function(input){return getConstructiorName(input,"Date");},
isRegExp: function(input){return getConstructiorName(input,"RegExp");},
isBoolean: function(input){return getConstructiorName(input,"Boolean");},
isError: function(input){return getConstructiorName(input,"Error");},
isNull: function(exp){return !exp && typeof exp != "undefined" && exp != 0},
isUndefined: function(input){return typeof(input)=== "undefined";}
};
}(null));
function isIntArray(arr) {
if(Array.isArray(arr)){
if(arr.length==0) return true;
if(arr.every(function(value){return Number.isInteger(value);})) return true;
}
return false;
}
判断integer方法
1,Number.isInteger()
2,Math.floor(x)===x