如果一个人调用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实现不同而失败?或者因为其他原因而失败?
答案 0 :(得分:2)
根据specifications at MDN,所有浏览器都完全支持Object.prototype.toString
,因此这应该始终如一。
我想指出的是,仅检测array
和object
之间的差异会将结果区分为仅使用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]