2015-04-18 15 views
17

Napisałem kilka funkcji, które skutecznie replikują JSON.stringify(), konwertując zakres wartości na ujednolicone wersje. Po przeniesieniu kodu do JSBin i uruchomieniu go na niektórych przykładowych wartościach, działa dobrze. Ale dostaję ten błąd w specjalnym runnie zaprojektowanym do przetestowania tego.Jak rozwiązać TypeError: Can not convert undefined lub null do obiektu

Mój kod:

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

Komunikat o błędzie Dostaję od testera jest:

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) 

Wydaje się niepowodzeniem: stringifyJSON (null) na przykład

+0

proszę podać dane wejściowe, dla których otrzymujesz błąd, ponieważ działa dla stringifyJSON ({a: 'b', c: 'd'}) – vinayakj

+1

Oprócz błędu, 'stringifyJSON ([1,2,3]) 'zwraca' 1,2,3' i 'stringifyJSON ({foo: 'bar'})' zwraca '{foo:" bar "}', z których oba są nieprawidłowe JSON. –

+4

Domyślam się, że ta linia 'if (obj === null ') {return null;} // null unchanged', - która nie przejdzie, gdy zostanie podana' null', tylko jeśli podany zostanie ciąg '" null " '. Zatem jeśli przekażesz rzeczywistą wartość 'null' do skryptu, zostanie on przeanalizowany w części Object tego kodu. Natomiast 'Object.keys (null)' rzuca wspomniany 'TypeError'. Aby to naprawić, użyj 'if (obj === null) {return null}' - bez qoutes wokół 'null'. – veproza

Odpowiedz

27

Linia if (obj === 'null') { return null;} // null unchanged nie będzie analizowana, gdy zostanie podana null, tylko jeśli zostanie podany ciąg "null". Jeśli więc podasz rzeczywistą wartość null do skryptu, zostanie on przeanalizowany w części Object tego kodu. I Object.keys(null) wymienia wspomnianą TypeError. Aby to naprawić, użyj if(obj === null) {return null} - bez qoutes wokół null.

Powiązane problemy