0

我遇到了以下脚本,但不明白第一行。它显然要么返回 JSON.stringify 要么返回匿名函数。这样做最好还是使用传统的function printObj(obj)?另外,JSON 是在哪里定义的?谢谢

var printObj = typeof JSON != "undefined" ? JSON.stringify : function(obj) {
  var arr = [];
  $.each(obj, function(key, val) {
    var next = key + ": ";
    next += $.isPlainObject(val) ? printObj(val) : val;
    arr.push( next );
  });
  return "{ " +  arr.join(", ") + " }";
};

$("#log").append( printObj(object1) );
4

6 回答 6

2
var printObj = // setting the variable printObj
               typeof JSON != 'undefined' // if this is true then set printObj to
                    ? JSON.stringify // <- ...this function
               : function( obj ) {
                   // otherwise let's build it ourselves...
               };

typeof JSON != 'undefined'JSON无论标识符是否已定义,都将返回 true 或 false 。如果尚未定义,typeof x则不会导致引用错误。x

于 2012-10-28T16:16:03.050 回答
1

JSON 已经是一个存在于 javascript 中的函数。(它有stringify并且parse你最有可能使用)

第一行,只是确保存在用于 stringify 的函数,如果不存在,则将对象传递给尝试解析 JSON 对象并将其作为 JSON 字符串返回的函数函数。

(我相信您正在使用的“hack”功能是为了解决IE8 兼容性问题,其中 IE8 没有 JSON 对象。如果您在页面中设置,则可以完全避免使用它:

<meta http-equiv="X-UA-Compatible" content="IE=8" />

此外,第一行赋值的结构使用了一种叫做三元运算符赋值的东西。

例如:

var t = 1 == 1 ? 1 : 0;
于 2012-10-28T16:09:09.633 回答
1

JSON 是一些 Web 浏览器(如 FireFox 和 Chrome)自动定义的变量。旧版本的 IE 没有定义 JSON,很多烦人的用户还有这些版本,所以在这种情况下是手动定义的。

我认为最好的解决方案是添加对 json 库的引用。可以在这里找到:http: //www.json.org/js.html

于 2012-10-28T16:09:20.180 回答
1

它定义了一个printObj始终可以使用的函数:

  • 如果定义了 JSON.stringify,printObj 就是这个函数
  • 如果 JSON.stringify 不可用,则使用新函数

注意

  • 这只有在你想支持 IE7 时才有意义,因为现代浏览器都有 JSON.stringify
  • {...}如果 obj 是一个数组(它构建一个字符串),则替换函数无法正常工作
于 2012-10-28T16:09:31.927 回答
1

“我遇到了以下脚本,但不理解第一行。它显然返回 JSON.stringify 或匿名函数。

看来您确实了解第一行。

“这样最好还是用传统的function printObj(obj)

简单地定义函数将产生不同的结果,因为本机JSON.stringify将被忽略,并且应该优先于 shim。

问题中给出的替代方案不是一个完整的垫片,即使是这样,本地人肯定会表现得更好。

“另外,JSON 是在哪里定义的?”

默认情况下,它在 ECMAScript 5 环境中定义。

于 2012-10-28T16:10:53.517 回答
1

使用这种语法,您可以在创建函数的同时检查是否存在合适的内置方法。JSON 是一些现代浏览器内置到引擎中的对象,很像 Window 或 Location。较旧的浏览器没有 JSON,因此会返回 undefined,并允许使用自定义匿名函数。

于 2012-10-28T16:13:29.443 回答