Ich habe einige Funktionen geschrieben, die JSON.stringify () effektiv replizieren und einen Wertebereich in stringifizierte Versionen konvertieren. Wenn ich meinen Code auf JSBin portiere und ihn auf einigen Beispielwerten ausführe, funktioniert er einwandfrei. Aber ich erhalte diesen Fehler in einem Spezifikationsläufer, der entwickelt wurde, um dies zu testen.
Mein Code:
// 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) + "";
}
};
Die Fehlermeldung, die ich vom Tester erhalte, lautet:
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)
Es scheint zu scheitern mit: stringifyJSON (null) zum Beispiel
javascript
zahabba
quelle
quelle
stringifyJSON([1,2,3])
zurückgegeben1,2,3
undstringifyJSON({foo: 'bar'})
zurückgegeben{foo: "bar"}
, die beide kein gültiger JSON sind.if (obj === 'null') { return null;} // null unchanged
, - die nicht gegeben wirdnull
, wenn gegeben , nur wenn die Zeichenfolge gegeben wird"null"
. Wenn Sie also den tatsächlichennull
Wert an Ihr Skript übergeben, wird er im Objektteil des Codes analysiert. UndObject.keys(null)
wirft dasTypeError
erwähnte. Verwenden Sieif(obj === null) {return null}
zum Beheben des Problems - ohne die Qoutesnull
."
Zeichen in Zeichenfolgen einzubetten .Antworten:
Generische Antwort
Dieser Fehler wird verursacht, wenn Sie eine Funktion aufrufen, die ein Objekt als Argument erwartet , aber stattdessen undefiniert oder null übergibt, wie zum Beispiel
Object.keys(null) Object.assign(window.UndefinedVariable, {})
Da dies normalerweise aus Versehen geschieht, besteht die Lösung darin, Ihren Code zu überprüfen und die null / undefinierte Bedingung zu korrigieren , sodass die Funktion entweder ein geeignetes Objekt erhält oder überhaupt nicht aufgerufen wird.
Object.keys({'key': 'value'}) if (window.UndefinedVariable) { Object.assign(window.UndefinedVariable, {}) }
Antwort spezifisch für den fraglichen Code
Die Zeile
if (obj === 'null') { return null;} // null unchanged
wird nicht ausgewertet, wenn sie angegeben wirdnull
, nur wenn die Zeichenfolge angegeben ist"null"
. Wenn Sie also den tatsächlichennull
Wert an Ihr Skript übergeben, wird er im Objektteil des Codes analysiert. UndObject.keys(null)
wirft dasTypeError
erwähnte. Um dies zu beheben, verwenden Sieif(obj === null) {return null}
- ohne die qoutes um null.quelle
Object.keys(null)
wirft dasTypeError
erwähnte."delete obj.property
woobj===null
Stellen Sie sicher, dass das Zielobjekt nicht leer ist (
null
oderundefined
).Sie können das Zielobjekt wie folgt mit einem leeren Objekt initialisieren:
var destinationObj = {}; Object.assign(destinationObj, sourceObj);
quelle
Dies ist sehr nützlich, um Fehler beim Zugriff auf Eigenschaften von null oder undefinierten Objekten zu vermeiden.
null bis undefiniertes Objekt
const obj = null; const newObj = obj || undefined; // newObj = undefined
undefiniert, um das Objekt zu leeren
const obj; const newObj = obj || {}; // newObj = {} // newObj.prop = undefined, but no error here
null, um das Objekt zu leeren
const obj = null; const newObj = obj || {}; // newObj = {} // newObj.prop = undefined, but no error here
quelle
Ich habe das gleiche Problem in einem React Native-Projekt gelöst. Ich habe es damit gelöst.
let data = snapshot.val(); if(data){ let items = Object.values(data); } else{ //return null }
quelle
In meinem Fall habe ich die Lucid-Erweiterung zu Chrome hinzugefügt und das Problem in diesem Moment nicht bemerkt. Nach ungefähr einem Tag der Arbeit an dem Problem und dem Umdrehen des Programms hatte jemand in einem Beitrag Lucid erwähnt. Ich erinnerte mich an das, was ich getan hatte, entfernte die Erweiterung von Chrome und führte das Programm erneut aus. Das Problem war weg. Ich arbeite mit React. Ich dachte, das könnte helfen.
quelle
Ersetzen
if (typeof obj === 'undefined') { return undefined;} // return undefined for undefined if (obj === 'null') { return null;} // null unchanged
mit
if (obj === undefined) { return undefined;} // return undefined for undefined if (obj === null) { return null;} // null unchanged
quelle
Wenn Sie Laravel verwenden , lag mein Problem im Namen meiner Route. Stattdessen:
Route::put('/reason/update', 'REASONController@update');
Ich schrieb:
Route::put('/reason/update', 'RESONController@update');
und als ich den Namen des Controllers festlegte, funktionierte der Code!
quelle
In meinem Fall hatte ich ein zusätzliches Paar Klammern
()
Anstatt von
export default connect( someVariable )(otherVariable)()
Es musste so sein
export default connect( someVariable )(otherVariable)
quelle
Das folgende Snippet reicht aus, um zu verstehen, wie ich auf dasselbe Problem gestoßen bin, aber in einem anderen Szenario, und wie ich es mithilfe der Anleitung in der akzeptierten Antwort gelöst habe. In meinem Fall habe ich versucht, die Schlüssel des im 0. Index des Arrays 'defaultViewData' vorhandenen Objekts mithilfe der Object.keys () -Methode zu protokollieren.
defaultViewData = [{"name": "DEFAULT_VIEW_PLP","value": {"MSH25": "LIST"}}] console.log('DEFAULT_VIEW', Object.keys(this.props.defaultViewData[0]));
Das console.log wurde nicht gedruckt und ich erhielt den gleichen Fehler wie in dieser Frage. Um diesen Fehler zu vermeiden, habe ich die folgende Bedingung hinzugefügt
if(this.props.defaultViewData[0]) { console.log('DEFAULT_VIEW', Object.keys(this.props.defaultViewData[0])); }
Durch Hinzufügen dieser Prüfung wurde sichergestellt, dass dieser Fehler nicht angezeigt wurde. Ich hoffe das hilft jemandem.
Hinweis: Dies ist der Code von React.js. (obwohl es keine Rolle spielt, das Problem zu verstehen).
quelle
Ich habe das gleiche Problem mit einem Element in einem Webformular. Also, was ich getan habe, um es zu beheben, war validieren. if (Object === 'null') macht etwas
quelle