将对象转换为可由eval()复制的文本;具有功能对象的异常

时间:2013-02-15 16:13:58

标签: javascript

我的目标是将对象转换为可以使用比如 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:处理无效]

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

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

1 个答案:

答案 0 :(得分:1)

在此代码中:

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

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

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

所以,在你的uneval函数中,执行以下操作:

if ( typeof obj === 'function' ) return '(' + obj.toString() + ')';