2015-04-18 2 views
17
konvertieren

Ich habe ein paar Funktionen geschrieben, die effektiv JSON.stringify() replizieren, um einen Bereich von Werten in stringifizierte Versionen zu konvertieren. Wenn ich meinen Code zu JSBin übergebe und ihn für einige Beispielwerte benutze, funktioniert es gut. Aber ich bekomme diesen Fehler in einem Spezifikationsrunner, der entworfen ist, um das zu prüfen.So beheben Sie TypeError: Kann nicht undefiniert oder null in Objekt

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 von dem Tester Ich erhalte ist:

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 zum Scheitern verurteilt: stringifyJSON (null) zum Beispiel

+0

Bitte geben Sie die Eingabe an, für die Sie einen Fehler erhalten, da sie für stringifyJSON arbeitet ({a: 'b', c: 'd'}) – vinayakj

+1

Abgesehen vom Fehler 'stringifyJSON ([1,2,3]) 'return' 1,2,3' und 'stringifyJSON ({foo: 'bar'})' returns '{foo:" bar "}', beide sind keine gültigen JSONs. –

+4

Meine Vermutung wäre diese Zeile 'if (obj === 'null') {return null;} // null unverändert', - das wird nicht übergeben wenn'null' gegeben wird, nur wenn die string' "null" gegeben wird '. Wenn Sie also den eigentlichen Wert 'null' an Ihr Skript übergeben, wird es im Objekt-Teil des Codes analysiert. Und 'Object.keys (null)' löst den erwähnten 'TypeError' aus. Um es zu beheben, benutze 'if (obj === null) {return null}' - ohne die qoutes um 'null'. – veproza

Antwort

27

Die Zeile if (obj === 'null') { return null;} // null unchanged wird nicht ausgewertet, wenn null angegeben wird, nur wenn die Zeichenfolge "null" angegeben wird. Wenn Sie also den Wert null an Ihr Skript übergeben, wird es im Objektteil des Codes analysiert. Und Object.keys(null) wirft die TypeError erwähnt. Um es zu beheben, verwenden Sie if(obj === null) {return null} - ohne die Qoutes um Null.

Verwandte Themen