Это такая распространенная ошибка, которая вызывает появление новых пользователей в javascript.
if(this.myData.myValue){ ...
// throws: Uncaught TypeError: Cannot read property 'myValue' of undefined`
Многие будут смотреть на myValue
для этой проблемы, но если вы читаете ошибку тщательно он говорит, что не может найти недвижимость myValue
неопределенных. Это не myValue
, это вопрос, но myData
, который не определен и, следовательно, не может иметь никаких свойств. Я лично хотел бы, чтобы ошибка прочитала Uncaught TypeError: 'myData' is undefined and has no property 'myValue'
, поскольку это остановило бы так много застрявших там, где проблема.
undefined
- особый объект в javascript и размножается повсюду. undefined
эквивалентно false. undefined
присваивается объекту, который не инициирован. Объекты, которые не были определены, равны undefined
. Объект, который имеет значение undefined
, не помещается в файлы JSON. undefined
не разрешено в файлах JSON, если это не строка. Объект, который имеет значение undefined
, не может иметь свойств. undefined
- примитивный тип.
Примеры
var myObj; // declare a variable without a value. It automatically gets undefined
// you can check if the object has a value
if(myObj === undefined){ // will be true if myObj has no value
// this does not mean it has been declare
if(myOtherObj === undefined){ // will return true as well even thought myOtherObj has not been declared
Чтобы проверить, если переменная была объявлена недействительной использование 0
// from above code snippet
if(myObj === void 0){ // is true because myObj has been declared
if(myOtherObj === void 0){ // is false because myOtherObj has not been declared.
Многие люди используют то вырезать, чтобы определить, является ли объект неопределенным. Это может вызвать проблемы, если вы не будете осторожны.
if(!myObj){ // will be true if my object is undefined.
// this is bad practice because the Numbers 0, the boolean false,
// the Object null are also equivalent to false;
myObj = 0
if(!myObj){ // the test intended to find out if myObj has been defined fails
myObj = false
if(!myObj){ // again the test fails.
myObj = null
if(!myObj){ // again.
Я всегда настаиваю на том, что люди используют точный оператор эквивалентности ===
для проверки undefined
if(myObj === undefined){
В отличии от C/C++ и других подобных языков порядка условного оператора всегда слева направо. JavaScript выйдет из условного состояния, как только он узнает, что он потерпел неудачу. Это удобно для тестирования для неопределенных
Решение проблемы.
var myObj;
if(myObj !== undefined && myObj.myProperty){ // this will not crash
// because if myObj is undefined
// it will exit at the first
// condition.
// on the other hand this will
if(myObj.myProperty && myObj !== undefined){ // this will throw an error if
// myObj is undefined
undefined
эквивалентно некоторых других типов Javascipt
undefined == null // true
undefined == false // false
undefined == 0 // false
undefined === null // false
undefined === false // false
undefined === 0 // false
// be careful as the ! operator changes things a little
var a = undefined;
!a //true
a = 0;
!a // true
a = null;
!a // true
a = false;
!a // true
JSON файлы не имеют неопределенные в качестве значения.
{
"myObj" : undefined
}
// this is not a valid JSON file.
Когда stringifing объект в JSON все объекты, которые имеют значение не определено, не будет добавлен в строку JSON
var myObj = {
propA : 0,
propB : "hello",
propC : undefined,
propD : null
};
var str = JSON.stringify(myObj); // will create the JSON string
{
"propA" : 0,
"propB" : "hello",
"propD" : null
}
// not that propC does not appear in the JSON
undefined
сложный зверь в JavaScript и лучше ознакомиться с его использования.
Узнайте больше на
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
'lookuptextvalue.name_Value' не существует, но вы пытаетесь найти свойство этого, это вызовет ошибку. Чтобы исправить первую проверку, она существует, тогда проверьте, чтобы значение равнялось true 'if (lookuptextvalue.name_Value && lookuptextvalue.name_Value.value) {' Кстати, вам нужно потратить некоторое время на изучение хорошего стиля макета кода, ваш грязный и плохой стиль будет очень сложно найти ошибки и проблемы, так как ваш код становится более сложным. – Blindman67
@ Blindman67 thakns для вашего совета и решения. Это сработало. Можете ли вы дать мне несколько ссылок для обучения? – Eldanar
Посмотрите на Дугласа Крокфорда, у вас есть семинары и лекции, книги и многое другое. Он создал JSON и JSLint. Его пути могут казаться немного педантичными сначала, но хорошо изучать. Хороший стиль кода очень важен, лично это самая важная часть, чтобы стать хорошим программистом. – Blindman67