He escrito un par de funciones que replican efectivamente JSON.stringify(), convirtiendo un rango de valores en versiones en cadena. Cuando transfiero mi código a JSBin y lo ejecuto en algunos valores de muestra, funciona bien. Pero recibo este error en un corredor de especificaciones 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 recibo 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 genérica
Este error se produce cuando llama a una función que espera un Objeto como argumento, pero pasa undefined o null en su lugar, como por ejemplo
Object.keys(null) Object.assign(window.UndefinedVariable, {})Como eso suele ser por error, la solución es verificar su código y corregir la condición nula/indefinida 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 unchanged no se evaluará cuando se proporcione null , solo si se proporciona la cadena "null" . Entonces, si pasa el valor null real a su secuencia de comandos, se analizará en la parte Objeto del código. Y Object.keys(null) arroja el TypeError mencionado. Para arreglarlo, use if(obj === null) {return null} - sin las preguntas alrededor de null.
Asegúrese de que el objeto de destino no esté vacío ( null o undefined ).
Puede inicializar el objeto de destino con un objeto vacío como se muestra a continuación:
var destinationObj = {}; Object.assign(destinationObj, sourceObj);Agregar "Objeto &&" funciona antes de colocar el objeto en el mapa. objetos && Object.keys(objexts )?.map((objext, idx) =>