JavaScript:可以使用“Object.prototype.toString.call(obj)”进行数据类型检测吗?

时间:2016-07-06 10:56:19

标签: javascript

如果一个人调用Object的toString-method和call(用于更改上下文),则返回一个字符串。该字符串包含要调用的值的数据类型。

var obj = {};
var field = [];
var str = 'abc';
var num = 3;
var reg = /.*/;
var bool = true;
var notANumber = NaN;
var undef = undefined;

console.log(Object.prototype.toString.call(obj)); // [object Object]
console.log(Object.prototype.toString.call(field)); // [object Array]
console.log(Object.prototype.toString.call(str)); // [object String]
console.log(Object.prototype.toString.call(num)); // [object Number]
console.log(Object.prototype.toString.call(reg)); // [object RegExp]
console.log(Object.prototype.toString.call(bool)); // [object Boolean]
console.log(Object.prototype.toString.call(notANumber)); // [object Number]
console.log(Object.prototype.toString.call(undefined)); // [object Undefined]

我可以从我的修修补补说明:除了通常的JavaScript怪异(NaN是数字)之外,它似乎工作正常。

现在我问自己:

如果我使用.split(/ \ s /)等创建函数,将数据类型作为字符串返回,那么我可以将其用于类型检测。

但是是什么让我不信任:

我从未见过程序员以这种方式使用Object.prototype.toString.call构造。他们使用typeof或寻找某些方法......

所以我的问题是:

上述功能会按预期工作吗?

或者因为浏览器中的JavaScript实现不同而失败?或者因为其他原因而失败?

1 个答案:

答案 0 :(得分:2)

根据specifications at MDN,所有浏览器都完全支持Object.prototype.toString,因此这应该始终如一。

我想指出的是,仅检测arrayobject之间的差异会将结果区分为仅使用typeof

编辑1

reg变量也会检测为object

var obj = {};
var field = [];
var str = 'abc';
var num = 3;
var reg = /.*/;
var bool = true;
var notANumber = NaN;
var undef = undefined;

console.log(typeof obj); // object
console.log(typeof field); // object
console.log(typeof str); // string
console.log(typeof num); // number
console.log(typeof reg); // object
console.log(typeof bool); // boolean
console.log(typeof notANumber); // number
console.log(typeof undefined); // undefined
//Data from original post:
console.log(Object.prototype.toString.call(obj)); // [object Object]
console.log(Object.prototype.toString.call(field)); // [object Array]
console.log(Object.prototype.toString.call(str)); // [object String]
console.log(Object.prototype.toString.call(num)); // [object Number]
console.log(Object.prototype.toString.call(reg)); // [object RegExp]
console.log(Object.prototype.toString.call(bool)); // [object Boolean]
console.log(Object.prototype.toString.call(notANumber)); // [object Number]
console.log(Object.prototype.toString.call(undefined)); // [object Undefined]