javascript中类型的默认值

时间:2013-01-30 11:38:13

标签: javascript types default-value

JavaScript中是否有一个函数返回传递给它的类型名称的默认值?例如:

var defaultValue = built_in_getDefaultValue("number");
console.log(defaultValue); // Logs the number 0 to the console.

3 个答案:

答案 0 :(得分:7)

两个答案都正确地指出JavaScript中变量的默认(未分配)值是undefined,但是它们都没有解决您似乎要查找的内容 - 相当于例如C#中的default运算符。

幸运的是,JavaScript有一个非常简单的类型系统:所有不是六种基本类型之一的东西(ES5中的五种)都是一个对象,可以通过它的构造函数来调用。给定一个表示

的字符串的以下函数
  • JS原语的名称;
  • typeof运算符的任何有效生成;或
  • 函数名称,在其调用的this值或其本地范围¹

将对“默认”值产生合理解释:

function defaultVal(type) {
    if (typeof type !== 'string') throw new TypeError('Type must be a string.');

    // Handle simple types (primitives and plain function/object)
    switch (type) {
        case 'boolean'   : return false;
        case 'function'  : return function () {};
        case 'null'      : return null;
        case 'number'    : return 0;
        case 'object'    : return {};
        case 'string'    : return "";
        case 'symbol'    : return Symbol();
        case 'undefined' : return void 0;
    }

    try {
        // Look for constructor in this or current scope
        var ctor = typeof this[type] === 'function'
                   ? this[type]
                   : eval(type);

        return new ctor;

    // Constructor not found, return new object
    } catch (e) { return {}; }
}

您可以这样称呼它:

defaultVal( typeof 1 ); // -> 0
defaultVal( 'number' ); // -> 0
defaultVal( 'object' ); // -> {}
defaultVal( 'RegExp' ); // -> /(?:)/

不幸的是,JS typeof运算符对于我们的目的可能有点......反复无常。例如,typeof null === 'object'typeof [] === 'object',可能不是您想要的。

要解决此问题,这是一个函数,它返回在值上调用typeof的结果,除非结果为'object',在这种情况下它将返回{{1}如果值为'null',则为null,如果其他所有操作都失败,则为obj.constructor.name作为后备值):

'object'

现在我们可以:

function getType(obj) {
    var type = typeof obj;

    if (type !== 'object') return type; // primitive or function
    if (obj === null) return 'null';    // null

    // Everything else, check for a constructor
    var ctor = obj.constructor;
    var name = typeof ctor === 'function' && ctor.name;

    return typeof name === 'string' && name.length > 0 ? name : 'object';
}

我怀疑这与你想要得到的一样接近。另外,要避免任何批评:上面使用eval可能看起来有点脏,但这是从当前范围获取命名值的唯一方法。


¹此函数无法调用在另一个范围内实例化的构造函数;相反,我已经可以调用它defaultVal( getType( 1234 ) ); // -> 0 defaultVal( getType( [99] ) ); // -> [] defaultVal( getType( 'ab' ) ); // -> "" defaultVal( getType( null ) ); // -> null (Not possible with typeof!) defaultVal( getType( /.*/ ) ); // -> /(?:)/ (Not possible with typeof!) function T () {} defaultVal( getType( new T ) ); // -> T {} (Not possible with typeof!) 绑定到一个对象,该对象包含它可能引用的任何此类构造函数:

this

如果你不这样做,它将回退到返回一个新对象。

答案 1 :(得分:0)

我不明白为什么你会问这样的问题。无论如何,JavaScript中变量的默认值为nullundefined

出于学习目的,我从WikiBooks JavaScript/Variables and Types获取了这个:

  

变量通常由var语句显式声明,如   如下所示:

var c;
     

创建了上述变量,但其默认值为undefined。   为了有价值,需要初始化变量:

var c = 0;
     

声明后,可以为变量分配一个新值   将取代旧的:

c = 1;
     

但请确保在之前(或while)声明一个带变量的变量   分配给它;否则你会创建一个“范围错误。”

现在,当您问为什么值不是0时,这是因为,即使nullundefined是未定义的值。未定义与定义和清空不同。当声明值并且未定义时,它可能返回0

答案 2 :(得分:-1)

javascript中任何变量的默认值为undefined。您也可以将其作为

var defaultValue = void 0;