var toStr1 = Function.prototype.call.bind(Object.prototype.toString);
我们调用看看,传入不同的类型试试,效果如下:
console.log(toStr1({})); // "[object Object]"
console.log(toStr1([])); // "[object Array]"
console.log(toStr1(123)); // "[object Number]"
console.log(toStr1("abc")); // "[object String]"
console.log(toStr1("abc")); // "[object String]"
console.log(toStr1(new Date));// "[object Date]"
通常类型检测,我们可能更多地看到如下代码实现:
var toStr2 = obj => Object.prototype.toString.call(obj);
console.log(toStr2({})); // "[object Object]"
console.log(toStr2([])); // "[object Array]"
console.log(toStr2(123)); // "[object Number]"
console.log(toStr2("abc")); // "[object String]"
console.log(toStr2("abc")); // "[object String]"
console.log(toStr2(new Date));// "[object Date]"
为了防止原型污染,比如我们在业务代码中覆写了Object.prototype.toString方法,
第二种写法将得不到正确的结果,而第一种写法仍然可以。我们用代码来来试试:
var toStr1 = Function.prototype.call.bind(Object.prototype.toString);
var toStr2 = obj => Object.prototype.toString.call(obj);
Object.prototype.toString = function(){
return'toString方法被覆盖!';
}
// 接着我们再调用上述方法
// toStr1调用结果如下:
console.log(toStr1({})); // "[object Object]"
console.log(toStr1([])); // "[object Array]"
console.log(toStr1(123)); // "[object Number]"
console.log(toStr1("abc")); // "[object String]"
console.log(toStr1("abc")); // "[object String]"
console.log(toStr1(new Date));// "[object Date]"
// toStr2调用结果如下:
console.log(toStr2({})); // "toString方法被覆盖!"
console.log(toStr2([])); // "toString方法被覆盖!"
console.log(toStr2(123)); // "toString方法被覆盖!"
console.log(toStr2("abc")); // "toString方法被覆盖!"
console.log(toStr2("abc")); // "toString方法被覆盖!"
console.log(toStr2(new Date));// "toString方法被覆盖!"