如下代码,给str赋什么值会使判断成立呢??
String.prototype.abcd = function () {
  return "abcd";
};var str = "ddd";
if(str && typeof str === 'object' && typeof str.abcd === 'function') {
  str = str.abcd();
}
在看json.org上下载的json2.js原码时,看到这样的代码
把原代码中无关的去掉了,想看原始代码请到
https://github.com/douglascrockford/JSON-js/blob/master/json2.js
第241行和第175行

解决方案 »

  1.   

    String.prototype.abcd = function () {
      return "abcd";
    };var str = "ddd";
    if(str && typeof str === 'string' && typeof str.abcd === 'function') {
      str = str.abcd();
    }
      

  2.   

    脑筋急转弯?var str = new String("ddd");
      

  3.   

    怪了...这样的写法我确实尝试过,但在调试的时候发现条件不成立啊...
    如下代码,调试的时候发现并没有如预期的进入str()函数里啊...
    update.........发现....只有在IE8中才存在这问题...IE6、IE7和其他浏览器都正常...就这该死的IE8会这样...浪费了我半天时间....
    // 很多浏览器都已经内置JSON对象了,如果用同样的名字的话,调试的时候发现还是调用内置的JSON对象
    var JSON2;
    if (!JSON2) {
      JSON2 = {};
    }
    (function () {
      "use strict";
      function f(n) {
        return n < 10 ? '0' + n : n;
      }
      if (typeof Date.prototype.toJSON !== 'function') {
        Date.prototype.toJSON = function (key) {
          return isFinite(this.valueOf()) ?
            this.getUTCFullYear()     + '-' +
            f(this.getUTCMonth() + 1) + '-' +
            f(this.getUTCDate())      + 'T' +
            f(this.getUTCHours())     + ':' +
            f(this.getUTCMinutes())   + ':' +
            f(this.getUTCSeconds())   + 'Z' : null;
        };
        String.prototype.toJSON  =
        Number.prototype.toJSON  =
        Boolean.prototype.toJSON = function (key) {
          return this.valueOf();
        };
      }
      var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
          escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
          gap,
          indent,
          meta = {
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
          },
          rep;
      function quote(string) {
        escapable.lastIndex = 0;
        return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
          var c = meta[a];
          return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
        }) + '"' : '"' + string + '"';
      }
      
      function str(key, holder) {
        var i,k,v,length,mind = gap,partial,value = holder[key];
    // If the value has a toJSON method, call it to obtain a replacement value.
        if (value && typeof value === 'object' && typeof value.toJSON === 'function') {
          value = value.toJSON(key);
        }
        if (typeof rep === 'function') {
          value = rep.call(holder, key, value);
        }
        switch (typeof value) {
          case 'string':
            return quote(value);
          case 'number':
            return isFinite(value) ? String(value) : 'null';
          case 'boolean':
          case 'null':
            return String(value);
          case 'object':
            if (!value) {
              return 'null';
            }
            gap += indent;
            partial = [];
            if (Object.prototype.toString.apply(value) === '[object Array]') {
              length = value.length;
              for (i = 0; i < length; i += 1) {
                partial[i] = str(i, value) || 'null';
              }
              v = partial.length === 0 ? '[]' : gap ?
                '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' :
                '[' + partial.join(',') + ']';
              gap = mind;
              return v;
            }
            if (rep && typeof rep === 'object') {
              length = rep.length;
              for (i = 0; i < length; i += 1) {
                if (typeof rep[i] === 'string') {
                  k = rep[i];
                  v = str(k, value);
                  if (v) {
                    partial.push(quote(k) + (gap ? ': ' : ':') + v);
                  }
                }
              }
            } else {
              for (k in value) {
                if (Object.prototype.hasOwnProperty.call(value, k)) {
                  v = str(k, value);
                  if (v) {
                    partial.push(quote(k) + (gap ? ': ' : ':') + v);
                  }
                }
              }
            }
            v = partial.length === 0 ? '{}' : gap ?
              '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' :
              '{' + partial.join(',') + '}';
            gap = mind;
            return v;
          }
        }
        if (typeof JSON2.stringify !== 'function') {
          JSON2.stringify = function (value, replacer, space) {
            var i;
            gap = '';
            indent = '';
            if (typeof space === 'number') {
              for (i = 0; i < space; i += 1) {
                indent += ' ';
              }
            } else if (typeof space === 'string') {
              indent = space;
            }
            rep = replacer;
            if (replacer && typeof replacer !== 'function' && (typeof replacer !== 'object' || typeof replacer.length !== 'number')) {
              throw new Error('JSON2.stringify');
            }
            return str('', {'': value});
          };
        }
        if (typeof JSON2.parse !== 'function') {
          JSON2.parse = function (text, reviver) {
            var j;
            function walk(holder, key) {
              var k, v, value = holder[key];
              if (value && typeof value === 'object') {
                for (k in value) {
                  if (Object.prototype.hasOwnProperty.call(value, k)) {
                    v = walk(value, k);
                    if (v !== undefined) {
                      value[k] = v;
                    } else {
                      delete value[k];
                    }
                  }
                }
              }
              return reviver.call(holder, key, value);
            }
            text = String(text);
            cx.lastIndex = 0;
            if (cx.test(text)) {
              text = text.replace(cx, function (a) {
                return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
              });
            }
            if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
              .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
              .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
              j = eval('(' + text + ')');
              return typeof reviver === 'function' ? walk({'': j}, '') : j;
            }
              throw new SyntaxError('JSON2.parse');
          };
      }
    }());var data = {
      "str":new String("sdf"),
      "num":1,
      "arr":[1,4,7]
    };alert(JSON2.stringify(data));