09月11, 2016

object转化成str字符串

比如说有这样的一个obj对象:

var obj = {
    a: 1,
    b: 2,
    c: function(){}
}

要将它转成字符串,显然JSON.stringify是不科学的,因为上面的不是一个标准的json,如果用JSON.stringify来处理,那么c会丢失。

JSON.stringify中第二个参数能对key、value进行处理,那么我们判断

if(typeof value === "function"){
     return value.toString();
}

这是可以的,但是把它们转回来的时候,通过eval(str)就有问题了。问题在于c的value变成了字符串的function,这明显不是我们要的结果。

于是乎,在网上找了一把。

     //Make an object a string that evaluates to an equivalent object
    //  Note that eval() seems tricky and sometimes you have to do
    //  something like eval("a = " + yourString), then use the value
    //  of a.
    //
    //  Also this leaves extra commas after everything, but JavaScript
    //  ignores them.
    function convertToText(obj) {
        //create an array that will later be joined into a string.
        var string = [];

        //is object
        //    Both arrays and objects seem to return "object"
        //    when typeof(obj) is applied to them. So instead
        //    I am checking to see if they have the property
        //    join, which normal objects don"t have but
        //    arrays do.
        if (typeof(obj) == "object" && (obj.join == undefined)) {
            string.push("{");
            for (prop in obj) {
                string.push(prop, ": ", convertToText(obj[prop]), ",");
            };
            string.push("}");

            //is array
        } else if (typeof(obj) == "object" && !(obj.join == undefined)) {
            string.push("[")
            for(prop in obj) {
                string.push(convertToText(obj[prop]), ",");
            }
            string.push("]")

            //is function
        } else if (typeof(obj) == "function") {
            string.push(obj.toString())

            //all other values can be done with JSON.stringify
        } else {
            string.push(JSON.stringify(obj))
        }

        return string.join("")
    }

较完美地实现了上面的需求(美中不足的是,它的代码生成的string字符串最后一个键值对会多一个,,在IE下可能会报错,至于在上面代码基础上如何打补丁,我就不贴代码了)


扯一下eval吧。

尽管说eval各种不好,但是之所以有eval,才能解析“1+1”的语句。

在实际的项目中,还是用到了大量的eval,我说一下我犯的一些错误:

1.认为eval可以用call来改变作用域,代码如下:

var obj = {d: 1}
eval.call(obj, "d"); //Uncaught ReferenceError: d is not defined(…)

正确的写法应该如下:

with(obj){
    eval(d)
}

2.认为赋值操作可以这样来书写

var a = 3, c = 2;
eval("a") = c //Uncaught ReferenceError: Invalid left-hand side in assignment(…)

但是eval执行的结果,要么是值,要么是一段js的处理,它是不可能被赋值的。

所以正确的写法应该如下:

eval("a="+c)

然而上面的写法可能会有问题,比如说当c的值为“001”时,结果a的值却成了1,或者当c的值是一个日期格式“2016-09-11”时,它做了减法的操作,所以建议在c的前后加一个'

本文链接:www.my-fe.pub/post/object-to-string.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。