JavaScript中是否有一个函数返回传递给它的类型名称的默认值?例如:
var defaultValue = built_in_getDefaultValue("number");
console.log(defaultValue); // Logs the number 0 to the console.
答案 0 :(得分:7)
两个答案都正确地指出JavaScript中变量的默认(未分配)值是undefined
,但是它们都没有解决您似乎要查找的内容 - 相当于例如C#中的default
运算符。
幸运的是,JavaScript有一个非常简单的类型系统:所有不是六种基本类型之一的东西(ES5中的五种)都是一个对象,可以通过它的构造函数来调用。给定一个表示
的字符串的以下函数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中变量的默认值为null
或undefined
。
出于学习目的,我从WikiBooks JavaScript/Variables and Types获取了这个:
变量通常由var语句显式声明,如 如下所示:
var c;
创建了上述变量,但其默认值为
undefined
。 为了有价值,需要初始化变量:var c = 0;
声明后,可以为变量分配一个新值 将取代旧的:
c = 1;
但请确保在之前(或while)声明一个带变量的变量 分配给它;否则你会创建一个“范围错误。”
现在,当您问为什么值不是0
时,这是因为,即使null
或undefined
是未定义的值。未定义与定义和清空不同。当声明值并且未定义时,它可能返回0
。
答案 2 :(得分:-1)
javascript中任何变量的默认值为undefined
。您也可以将其作为
var defaultValue = void 0;