javascript - Cómo resolver TypeError: No se puede convertir undefined o null a objeto
He escrito un par de funciones que efectivamente replican JSON.stringify(), convirtiendo una variedad de valores en versiones en cadena. Cuando traslado mi código a JSBin y lo ejecuto con algunos valores de ejemplo, funciona perfectamente. Pero estoy obteniendo este error en un ejecutor de pruebas diseñado para probar esto.
Mi código:
// 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) + "";
}
};
El mensaje de error que estoy recibiendo del probador es:
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)
Parece fallar con: stringifyJSON(null) por ejemplo
Respuesta #1
Respuesta genérica
Este error se produce cuando llamas a una función que espera un Objeto como argumento, pero pasas undefined o null en su lugar, como por ejemplo
Object.keys(null)
Object.assign(window.UndefinedVariable, {})
Como eso suele ocurrir por error, la solución es revisar tu código y corregir la condición null/undefined para que la función obtenga un Objeto adecuado, o no se llame en absoluto.
Object.keys({'key': 'value'})
if (window.UndefinedVariable) {
Object.assign(window.UndefinedVariable, {})
}
Respuesta específica al código en cuestión
La línea if (obj === 'null') { return null;}/null sin cambios no se evaluará cuando se le pase null, solo si se le pasa la cadena "null". Así que si pasas el valor real null a tu script, se procesará en la parte de Object del código. Y Object.keys(null) lanza el TypeError mencionado. Para solucionarlo, usa if(obj === null) {return null} - sin las comillas alrededor de null.
Respuesta #2
Asegúrate de que ese objeto no esté vacío (nulo o indefinido).
Error:
let obj
Object.keys(obj)
Solución:
Object.keys(obj || {})
