gpt4 book ai didi

javascript - 使用 Object.prototype.toString() 对内置类型进行一般类型检查

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:00:33 25 4
gpt4 key购买 nike

我想知道使用 Object.prototype.toString() 对内置类型进行一般类型检查是否合适。我有一个看起来像这样的函数:

// Return the built-in type of an object.
var typeOf = (function() {
var reType = /\[object (\w+)\]/;
return function typeOf(obj) {
return reType.exec(Object.prototype.toString.call(obj))[1];
};
})();

对该函数的调用返回以下结果:

console.log( typeOf(null) );         // => Null
console.log( typeOf(undefined) ); // => Undefined
console.log( typeOf([]) ); // => Array
console.log( typeOf(true) ); // => Boolean
console.log( typeOf(new Date()) ); // => Date
console.log( typeOf(new Error()) ); // => Error
console.log( typeOf(function(){}) ); // => Function
console.log( typeOf(1) ); // => Number
console.log( typeOf({}) ); // => Object
console.log( typeOf(/ /) ); // => RegExp
console.log( typeOf("") ); // => String

除了它可能比其他形式的类型检查慢之外,这是可以接受的吗?

我问的原因之一是因为我想为我正在处理的项目编码和序列化对象的内置类型。我正在考虑将返回的类型传递给返回数字代码的函数:

// Encode a built-in type as a number.
var encodeType = (function() {
var types = {
'Null': 0,
'Undefined': 1,
'Array': 2,
'Boolean': 3,
'Date': 4,
'Error': 5,
'Function': 6,
'Number': 7,
'Object': 8,
'RegExp': 9,
'String': 10,
'Arguments': 11,
'Math': 12,
'JSON': 13
};
return function encodeType(type) {
return types[type];
}
})();

所以输出变成:

console.log(encodeType( typeOf(null) ));         // => 0
console.log(encodeType( typeOf(undefined) )); // => 1
console.log(encodeType( typeOf([]) )); // => 2
console.log(encodeType( typeOf(true) )); // => 3
console.log(encodeType( typeOf(new Date()) )); // => 4
console.log(encodeType( typeOf(new Error()) )); // => 5
console.log(encodeType( typeOf(function(){}) )); // => 6
console.log(encodeType( typeOf(1) )); // => 7
console.log(encodeType( typeOf({}) )); // => 8
console.log(encodeType( typeOf(/ /) )); // => 9
console.log(encodeType( typeOf("") )); // => 10

这种类型检查有什么缺陷吗?感谢您提供任何见解。

最佳答案

这里是 underscore.js'实现:

  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
_.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
_['is' + name] = function(obj) {
return toString.call(obj) === '[object ' + name + ']';
};
});

所以是的,这个方法很好用。

附言toString是上述代码中Object.prototype.toString的简写。

关于javascript - 使用 Object.prototype.toString() 对内置类型进行一般类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26594706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com