0

我的目标是将对象转换为文本形式,可以使用localStorage进行存储,然后使用 eval() 检索并转换回其原始对象形式。我编写了一个名为 uneval() 的函数来转换为文本,如下所示:

function uneval(obj){
// Convert object to a string that can be evaluated with eval() to its original
if(obj===null)return 'null';
     if(typeof obj === 'number' || typeof obj === 'boolean')return ''+obj;
if(typeof obj === 'string')return '"'+obj+'"';
if(Object.prototype.toString.call(obj) === '[object Array]')
{   var str = '[', i=0, l=obj.length;
    for(i;i<l;i++)str+= (i==0?'':',') + uneval(obj[i]);
    return str+']';
}
if(typeof obj === 'object')
{   var str='({', i;
    for (i in obj)str+= (2==str.length?'':',') + i + ':' + uneval(obj[i]);
    return str+='})';
}
if(typeof obj === 'function')return '(' + obj.toString() + ')';

return '';}

[编辑 1:{} 中的对象需要使用 eval() 成功转换括号]

[编辑 2:修改功能代码以在功能代码字符串周围放置括号]

[编辑 3:更改为用于递归避免 arguments.callee 的命名函数]

[编辑 4:处理空值]

请注意,此函数保留嵌套结构。它可以正常工作(至少在 Google Chrome 和 MS IE8 中),除非对象或对象的项是函数。我通过将字符串形式的函数分配给一个不太可能的变量(如“_=”)找到了一种解决方法。这就是工作。没有它,我会从 eval() 中得到一个语法错误。谁能解释一下为什么会这样?

顺便说一句,我可以通过在 _ 本地化的覆盖函数中调用 eval() 来避免使用 _ 作为变量发生冲突的可能性很小。

4

1 回答 1

1

在这段代码中:

var func = eval('function () {}');

eval将字符串解析为函数声明,而不是函数表达式,并且由于函数声明不能​​是匿名的,因此会引发语法错误。为了确保您的字符串被解析为函数表达式,而不是声明,只需在字符串的开头和结尾添加括号即可。这些父母将被解析为分组运算符。然后将分组运算符的内容解析为表达式;在这种情况下,一个函数表达式。

var func = eval('(function () {})'); // doesn't throw

因此,在您的uneval函数中,执行以下操作:

if ( typeof obj === 'function' ) return '(' + obj.toString() + ')';
于 2013-02-15T18:06:16.687 回答