【问题标题】:Object.keys not working in internet ExplorerObject.keys 在 Internet Explorer 中不起作用
【发布时间】:2013-09-25 14:46:01
【问题描述】:

我有一个程序可以从字典中返回一个键列表。该代码在 Chrome、Opera 和 Firefox 中正常工作,但在 Internet Explorer 中不能正常工作。 我已添加警报 cmets 以关闭问题所在。下面是导致问题的代码。警报按顺序显示

  • 应用初始化
  • 获取 JSON
  • 得到 JSON
  • 得到密钥(在 IE 中不显示)

我发现了一个类似的问题 here,但我相信在这个例子中这不是正确的问题,因为我创建了字典,所以它是一个原生对象。

我不再确定 Object.keys 是问题所在,所以这里有一个完整页面的链接。 I JavaScript 在页面中以便于查看

http://www.londonlayout.co.uk/dev/live.htm

 var myApp = {
    init: function () {
        var def = $.Deferred();
        alert('App Initializing');
        $.getJSON('data/data.json', function (raw) {
            alert('Getting JSON');
            myApp.data = raw;
            $.each(myApp.data, function (code, details) {
                try {
                    myApp.nameDict[details.name] = code;
                }
                catch (e) {}
            });
            alert('Got JSON');
            myApp.names = Object.keys(myApp.nameDict);
            alert('Got Keys')
            def.resolve();
        });
        return def.promise();
    },
    data: {},
    nameDict: {}
}

【问题讨论】:

  • 如果在 IE 9 之前,解决方案如下:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… as Object.keys();不适用于IE9以下版本
  • 我使用的是版本 10
  • 点击右上角的齿轮。然后“关于 Internet Explorer”说版本 10.0.9200.16686
  • 好吧,我已经检查过了,我建立的另一个页面使用 Object.keys 并在我的 Internet Explorer 版本上成功运行。但是有些东西使这条线不起作用

标签: javascript internet-explorer


【解决方案1】:

Object.keysnot avaiable in IE < 9。作为一个简单的解决方法,您可以使用:

if (!Object.keys) {
  Object.keys = function(obj) {
    var keys = [];

    for (var i in obj) {
      if (obj.hasOwnProperty(i)) {
        keys.push(i);
      }
    }

    return keys;
  };
}

这是一个更全面的 polyfill:

// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
if (!Object.keys) {
  Object.keys = (function () {
    'use strict';
    var hasOwnProperty = Object.prototype.hasOwnProperty,
        hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
        dontEnums = [
          'toString',
          'toLocaleString',
          'valueOf',
          'hasOwnProperty',
          'isPrototypeOf',
          'propertyIsEnumerable',
          'constructor'
        ],
        dontEnumsLength = dontEnums.length;

    return function (obj) {
      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
        throw new TypeError('Object.keys called on non-object');
      }

      var result = [], prop, i;

      for (prop in obj) {
        if (hasOwnProperty.call(obj, prop)) {
          result.push(prop);
        }
      }

      if (hasDontEnumBug) {
        for (i = 0; i < dontEnumsLength; i++) {
          if (hasOwnProperty.call(obj, dontEnums[i])) {
            result.push(dontEnums[i]);
          }
        }
      }
      return result;
    };
  }());
}

【讨论】:

  • 在您的第一个代码部分中,您有一行表示仅在 object.keys 不存在时才使用此代码。一旦你创建了一个工作,为什么你不会在所有情况下都使用它
  • @PeterSaxton 因为 shim 的性能可能比原生版本低很多。
  • 我实际上一直认为内置函数有很多包袱来检查每一种可能的可能性,从而导致整个过程变慢。这是一个相当大的启示
  • @PeterSaxton 是的,那些对“所有可能的可能性”的检查可能会捕捉到大多数开发人员会错过的一堆东西。你真的想确保那些“边缘情况”得到处理。
【解决方案2】:

或者,如果您可以访问 lodash,您可以使用 keys。例如

_.keys(yourObj);

【讨论】:

    猜你喜欢
    • 2012-06-07
    • 2015-03-16
    • 2012-05-06
    • 2011-06-02
    • 2015-12-17
    • 2013-04-30
    • 1970-01-01
    • 2012-03-23
    • 2012-07-06
    相关资源
    最近更新 更多