获得Javascript变量类型的更好方法?

2020/10/09 00:41 · javascript ·  · 0评论

是否有比JS中更好的获取变量类型的方法typeof当您这样做时,它可以正常工作:

> typeof 1
"number"
> typeof "hello"
"string"

但是,当您尝试以下操作时,它是没有用的:

> typeof [1,2]
"object"
>r = new RegExp(/./)
/./
> typeof r
"function"

我知道instanceof,但这需要您事先知道类型。

> [1,2] instanceof Array
true
> r instanceof RegExp
true

有没有更好的办法?

Angus Croll最近写了一篇有趣的博客文章-

http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/

他介绍了各种方法的优缺点,然后定义了一个新方法“ toType”-

var toType = function(obj) {
  return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
}

您可以尝试使用constructor.name

[].constructor.name
new RegExp().constructor.name

与所有JavaScript一样,最终人们总是会指出这在某种程度上是邪恶的,因此,这里有一个答案的链接,涵盖了这一方面。

替代方法是使用 Object.prototype.toString.call

Object.prototype.toString.call([])
Object.prototype.toString.call(/./)

一个不错的类型捕获功能是YUI3使用的功能

var TYPES = {
    'undefined'        : 'undefined',
    'number'           : 'number',
    'boolean'          : 'boolean',
    'string'           : 'string',
    '[object Function]': 'function',
    '[object RegExp]'  : 'regexp',
    '[object Array]'   : 'array',
    '[object Date]'    : 'date',
    '[object Error]'   : 'error'
},
TOSTRING = Object.prototype.toString;

function type(o) {
    return TYPES[typeof o] || TYPES[TOSTRING.call(o)] || (o ? 'object' : 'null');
};

这捕获了javascript提供的许多原语,但是您始终可以通过修改TYPES对象来添加更多原语请注意,typeof HTMLElementCollection在Safari中将报告function,但type(HTMLElementCollection)将返回object

您可能会发现以下功能有用:

function typeOf(obj) {
  return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}

或在ES7中(如果有进一步改进,请评论)

function typeOf(obj) {
  const { toString } = Object.prototype;
  const stringified = obj::toString();
  const type = stringified.split(' ')[1].slice(0, -1);

  return type.toLowerCase();
}

结果:

typeOf(); //undefined
typeOf(null); //null
typeOf(NaN); //number
typeOf(5); //number
typeOf({}); //object
typeOf([]); //array
typeOf(''); //string
typeOf(function () {}); //function
typeOf(/a/) //regexp
typeOf(new Date()) //date
typeOf(new Error) //error
typeOf(Promise.resolve()) //promise
typeOf(function *() {}) //generatorfunction
typeOf(new WeakMap()) //weakmap
typeOf(new Map()) //map

感谢@johnrees通知我:错误,承诺,生成器功能

我们也可以从ipr101更改一个小例子

Object.prototype.toType = function() {
  return ({}).toString.call(this).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
}

并称为

"aaa".toType(); // 'string'

一线功能:

function type(obj) {
    return Object.prototype.toString.call(obj).replace(/^\[object (.+)\]$/,"$1").toLowerCase()
}

这给出了与 jQuery.type()

您可以应用于Object.prototype.toString任何对象:

var toString = Object.prototype.toString;

console.log(toString.call([]));
//-> [object Array]

console.log(toString.call(/reg/g));
//-> [object RegExp]

console.log(toString.call({}));
//-> [object Object]

除IE以外,这在所有浏览器中均能很好地工作-在从另一个窗口获取的变量上调用它时,它只会吐出[object Object]

我的2美分!确实,尽管答案很长,但我在这里提出这个问题的部分原因是为了提供更多all in one类型的解决方案,并在将来获得一些反馈,以了解如何扩展它以包含更多内容real types

如上所述,使用以下解决方案,我结合了这里找到的几个解决方案,并结合了一个修复程序修复程序用于返回jQueryjQuery定义的对象(如果有)的值我还将方法附加到本机Object原型。我知道这通常是禁忌,因为它可能会干扰其他此类扩展,但我将其留给了user beware如果您不喜欢这种方式,只需将基本函数复制到您喜欢的任何位置,然后将所有的变量替换为this要传递的参数参数(例如arguments [0])。

;(function() {  //  Object.realType
    function realType(toLower) {
        var r = typeof this;
        try {
            if (window.hasOwnProperty('jQuery') && this.constructor && this.constructor == jQuery) r = 'jQuery';
            else r = this.constructor && this.constructor.name ? this.constructor.name : Object.prototype.toString.call(this).slice(8, -1);
        }
        catch(e) { if (this['toString']) r = this.toString().slice(8, -1); }
        return !toLower ? r : r.toLowerCase();
    }
    Object['defineProperty'] && !Object.prototype.hasOwnProperty('realType')
        ? Object.defineProperty(Object.prototype, 'realType', { value: realType }) : Object.prototype['realType'] = realType;
})();

然后只需轻松使用即可,如下所示:

obj.realType()  //  would return 'Object'
obj.realType(true)  //  would return 'object'

注意:有1个参数可传递。如果是布尔值true,则返回值始终为小写

更多示例:

true.realType();                            //  "Boolean"
var a = 4; a.realType();                    //  "Number"
$('div:first').realType();                   // "jQuery"
document.createElement('div').realType()    //  "HTMLDivElement"

如果您有什么补充可能对您有所帮助,例如定义何时使用其他库(Moo,Proto,Yui,Dojo等...)创建对象,请随时进行注释或编辑,并将其保持下去准确而精确。或滚动到GitHub我为此所做的事情,并让我知道。您还可以在此处找到指向CDN分钟文件的快速链接。

function getType(obj) {
    if(obj && obj.constructor && obj.constructor.name) {
        return obj.constructor.name;
    }
    return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
}

在我的初步测试中,这工作得很好。第一种情况将打印使用“ new”创建的任何对象的名称,第二种情况应捕获其他所有内容。

我正在使用,(8, -1)因为我假设结果总是以开头[object和结尾,]但是我不确定在每种情况下都是如此。

我想这里最普遍的解决方案-是检查undefinednull第一次,然后就打电话constructor.name.toLowerCase()

const getType = v =>
  v === undefined
    ? 'undefined'
    : v === null
      ? 'null'
      : v.constructor.name.toLowerCase();




console.log(getType(undefined)); // 'undefined'
console.log(getType(null)); // 'null'
console.log(getType('')); // 'string'
console.log(getType([])); // 'array'
console.log(getType({})); // 'object'
console.log(getType(new Set())); // `set'
console.log(getType(Promise.resolve())); // `promise'
console.log(getType(new Map())); // `map'

typeof condition用于检查变量类型,如果您在if-else条件下检查变量类型,例如

if(typeof Varaible_Name "undefined")
{

}
本文地址:http://javascript.askforanswer.com/huodejavascriptbianliangleixingdegenghaofangfa.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!