[关闭]
@lizlalala 2015-12-05T13:49:47.000000Z 字数 2275 阅读 891

codewars 2

codewars javascript


@(高程)[codewars]

problem 1

一、类型判断

总结来说
* step 1: obj.constructor.toString().match来判断
* step 2: null用===
* step 3: undefined用typeof

二、详细

1,JS类型判断总结
方法 内置基本类型 内置引用类型 自定义对象
typeof √(1) (2)
Object.prototype.toString
constructor √(3)
instanceof

* typeof:(1处)null除外,会把null识别为object,(2)处type能识别function类型,但不能识别其他任何对象类型。
* constructor:(3)处,null与undefined是无法判断的,因为他们没有构造函数。其他类型则是可以判断的,具体方法如下:

  1. function isTypeOf(input,typename)
  2. {
  3. return input &&input.constructor && input.constructor.toString().match(/function\s*(\w*)/)[1]==typename;
  4. }
  5. function getConstructorName(input)
  6. {
  7. return input.constructor.toString().match(/[A-Z]\w+/);
  8. }
  9. //!!需要注意的是,constructor判断Number类型时也有点问题,因为NaN会被认为是Number类型。因此还需要进一步判断
  10. function(input){return getConstructiorName(input,"Number") && !isNaN(input);}

举个栗子

  1. function hello(){}
  2. function Point(x, y) {
  3. this.x = x;
  4. this.y = y;
  5. }
  6. var p = new Point(1, 2);

那么nullundefined该怎么判断呢?

1.1 null
  1. //最简单的方法:===
  2. var value = null;
  3. value === null
  4. //方法二:
  5. function isNull()
  6. {return !exp && typeof exp != "undefined" && exp != 0}

1.2 undefined

用typeof去判断


回归正题
* prototype:不能识别自定义对象类型。具体方法:

  1. Object.prototype.toString.call(input).match(/[A-Z]\w+/)

因为

* instanceof:不能识别自定义对象类型。具体方法:

  1. p instanceof Point

三、codewars题目

  1. var typer = (function() {
  2. function getConstructiorName(input,typename)
  3. {
  4. return input &&input.constructor &&input.constructor.toString().match(/function\s*(\w*)/)[1]==typename;
  5. }
  6. return {
  7. isNumber: function(input){return getConstructiorName(input,"Number") && !isNaN(input);}, isNaNconstructor出来是Number.比如Number("h")
  8. isString: function(input){return getConstructiorName(input,"String");},
  9. isArray: function(input){return Array.isArray(input);},
  10. isFunction: function(input){return getConstructiorName(input,"Function");},
  11. isDate: function(input){return getConstructiorName(input,"Date");},
  12. isRegExp: function(input){return getConstructiorName(input,"RegExp");},
  13. isBoolean: function(input){return getConstructiorName(input,"Boolean");},
  14. isError: function(input){return getConstructiorName(input,"Error");},
  15. isNull: function(exp){return !exp && typeof exp != "undefined" && exp != 0},
  16. isUndefined: function(input){return typeof(input)=== "undefined";}
  17. };
  18. }(null));

problem 2

my solution

  1. function isIntArray(arr) {
  2. if(Array.isArray(arr)){
  3. if(arr.length==0) return true;
  4. if(arr.every(function(value){return Number.isInteger(value);})) return true;
  5. }
  6. return false;
  7. }

good solution

总结:

判断integer方法
1,Number.isInteger()
2,Math.floor(x)===x

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注