2016-10-27 5 views
-3

Пожалуйста, несите меня, потому что я новичок в JavaScript, и мне был дан этот код, чтобы попытаться улучшить его, чтобы любой ввод полезен. Мне сказали перечислить некоторые проблемы или проблемы, которые вы видите с кодом. До сих пор я вижу, что:Я хотел бы улучшить свой код условия JavaScript

Использование двойного оператора равное равенство сравнить объект со строкой не может быть лучшим решением

если TYPEOF данные == «объект»

Также, пожалуйста, предположим, что предполагается PeopleFactory определено по всему миру

Не стесняйтесь разобрать код. Было бы очень полезно. Благодаря

var Person_D = function Person_D(name) { 
    //assume PeopleFactory is defined globally 
    //getDetailsAsync returns either null or a record with specific name. 
    PeopleFactory.getDetailsAsync(name, function(data) { 
    if (typeof data !== 'object') { 
     throw new Error('No record found for this individual.'); 
    } 

    this.name = data.name; 
    this.age = data.age || 'No age data available.'; 
    this.eyeColor = data.eyeColor || "This individual's eye color data is not listed."; 
    this.height = data.size.height || "No height specified."; 

    }); 

    return this; 

} 

var personD = new Person_D('Jana'); 

console.log(personD.name); 
+0

'TypeOf data' не является объектом. Это вопрос интервью? – JJJ

+5

Я голосую, чтобы закрыть этот вопрос не по теме, потому что он принадлежит [Code Review] (http://codereview.stackexchange.com/) (если есть). Прежде чем отправлять его, прочитайте их [Asking] (http://codereview.stackexchange.com/help/dont-ask). –

+0

В чем проблема с использованием typeof? – epascarello

ответ

1

Ваш вопрос в его нынешнем состоянии слишком широк, чтобы «ответ», однако есть по крайней мере 3 ошибки в коде, что приведет к ошибкам во всех случаях.

  1. код загружает свойства Person_D через PeopleFactory.getDetailsAsync, который является асинхронным, но доступ personD.name синхронно.

  2. В коде используется this для назначения свойств в обратном вызове, поэтому this больше не ссылается на объект Person_D.

  3. if(typeof data !=='object') фактически всегда приводит к true, потому что typeof null и typeof new Object() как результат в "object". Вместо этого используйте === null.

Возможное исправление (не делает никаких предположений о том, как код должен работу, просто заставить его работать, как, вероятно, предназначен с правильными выходами):

var Person_D = function Person_D(name) { 
    var self = this; 
    //assume PeopleFactory is defined globally 
    //getDetailsAsync returns either null or a record with specific name. 
    PeopleFactory.getDetailsAsync(name, function(data) { 
    if (data === null) { 
     throw new Error('No record found for this individual.'); 
    } 

    self.name = data.name; 
    self.age = data.age || 'No age data available.'; 
    self.eyeColor = data.eyeColor || "This individual's eye color data is not listed."; 
    self.height = data.size.height || "No height specified."; 
    console.log(self.name); 
    }); 

    return this; 
} 

var personD = new Person_D('Jana'); 
+0

'Добавить: if (typeof data! == 'object') является полностью допустимым js и на самом деле является лучшим способом сравнения типов.' Нет, это не самое лучшее: 'typeof null' также даст вам' объект ", но я сомневаюсь, что вы считаете его действительным. – vlaz

+0

@vlaz Хмм хороший улов, я забыл об этом причуде, вероятно, потому, что я никогда не встречал случай использования для строгой проверки типа с нулевым. Изменим его. – tcooc

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