Значение по умолчанию для типа в JavaScript
Есть ли в JavaScript функция, которая возвращает значение по умолчанию для имени типа, которое передается ей? Например:
var defaultValue = built_in_getDefaultValue("number");
console.log(defaultValue); // Logs the number 0 to the console.
3 ответа
Оба ответа правильно отмечают, что значение переменной по умолчанию (неназначенное) в JavaScript undefined
, но ни один из них не относится к тому, что вы, похоже, ищете - эквивалент, например, default
оператор в C#.
К счастью, 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
на значение, если результат не является "объектом", в этом случае он вернет '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';
}
И теперь мы можем иметь:
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!)
Я подозреваю, что это настолько близко к тому, что вы ищете, чем вы собираетесь получить. Кроме того, чтобы предотвратить любую критику: использование eval выше может показаться немного грязным, но это единственный способ получить именованное значение из текущей области видимости.
Function Эта функция не может вызвать конструктор, созданный в другой области видимости; вместо этого я дал возможность позвонить с this
привязанный к объекту, содержащему любые такие конструкторы, он может ссылаться на:
function innerScopeCtor() {
function T () {}
return defaultVal.call( { T : T }, 'T' );
}
innerScopeCtor(); // T {}
Если вы этого не сделаете, он просто вернется к возвращению нового объекта.
Я не понимаю, почему вы задаете такой вопрос. В любом случае, значение по умолчанию для переменной в JavaScript null
или же undefined
,
В целях обучения я взял это из JavaScript / переменных и типов WikiBooks:
Переменные обычно явно объявляются оператором var, как показано ниже:
var c;
Переменная выше создана, но по умолчанию имеет значение
undefined
, Чтобы иметь значение, переменная должна быть инициализирована:var c = 0;
После объявления переменной может быть присвоено новое значение, которое заменит старое:
c = 1;
Но не забудьте объявить переменную с помощью var до (или пока) присвоения ей; в противном случае вы создадите "ошибку в области видимости".
И теперь, когда вы спрашиваете, почему значение не 0
это потому, что даже null
или же undefined
являются значениями, которые не определены. Не определено отличается от того, чтобы быть определенным и пустым. Может вернуться 0
когда значение объявлено и не определено.
Значением по умолчанию для любой переменной в JavaScript является undefined
, Вы также можете получить его как
var defaultValue = void 0;