问题:判断s的类型是不是字符串
var s = "123";
//我自己的思路
alert(typeof s);
//我在论坛上看到的某大神的思路
alert(Object.prototype.toString.call(s));
那么问题来了,这两种方式有什么区别和各自的优缺点呢?求大神解答!
var a = null;
console.log(typeof a); //object
console.log(Object.prototype.toString.call(a)); // [object Null]
var a = {};
console.log(typeof a); //object
console.log(Object.prototype.toString.call(a)); // [object Object]
可以把代码copy到控制台输出一遍看看结果
可见给a赋予不同的数据类型,
typeof检测a的数据类型始终得出object,
Object.prototype.toString.call()则得出不一样的结果,
说明typeof检测数据类型存在缺陷,
在某些情况下会不能正确检测。
至于为什么使用Object.prototype.toString.call(),自行谷歌百度了解去吧
Object.prototype.toString.call()
是对象的方法,调用的时候会先调用构造函数 new Object()
,故可以分辨出引用类型;
var x = 'a string'; // 所有基础类型(String, Number, Boolean)都可以不通过构造函数生成。
var y = []; // 非基础类型(引用类型),调用构造函数生成的。
console.log(x instanceof String); // false
console.log(y instanceof Array); // true
x2 = new Object(x);
console.log(x2 instanceof String); //true
而 typeof
只能辨别出基础类型(6种)。
typeof 认为'str'是字符串而new String('str')不是字符串
Object.prototype.toString 认为上面两个都是字符串