Значение по умолчанию для типа в 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;
Другие вопросы по тегам