JSON.stringify函数

Sor*_*anu 33 javascript json object

我有一个具有一些属性和方法的对象,如下所示:

{name: "FirstName",
age: "19",
load: function () {},
uniq: 0.5233059714082628}
Run Code Online (Sandbox Code Playgroud)

我必须将此对象传递给另一个函数.所以我尝试使用JSON.stringify(obj),但是加载函数(当然不是空的,这只是出于本例的目的)正在"丢失".

有没有办法stringify,反对和维护它拥有的方法?

谢谢!

chj*_*hjj 59

有一种方法可以在JS中序列化一个函数,但是你必须在另一方面评估它,它也将失去对它的原始范围的访问权限.一种方法是:

JSON.stringify(objWithFunction, function(key, val) {
  if (typeof val === 'function') {
    return val + ''; // implicitly `toString` it
  }
  return val;
});
Run Code Online (Sandbox Code Playgroud)

尽管人们在这里发布了什么,但是你要问的是一些合法的用途,但是,这一切都取决于你将要用它做什么.可能有更好的方式去做你正在尝试做的事情.

  • 如果不是使用`return val +''进行隐式_toString_,那么更干净;`,你做一个**显式**_toString_,如:`return val.toString();` (8认同)
  • 当你在另一边做eval时,你会松开函数,因为你得到了一个字符串化的函数值. (2认同)
  • 仅纯_closed_表达式应序列化并通过JSON发送。这实际上非常强大,可以通过RPC发送逻辑,而不仅仅是标量值。接收者还可以在对JavaScript进行评估之前先键入check,然后对其进行沙箱处理。对此做一些有趣的事情会使代码和数据之间的界限变得模糊。 (2认同)

vad*_*imk 9

实际上,使用方法实现/解析javascript 对象非常容易.

看看JSONfn插件.

http://www.eslinstructor.net/jsonfn/

希望这可以帮助.

-Vadim


Dav*_*nco 5

为什么要对字符串进行字符串化?JSON不理解函数(并且它不应该理解).如果你想传递对象,为什么不通过以下方式之一?

var x = {name: "FirstName", age: "19", load: function () {alert('hai')}, uniq: 0.5233059714082628};

function y(obj) {
    obj.load();
}

// works
y({name: "FirstName", age: "19", load: function () {alert('hai')}, uniq: 0.5233059714082628});

// "safer"
y(({name: "FirstName", age: "19", load: function () {alert('hai')}, uniq: 0.5233059714082628}));

// how it's supposed to be done
y(x);
Run Code Online (Sandbox Code Playgroud)


Ros*_*lle 5

不是我永远不会做的事情,但值得一提的是,有一些方法可以对函数进行字符串化(即并非不可能)。

采取以下措施:

var func = function(){console.log('logged')};
var strFunc = func.toString();

//then
var parsedFunc = eval('('+strFunc+')');
parsedFunc();

//or simply
eval('('+strFunc+')()');
//or
eval('('+strFunc+')')();
//or
eval('var anotherFunc='+strFunc);
anotherFunc()
Run Code Online (Sandbox Code Playgroud)

上面带有覆盖的toJSON()可以实现一个浅的字符串化函数;

免责声明:在使用之前查看这篇文章和其他文章并做出自己的决定eval()