TypeError nasıl çözülür: Tanımsız veya null nesneye dönüştürülemez


92

JSON.stringify () işlevini etkili bir şekilde kopyalayan ve bir dizi değeri dizgeli sürümlere dönüştüren birkaç işlev yazdım. Kodumu JSBin'e taşıdığımda ve bazı örnek değerlerde çalıştırdığımda, gayet iyi çalışıyor. Ancak bunu test etmek için tasarlanmış bir özellik koşucusunda bu hatayı alıyorum.

Kodum:

  // five lines of comments
  var stringify = function(obj) {
  if (typeof obj === 'function') { return undefined;}  // return undefined for function
  if (typeof obj === 'undefined') { return undefined;} // return undefined for undefined
  if (typeof obj === 'number') { return obj;} // number unchanged
  if (obj === 'null') { return null;} // null unchanged
  if (typeof obj === 'boolean') { return obj;} // boolean unchanged
  if (typeof obj === 'string') { return '\"' + obj + '\"';} // string gets escaped end-quotes
  if (Array.isArray(obj)) { 
    return obj.map(function (e) {  // uses map() to create new array with stringified elements
        return stringify(e);
    });
  } else {
    var keys = Object.keys(obj);   // convert object's keys into an array
    var container = keys.map(function (k) {  // uses map() to create an array of key:(stringified)value pairs
        return k + ': ' + stringify(obj[k]);
    });
    return '{' + container.join(', ') + '}'; // returns assembled object with curly brackets
  }
};

var stringifyJSON = function(obj) {
    if (typeof stringify(obj) != 'undefined') {
        return "" + stringify(obj) + "";
    }
};

Test cihazından aldığım hata mesajı:

TypeError: Cannot convert undefined or null to object
    at Function.keys (native)
    at stringify (stringifyJSON.js:18:22)
    at stringifyJSON (stringifyJSON.js:27:13)
    at stringifyJSONSpec.js:7:20
    at Array.forEach (native)
    at Context.<anonymous> (stringifyJSONSpec.js:5:26)
    at Test.Runnable.run (mocha.js:4039:32)
    at Runner.runTest (mocha.js:4404:10)
    at mocha.js:4450:12
    at next (mocha.js:4330:14)

Örneğin stringifyJSON (null) ile başarısız görünüyor


1
stringifyJSON ({a: 'b', c: 'd'}) için çalıştığı için lütfen hata aldığınız girdiyi sağlayın
vinayakj

1
Hatanın yanı sıra , her ikisi de geçerli JSON olmayan stringifyJSON([1,2,3])döndürür 1,2,3ve stringifyJSON({foo: 'bar'})döndürür {foo: "bar"}.
Felix Kling

4
Tahminim bu satır if (obj === 'null') { return null;} // null unchanged, - verildiğinde geçmeyecek null, sadece dizi verildiğinde geçmeyecek "null". Dolayısıyla, gerçek nulldeğeri betiğinize iletirseniz, kodun Nesne bölümünde ayrıştırılır. Ve bahsedilen Object.keys(null)atar TypeError. Düzeltmek için if(obj === null) {return null}- etrafta sorular olmadan kullanın null.
veproza

1
Başka bir sorun: kodunuz "karakterlerin dizelere gömülü olma olasılığını işlemez .
Sivri

@Pointy - evet, bunun için biraz mantık eklemem gerek ... teşekkürler
zahabba

Yanıtlar:


134

Genel cevap

Bu hata, bir Object'in bağımsız değişkeni olarak beklediği , ancak bunun yerine örneğin tanımsız veya null değerini ileten bir işlevi çağırdığınızda ortaya çıkar.

Object.keys(null)
Object.assign(window.UndefinedVariable, {})

Bu genellikle yanlışlıkla olduğu için, çözüm kodunuzu kontrol etmek ve boş / tanımsız koşulu düzeltmektir, böylece işlev ya uygun bir Nesne alır ya da hiç çağrılmaz.

Object.keys({'key': 'value'})
if (window.UndefinedVariable) {
    Object.assign(window.UndefinedVariable, {})
}

Söz konusu koda özel cevap

Satır if (obj === 'null') { return null;} // null unchanged verildiğinde değerlendirilmez null, yalnızca dizge verilirse değerlendirilir "null". Dolayısıyla, gerçek nulldeğeri betiğinize iletirseniz, kodun Nesne bölümünde ayrıştırılır. Ve bahsedilen Object.keys(null)atar TypeError. Düzeltmek için if(obj === null) {return null}- null etrafındaki sorular olmadan kullanın .


8
Vurgulayın: "Ve belirtilenleri Object.keys(null)fırlatır TypeError."
falsarella

1
Bunun meydana geldiği başka bir yaygın örnek eklemek gerekirse: delete obj.propertyneredeobj===null
Gio

4

Hedef nesnenin boş olmadığından emin olun ( nullveyaundefined ) .

Hedef nesneyi aşağıdaki gibi boş nesneyle başlatabilirsiniz:

var destinationObj = {};

Object.assign(destinationObj, sourceObj);

2

Bu, boş veya tanımsız nesnelerin özelliklerine erişirken hataları önlemek için çok kullanışlıdır.

tanımsız nesneye null

const obj = null;
const newObj = obj || undefined;
// newObj = undefined

boş nesneye tanımsız

const obj; 
const newObj = obj || {};
// newObj = {}     
// newObj.prop = undefined, but no error here

boş nesneye null

const obj = null;
const newObj = obj || {};
// newObj = {}  
// newObj.prop = undefined, but no error here

0

Aynı sorunu bir React Native projesinde çözdüm. Bunu kullanarak çözdüm.

let data = snapshot.val();
if(data){
  let items = Object.values(data);
}
else{
  //return null
}

0

Benim durumumda, Lucid uzantısını Chrome'a ​​ekledim ve o anda sorunu fark etmedim. Problem üzerinde çalışıp programı alt üst ederek yaklaşık bir gün geçirdikten sonra, birisi Lucid'den bahsetti. Ne yaptığımı hatırladım ve uzantıyı Chrome'dan kaldırdım ve programı tekrar çalıştırdım. Sorun çözüldü. React ile çalışıyorum. Bunun yardımcı olabileceğini düşündüm.


0

Değiştir

if (typeof obj === 'undefined') { return undefined;} // return undefined for undefined
if (obj === 'null') { return null;} // null unchanged

ile

if (obj === undefined) { return undefined;} // return undefined for undefined 
if (obj === null) { return null;} // null unchanged

0

Laravel kullanıyorsanız , benim sorunum Rotam adındaydı . Yerine:

Route::put('/reason/update', 'REASONController@update');

Yazdım:

Route::put('/reason/update', 'RESONController@update');

ve denetleyici adını düzelttiğimde kod çalıştı!


0

Benim durumumda fazladan bir çift parantez vardı ()

Onun yerine

export default connect(
  someVariable
)(otherVariable)()

Bu olmak zorunda

export default connect(
  someVariable
)(otherVariable)

0

Aşağıdaki ön bilgi, aynı sorunla nasıl karşılaştığımı ancak farklı bir senaryoda ve kabul edilen yanıttaki kılavuzu kullanarak nasıl çözdüğümü anlamak için yeterlidir. Benim durumumda, Object.keys () yöntemini kullanarak 'defaultViewData' dizisinin 0. dizininde bulunan nesnenin anahtarlarını günlüğe kaydetmeye çalışıyordum.

defaultViewData = [{"name": "DEFAULT_VIEW_PLP","value": {"MSH25": "LIST"}}] 

console.log('DEFAULT_VIEW', Object.keys(this.props.defaultViewData[0]));

Console.log yazdırılmıyordu ve bu soruda yayınlananla aynı hatayı alıyordum. Bu hatayı önlemek için aşağıdaki koşulu ekledim

    if(this.props.defaultViewData[0]) {
  console.log('DEFAULT_VIEW', Object.keys(this.props.defaultViewData[0]));
}

Bu çeki eklemek, bu hatayı almamamı sağladı. Umarım bu birine yardımcı olur.

Not: Bu, React.js kodudur. (sorunu anlamak önemli değil).


-2

Bir web formundaki bir öğeyle aynı sorunu yaşıyorum. Yani düzeltmek için yaptığım şey doğrulamaktı. eğer (Object === 'null') bir şey yap

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.