TypeError को कैसे हल करें: ऑब्जेक्ट में अपरिभाषित या अशक्त नहीं कर सकते


92

मैंने कुछ फ़ंक्शन लिखे हैं जो JSON.stringify () को प्रभावी ढंग से दोहराते हैं, मानों की एक श्रृंखला को कड़े संस्करणों में परिवर्तित करते हैं। जब मैं अपना कोड JSBin पर पोर्ट करता हूं और इसे कुछ नमूना मूल्यों पर चलाता हूं, तो यह ठीक काम करता है। लेकिन मुझे यह परीक्षण करने के लिए डिज़ाइन किए गए एक कल्पना धावक में यह त्रुटि मिल रही है।

मेरा कोड:

  // 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) + "";
    }
};

परीक्षक से मुझे मिलने वाला त्रुटि संदेश है:

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)

यह इसके साथ विफल लगता है: stringifyJSON (null) उदाहरण के लिए


1
कृपया वह इनपुट प्रदान करें जिसके लिए आपको त्रुटि हो रही है, जैसे कि stringifyJSON ({a: 'b ’, c:
— vinayakj

1
त्रुटि के अलावा, stringifyJSON([1,2,3])रिटर्न 1,2,3और stringifyJSON({foo: 'bar'})रिटर्न {foo: "bar"}, जो दोनों मान्य JSON नहीं हैं।
— फेलिक्स क्लिंग

4
मेरा अनुमान है कि यह लाइन if (obj === 'null') { return null;} // null unchangedहोगी, - जो दिए जाने पर पास नहीं होगी null, केवल अगर स्ट्रिंग दी जाए "null"। इसलिए यदि आप nullअपनी स्क्रिप्ट का वास्तविक मूल्य पास करते हैं , तो इसे कोड के ऑब्जेक्ट भाग में पार्स किया जाएगा। और उल्लेख Object.keys(null)फेंकता है TypeError। इसे ठीक करने के लिए, उपयोग करें if(obj === null) {return null}- चारों ओर qoutes के बिना null।
— वीरोजा

1
एक और मुद्दा: आपका कोड "स्ट्रिंग्स में एम्बेडेड वर्णों की संभावना को संभालता नहीं है ।
— पॉइंटी

@ संकेत - हाँ, मुझे इसके लिए कुछ तर्क जोड़ने होंगे ... धन्यवाद
— zahabba

जवाबों:


134

सामान्य उत्तर

यह त्रुटि तब होती है जब आप किसी फ़ंक्शन को उसके तर्क के रूप में एक ऑब्जेक्ट की उम्मीद करते हैं, लेकिन इसके बजाय अपरिभाषित या अशक्त हो जाते हैं, उदाहरण के लिए

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

जैसा कि आम तौर पर गलती से होता है, समाधान आपके कोड की जांच करना और अशक्त / अपरिभाषित स्थिति को ठीक करना है ताकि फ़ंक्शन या तो एक उचित ऑब्जेक्ट प्राप्त करे , या बिल्कुल भी कॉल न करें।

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

प्रश्न में कोड के लिए विशिष्ट उत्तर दें

if (obj === 'null') { return null;} // null unchanged दिए जाने पर लाइन मूल्यांकन नहीं करेगी null, केवल अगर स्ट्रिंग दी गई है "null"। इसलिए यदि आप nullअपनी स्क्रिप्ट का वास्तविक मूल्य पास करते हैं , तो इसे कोड के ऑब्जेक्ट भाग में पार्स किया जाएगा। और उल्लेख Object.keys(null)फेंकता है TypeError। इसे ठीक करने के लिए, उपयोग करें if(obj === null) {return null}- शून्य के आसपास qoutes के बिना।


8
हाइलाइट करें: "और Object.keys(null)फेंकता TypeErrorउल्लेख किया है।"
— फाल्सरेला

1
एक और आम उदाहरण जोड़ने के लिए जहां ऐसा होता है: delete obj.propertyजहांobj===null
— Gio

4

सुनिश्चित करें कि गंतव्य ऑब्जेक्ट खाली नहीं है ( nullया undefined)।

आप नीचे की तरह खाली वस्तु के साथ गंतव्य ऑब्जेक्ट को आरंभीकृत कर सकते हैं:

var destinationObj = {};

Object.assign(destinationObj, sourceObj);

2

अशक्त या अपरिभाषित वस्तुओं के गुणों तक पहुँचने में त्रुटियों से बचने के लिए यह बहुत उपयोगी है।

अपरिभाषित वस्तु को शून्य

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

खाली वस्तु के लिए अपरिभाषित

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

रिक्त वस्तु को शून्य

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

0

मैंने उसी समस्या को एक रिएक्टिव नेटिव प्रोजेक्ट में हल किया। मैंने इसका उपयोग करके इसे हल किया।

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

0

मेरे मामले में, मैंने क्रोम में ल्यूसिड एक्सटेंशन को जोड़ा और उस समय समस्या को नोटिस नहीं किया। समस्या पर काम करने और कार्यक्रम को उल्टा करने के एक दिन के बाद, एक पोस्ट में किसी ने ल्यूसिड का उल्लेख किया था। मुझे याद आया कि मैंने क्या किया था और क्रोम से एक्सटेंशन को हटा दिया और फिर से कार्यक्रम चलाया। समस्या दूर हो गई थी। मैं रिएक्ट के साथ काम कर रहा हूं। मुझे लगा कि इससे मदद मिल सकती है।


0

बदलने के

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

साथ में

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

0

यदि आप लारवेल का उपयोग कर रहे हैं , तो मेरी समस्या मेरे रूट के नाम पर थी। बजाय:

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

मैंने लिखा:

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

और जब मैंने नियंत्रक नाम तय किया, तो कोड ने काम किया!


0

मेरे मामले में मेरे पास कोष्ठक की एक अतिरिक्त जोड़ी थी ()

के बजाय

export default connect(
  someVariable
)(otherVariable)()

यह होना था

export default connect(
  someVariable
)(otherVariable)

0

नीचे स्निपेट यह समझने के लिए पर्याप्त है कि कैसे मैंने एक ही मुद्दे का सामना किया लेकिन एक अलग परिदृश्य में और कैसे मैंने इसे स्वीकार किए गए उत्तर में मार्गदर्शन का उपयोग करके हल किया। मेरे मामले में मैं Object.keys () विधि का उपयोग करके 'defaultViewData' सरणी के 0 वें सूचकांक में मौजूद ऑब्जेक्ट की कुंजियों को लॉग इन करने की कोशिश कर रहा था।

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

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

कंसोल.लॉग मुद्रित नहीं हो रहा था और मुझे इस प्रश्न में पोस्ट की गई समान त्रुटि मिल रही थी। उस त्रुटि को रोकने के लिए मैंने नीचे दी गई शर्त को जोड़ा

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

इस चेक को जोड़ने से यह सुनिश्चित हो गया कि मुझे यह त्रुटि नहीं मिली। मुझे उम्मीद है कि यह किसी के लिए मदद करता है।

नोट: यह React.js कोड है। (हालांकि यह समस्या कोई फर्क नहीं पड़ता समझने के लिए)।


-2

मैं एक वेबफॉर्म में एक तत्व के साथ एक ही समस्या है। तो मैंने इसे ठीक करने के लिए जो किया वह मान्य था। if (ऑब्जेक्ट === 'null') कुछ करते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.