2013-09-23 1 views
0

У меня есть хэш «ч» и имеют код типа:Какой тип/тип не определен, и можно ли его расширить или добавить?

h[key].dostuff() 

Когда ключ не существует в хэш, ч [ключ] не определен, и я получаю ошибку о том, что я не могу назвать метод " достойность "неопределенного.

Есть ли способ добавить этот метод к undefined, если undefined является расширяемым классом?

Я уверен, что это должен быть обычный случай, так что есть предпочтительный способ обращения с этим, не прибегая к обходной функции, например. hh (key), в котором я мог бы манипулировать неопределенными результатами?

Спасибо.

+2

Чтобы быть «неопределенным», должно быть, буквально, не определено. Это означает, что нет никакой ценности, и нигде не нужно * находить значение. В этом случае это означает, что на вашем объекте «h» нет свойства, чье имя является значением «key». (* edit * фактически 'undefined' также может быть« значением »переменной, которая не инициализирована; JavaScript отличает эту ситуацию от переменной« null », что немного странно.) – Pointy

+0

' h [key] && h [ key] .dostuff() '??? –

+0

Спасибо всем. Не надеялся, что неопределенный будет принадлежать расширяемому классу, подобному nil и NilClass в рубине, который расширяется. А хорошо. – frank

ответ

1
if(h[key]) 
    h[key].dostuff() 

это проверка «если значение существует, DoStuff()»

2

Поскольку undefined приравнивается к false в JavaScript, вы можете объединить проверки значения и вызов функции, например:

h[key] && h[key].dostuff(); 

Это гарантирует, что если h[key] имеет значение, вызывается dostuff().

+0

Я понимаю, почему это была бы лучшая альтернатива, чем использование «нормального» выражения 'if', но я предпочитаю читаемость, и я бы пошел с ним. Я очень обеспокоен тем, что логическое значение исчезает так же, как в бездне интерпретатора. – Tomalla

+0

'Я очень обеспокоен тем, что логическое значение исчезает так, как в бездне интерпретатора.« Ха! Добро пожаловать в типы данных в Javascript: D Действительно ли это зависит от личных предпочтений, используете ли вы этот метод или стандартное условие 'if'. Я предпочитаю этот для краткости. –

+0

My teamlead наказывает меня, если я пишу. Если условие для одного утверждения, он также предпочитает && = D –

0

Вы всегда могли бы сделать что-то вроде этого:

h.get = function(key) { 
    if(this.hasOwnProperty(key)) 
     return this[key]; 

    //here return a default object, whatever that would be 
    return {doStuff: function() { 
     //default doStuff function 
    }}; 
}; 

h.get(key).doStuff(); 

Я знаю, что это немного вынужденное решение, но это как-то может имитировать поведение по умолчанию.

 Смежные вопросы

  • Нет связанных вопросов^_^