我的目标是将对象转换为可以使用比如 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(),我可以避免使用_作为变量发生冲突的可能性很小。
答案 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() + ')';