0

Может ли кто-нибудь дать исчерпывающую причину того, почему будет сбой следующего скрипта node.js?Объявление объекта nodejs и немедленное сокращение, если оператор отключает приложение

var _ = require("underscore"); 

var foo = { 
    bar: 123 
} 

(!_.isNull(foo.bar)?foo.bar = true:""); 

Ошибка он производит:

TypeError: Cannot read property 'bar' of undefined 
    at Object.<anonymous> (/Users/blahsocks/test_ob.js:7:15) 
    at Module._compile (module.js:456:26) 
    at Object.Module._extensions..js (module.js:474:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:312:12) 
    at Function.Module.runMain (module.js:497:10) 
    at startup (node.js:119:16) 
    at node.js:906:3 

я могу исправить эту проблему, добавив console.log(foo) перед «если» или, если я изменю, если (typeof ob.bar !== "null"), но я задавался вопросом, есть ли причина это приведет к ошибке.

ответ

2

Automatic semicolon insertion ударил вас.

Ваш код интерпретируется как

var foo = { 
    bar: 123 
}( !_.isNull(foo.bar)?foo.bar = true:"" ); 

который является вызов функции в назначении. Еще до того, как вы получите сообщение об ошибке, что {bar:123} не является функцией, вы получаете исключение, потому что получаете доступ к свойству на foo, прежде чем ему будет присвоено значение (и по-прежнему undefined).

Чтобы исправить это, используйте

var foo = { 
    bar: 123 
}; 

!_.isNull(foo.bar)?foo.bar = true:""; 

(где и точка с запятой и опуская скобки бы исправили проблему в одиночку).

+0

Большое спасибо, я кодировал этот путь в течение многих лет, и я никогда не сталкивался с этой проблемой (к счастью). –

-1

Проблема здесь:

(!_.isNull(foo.bar)?foo.bar = true:"");

Это утверждение не имеет никакого смысла, и я не думаю, что вы можете присвоить свойство внутри инлайн, если заявление. Я также не знаю, почему вы пытаетесь перезаписать 123 с помощью true.

Как бы то ни было, что вы, кажется, пытаются сделать должна быть выполнимой этим:

foo.bar = (!_.isNull(foo.bar) ? true : ""); 
+1

Это просто очень простой пример проблемы, и нет причин, по которым вы не можете назначить переменную внутри if. Я знаю, что я могу достичь того же результата, если вы описали проблему с тем, что объявление объекта не распознается в первую очередь. вы можете добавить еще один объект, подверженный риску, и присвоить ему другое значение и по-прежнему иметь такую ​​же проблему. –