四种常用类型判断方法

2020-12-29  本文已影响0人  A_dfa4

1. typeof

typeof []  //"object"
typeof {} "object"  
typeof null "object"

2.constructor 可以找到这个变量是谁构造出来的

[].constructor
// ƒ Array() { [native code] }
({}).constructor
//ƒ Object() { [native code] }

3.instanceof 判断谁是谁的实例 proto(不太准确)

4. Object.prototype.toString.call()

// 拿到对象原型的 toString方法把this 指向当前对象
缺点: 不能区分谁是谁的实例

Object.prototype.toString.call()
// "[object Undefined]"
Object.prototype.toString.call('')
// "[object String]"
Object.prototype.toString.call(1)
// "[object Number]"
Object.prototype.toString.call([])
// "[object Array]"
Object.prototype.toString.call({})
// "[object Object]"
Object.prototype.toString.call(null)
// "[object Null]"
Object.prototype.toString.call(NaN)
// "[object Number]"

例子: 实现一个功能判断变量类型

function isType (value, type) {
  return Object.prototype.toString.call(value) === `[object ${type}]`;
}
isType([], 'Array');

细分 实现

function isType (type) {
  return function (value) {
    return Object.prototype.toString.call(value) === `[object ${type}]`;
  }
};
let isArray =  isType('Array');
isArray('hello');  // false 
isArray([]);  // true
通过一个科里化函数 实现通用的科里化方法
function isType (type, value) {
  return Object.prototype.toString.call(value) === `[object ${type}]`;
};
const currying = (fn, arr = []) => {
  let len = fn.length;
  return function (...args) {  // 高阶函数
    arr = [...arr, ...args];
    if (arr.length < len) {
        return currying(fn, arr);  // 递归不停地产生函数
    } else {
      return fn(...arr);
    }
  }
}

let isArray = currying(isType)('Array');
let isString = currying(isType)('String');
console.log(isArray([]));
console.log(isArray('123'));

// 思路 比如实现这个
// function sum (a, b, c, d, e, f) {
//  return a + b + c +d + e + f
//}
// let r = currying(sum)(1,2)(3,4)(5)(6);

------- 我是没太明白最后一个 而且 有点问题...

------- 问题解决了 中间用变量存了一下

function isType (type, value) {
  return Object.prototype.toString.call(value) === `[object ${type}]`;
};
const currying = (fn, arr = []) => {
  let len = fn.length;
  return function (...args) {  // 高阶函数
    let concatValue = [...arr, ...args];
    if (concatValue.length < len) {
      return currying(fn, concatValue);  // 递归不停地产生函数
    } else {
      return fn(...concatValue);
    }
  }
}

let isArray = currying(isType)('Array');
//let isString = currying(isType)('String');
console.log(isArray([]));
console.log(isArray(123));
上一篇 下一篇

猜你喜欢

热点阅读