验证js数据类型(附带深拷贝函数,超级好用喔!!!)

Object.prototype.toString大法

直接硬货代码伺候各位看官:

function getType(obj) {
  return Object.prototype.toString.call(obj).match(/\[object ([a-zA-Z]*)\]/)[1];
}
getType(11) // 'Number'
getType('str') // 'String'
getType(true) // 'Boolean'
getType(null) // 'Null'
getType(undefined) // 'Undefined'
getType(Symbol()) // 'Symbol'
getType([1,2,3]) // 'Array'
getType({obj: 'obj'}) // 'Object'

虽然代码应该还是很容易看懂的,小弟粗略还是分(cou)析(xia)一(zi)波(shu)吧:

  1. 使用Object.prototype.toString.call(obj) 得出字符串。比如'[object String]'
  2. 通过正则 
    /\[object ([a-zA-Z]*)\]/
     取出最重要的数据类型‘String’。 (注:如果看不懂正则,可以小补一波喔)
  3. 然后就可以进行日常判断操作了!!!

 

下面来一个比较高级的写法

直接上代码:

const isType = type => obj => Object.prototype.toString.call(obj).match(/\[object ([a-zA-Z]*)\]/)[1] === type;

isType('String')('123');		// true
isType('Array')([1, 2, 3]);	    // true
isType('Number')(123);			// true

老样子,还是分(cou)析(xia)一(zi)波(shu)吧:

  1. 首先这段代码基本上和上面那一段差不多,也是利用原来套路取出数据类型对应的字符串。
  2. 然后这里可能会比较难理解的就是 type => obj => …… 这个是es6简写的形式,来一个原版应该就明白了
    var isType = function(type) {
        return function(obj) {
            return Object.prototype.toString.call(obj).match(/\[object ([a-zA-Z]*)\]/)[1] === type;
        }
    } 
  3. 然后使用方式就是
    var isNumber = isType('Number');
    isNumber(11); // true
    // 深拷贝中使用
    function deepClone (obj) {
         let newObj;
         if (isType('Array')(obj)) {
             newObj = []	
             for(let i = 0; i < obj.length;i++) {
                 newObj.push(deepClone(obj[i]));
             }
         } else if (isType('Object')(obj)) {
             newObj = {};
              for (let k in obj) {
                  newObj[k] = deepClone(obj[k])
              }
         } else {
              return obj;
         }
         return newObj;
    }

     

  4. 看懂了的话,不妨在实际应用中使用哈!

 

最后,仅供参考,请各位大佬多多指点不足之处。谢谢!

你可能感兴趣的:(前端开发)