Converting an object to a string

后端 未结 30 2480
北荒
北荒 2020-11-22 03:29

How can I convert a JavaScript object into a string?

Example:

var o = {a:1, b:2}
console.log(o)
console.log(\'Item: \' + o)

Output:

30条回答
  •  生来不讨喜
    2020-11-22 04:14

    JSON methods are quite inferior to the Gecko engine .toSource() primitive.

    See the SO article response for comparison tests.

    Also, the answer above refers to http://forums.devshed.com/javascript-development-115/tosource-with-arrays-in-ie-386109.html which, like JSON, (which the other article http://www.davidpirek.com/blog/object-to-string-how-to-deserialize-json uses via "ExtJs JSON encode source code") cannot handle circular references and is incomplete. The code below shows it's (spoof's) limitations (corrected to handle arrays and objects without content).

    (direct link to code in //forums.devshed.com/ ... /tosource-with-arrays-in-ie-386109)

    javascript:
    Object.prototype.spoof=function(){
        if (this instanceof String){
          return '(new String("'+this.replace(/"/g, '\\"')+'"))';
        }
        var str=(this instanceof Array)
            ? '['
            : (this instanceof Object)
                ? '{'
                : '(';
        for (var i in this){
          if (this[i] != Object.prototype.spoof) {
            if (this instanceof Array == false) {
              str+=(i.match(/\W/))
                  ? '"'+i.replace('"', '\\"')+'":'
                  : i+':';
            }
            if (typeof this[i] == 'string'){
              str+='"'+this[i].replace('"', '\\"');
            }
            else if (this[i] instanceof Date){
              str+='new Date("'+this[i].toGMTString()+'")';
            }
            else if (this[i] instanceof Array || this[i] instanceof Object){
              str+=this[i].spoof();
            }
            else {
              str+=this[i];
            }
            str+=', ';
          }
        };
        str=/* fix */(str.length>2?str.substring(0, str.length-2):str)/* -ed */+(
            (this instanceof Array)
            ? ']'
            : (this instanceof Object)
                ? '}'
                : ')'
        );
        return str;
      };
    for(i in objRA=[
        [   'Simple Raw Object source code:',
            '[new Array, new Object, new Boolean, new Number, ' +
                'new String, new RegExp, new Function, new Date]'   ] ,
    
        [   'Literal Instances source code:',
            '[ [], {}, true, 1, "", /./, function(){}, new Date() ]'    ] ,
    
        [   'some predefined entities:',
            '[JSON, Math, null, Infinity, NaN, ' +
                'void(0), Function, Array, Object, undefined]'      ]
        ])
    alert([
        '\n\n\ntesting:',objRA[i][0],objRA[i][1],
        '\n.toSource()',(obj=eval(objRA[i][1])).toSource(),
        '\ntoSource() spoof:',obj.spoof()
    ].join('\n'));
    

    which displays:

    testing:
    Simple Raw Object source code:
    [new Array, new Object, new Boolean, new Number, new String,
              new RegExp, new Function, new Date]
    
    .toSource()
    [[], {}, (new Boolean(false)), (new Number(0)), (new String("")),
              /(?:)/, (function anonymous() {}), (new Date(1303248037722))]
    
    toSource() spoof:
    [[], {}, {}, {}, (new String("")),
              {}, {}, new Date("Tue, 19 Apr 2011 21:20:37 GMT")]
    

    and

    testing:
    Literal Instances source code:
    [ [], {}, true, 1, "", /./, function(){}, new Date() ]
    
    .toSource()
    [[], {}, true, 1, "", /./, (function () {}), (new Date(1303248055778))]
    
    toSource() spoof:
    [[], {}, true, 1, ", {}, {}, new Date("Tue, 19 Apr 2011 21:20:55 GMT")]
    

    and

    testing:
    some predefined entities:
    [JSON, Math, null, Infinity, NaN, void(0), Function, Array, Object, undefined]
    
    .toSource()
    [JSON, Math, null, Infinity, NaN, (void 0),
           function Function() {[native code]}, function Array() {[native code]},
                  function Object() {[native code]}, (void 0)]
    
    toSource() spoof:
    [{}, {}, null, Infinity, NaN, undefined, {}, {}, {}, undefined]
    

提交回复
热议问题