Ik heb een aantal functies geschreven die JSON.stringify() effectief repliceren, waarbij een reeks waarden wordt omgezet in stringified versies. Wanneer ik mijn code overzet naar JSBin en het op een aantal voorbeeldwaarden uitvoer, werkt het prima. Maar ik krijg deze foutmelding in een spec runner die is ontworpen om dit te testen.
Mijn 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) + "";
}
};
De foutmelding die ik krijg van de tester is:
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)
Het lijkt te mislukken met:
stringifyJSON(null) bijvoorbeeld
Antwoord 1, autoriteit 100%
Algemeen antwoord
Deze fout wordt veroorzaakt wanneer u een functie aanroept die een Objectals argument verwacht, maar in plaats daarvan undefinedof nulldoorgeeft, zoals voor voorbeeld
Object.keys(null)
Object.assign(window.UndefinedVariable, {})
Omdat dat meestal per ongeluk is, is de oplossing om uw code te controleren en de voorwaarde null/undefinedop te lossen, zodat de functie ofwel een juist Objectkrijgt, of helemaal niet gebeld worden.
Object.keys({'key': 'value'})
if (window.UndefinedVariable) {
Object.assign(window.UndefinedVariable, {})
}
Antwoord specifiek voor de code in kwestie
De regel if (obj === 'null') { return null;} // null unchanged
zal niet
evalueren wanneer null
wordt gegeven, alleen als de tekenreeks "null"
wordt gegeven. Dus als u de werkelijke waarde null
doorgeeft aan uw script, wordt deze geparseerd in het Object-gedeelte van de code. En Object.keys(null)
genereert de genoemde TypeError
. Om het op te lossen, gebruik je if(obj === null) {return null}
– zonder de qoutes rond null.
Antwoord 2, autoriteit 3%
Zorg ervoor dat het doelobject niet leeg is ( null
of undefined
).
U kunt het doelobject initialiseren met een leeg object zoals hieronder:
var destinationObj = {};
Object.assign(destinationObj, sourceObj);
Antwoord 3
Dit is erg handig om fouten te voorkomen bij het openen van eigenschappen van null- of ongedefinieerde objecten.
null tot ongedefinieerd object
const obj = null;
const newObj = obj || undefined;
// newObj = undefined
undefined om object leeg te maken
const obj;
const newObj = obj || {};
// newObj = {}
// newObj.prop = undefined, but no error here
null om object leeg te maken
const obj = null;
const newObj = obj || {};
// newObj = {}
// newObj.prop = undefined, but no error here
Antwoord 4
Ik heb hetzelfde probleem opgelost in een React Native-project. Ik heb het hiermee opgelost.
let data = snapshot.val();
if(data){
let items = Object.values(data);
}
else{
//return null
}
Antwoord 5
In mijn geval heb ik de Lucid-extensie toegevoegd aan Chrome en merkte het probleem op dat moment niet op. Na ongeveer een dag aan het probleem te hebben gewerkt en het programma op zijn kop te hebben gezet, had iemand in een post Lucid genoemd. Ik herinnerde me wat ik had gedaan en verwijderde de extensie uit Chrome en voerde het programma opnieuw uit. Het probleem was weg. Ik werk met React. Ik dacht dat dit misschien zou helpen.
Antwoord 6
Vervangen
if (typeof obj === 'undefined') { return undefined;} // return undefined for undefined
if (obj === 'null') { return null;} // null unchanged
met
if (obj === undefined) { return undefined;} // return undefined for undefined
if (obj === null) { return null;} // null unchanged
Antwoord 7
Als je Laravelgebruikt, zat mijn probleem in de naam van mijn route.
In plaats daarvan:
Route::put('/reason/update', '[email protected]');
Ik schreef:
Route::put('/reason/update', '[email protected]');
en toen ik de naam van de controller herstelde, werkte de code!
Antwoord 8
In mijn geval had ik een extra paar haakjes ()
In plaats van
export default connect(
someVariable
)(otherVariable)()
Het moest zijn
export default connect(
someVariable
)(otherVariable)
Antwoord 9
Het onderstaande fragment is voldoende om te begrijpen hoe ik hetzelfde probleem ben tegengekomen, maar in een ander scenario en hoe ik het heb opgelost met behulp van de richtlijnen in het geaccepteerde antwoord. In mijn geval probeerde ik de sleutels van het object in de 0e index van de ‘defaultViewData’-array te loggen met behulp van de Object.keys()-methode.
defaultViewData = [{"name": "DEFAULT_VIEW_PLP","value": {"MSH25": "LIST"}}]
console.log('DEFAULT_VIEW', Object.keys(this.props.defaultViewData[0]));
De console.log werd niet afgedrukt en ik kreeg dezelfde foutmelding als in deze vraag. Om die fout te voorkomen heb ik onderstaande voorwaarde toegevoegd
if(this.props.defaultViewData[0]) {
console.log('DEFAULT_VIEW', Object.keys(this.props.defaultViewData[0]));
}
Het toevoegen van deze controle zorgde ervoor dat ik deze fout niet kreeg. Ik hoop dat dit iemand helpt.
Opmerking: dit is React.js-code. (hoewel het niet uitmaakt om het probleem te begrijpen).
Antwoord 10
Ik heb hetzelfde probleem met een element in een webformulier. Dus wat ik deed om het te repareren, was valideren.
if(Object === ‘null’)
iets doen