Pourquoi ne pouvez-vous pas stringify une expression de fonction?
-
11-12-2019 - |
Question
Pourquoi n'est-il pas de produire quoi que ce soit?
console.log(JSON.stringify(function(){console.log('foobar');}));
La solution
JSON ne peut pas stringify fonctions à tous, il les traite comme undefined
ou null
des valeurs.Vous pouvez vérifier l'exacte algorithme à EcmaScript 5.1 §15.12.3, voir aussi l' description au MDN.
Cependant, bien sûr, vous pouvez stringify expression de fonction par la coulée de chaînes de caractères, essayez
console.log("" + function(){console.log('foobar');})
Autres conseils
JSON n'a aucun moyen de représenter une fonction.Il s'agit d'un format de données conçu pour la simplicité et la compatibilité entre les langues (et une fonction est la dernière chose qui sera compatible entre la langue continue).
des docs pour JSON.Stringify :
Si non définie, une fonction ou une valeur XML est rencontrée lors de la conversion, il est soit omis (lorsqu'il est trouvé dans un objet) ou censuré à NULL (lorsqu'il est trouvé dans un tableau).
Vous ne pouvez pas faire cela, mais certaines bibliothèques tierces peuvent vous aider à faire cela, comme: https://www.npmjs.com/package/json-fn
Si vous souhaitez utiliser JSON.stringify
aussi convertir les fonctions et les objets natifs, vous pouvez passer un convertisseur de fonction en tant que deuxième argument:
const data = {
fn: function(){}
}
function converter(key, val) {
if (val && typeof val === 'function' || val.constructor === RegExp) {
return String(val)
}
return val
}
console.log(JSON.stringify(data, converter, 2))
De retour undefined
à partir de la fonction convertisseur si vous souhaitez omettre le résultat.
Le troisième paramètre est le nombre d'espaces que vous souhaitez la sortie de tiret (facultatif).
yourFunctionName.toString();
sera également stringify une fonction