2

我正在查看兼容表,似乎 IE 11 支持所有 ES5,除了(在 Miscellaneous 下)此功能:“可枚举的属性可以被不可枚举的对象遮蔽”。尽管提供了示例,但我不明白这意味着什么。

由于 IE11 支持大部分ES5 shim,我可以摆脱它吗?

4

2 回答 2

4

在此处输入图像描述是的,在这种情况下放弃 ES5 shim 是安全的。我让网站可用 IE11,常见问题是自定义变量、显然是 ES6 和 CSS calc() 相关的错误。设法使用地图制作了我自己的自定义变量模拟器,并使用了类似的方法 CSS calc()。

于 2018-06-14T19:57:34.887 回答
2

他们在这里使用的length属性,实际上来自Function构造函数的原型,Function.prototype.length并返回function. 正如您在我链接的页面上看到的那样,该属性不可枚举,因此for ... in不应枚举给定的属性。以下代码段演示了该属性不可枚举,因此result将保留true

var result = true;
for(var propertyName in Function) {
  if(propertyName == 'length') {
    result = false;
  }
}

var isLengthEnumerable = Function.prototype.propertyIsEnumerable('length');
console.log('Function.prototype.length is enumerable: ' + isLengthEnumerable);
console.log('Result: ' + result);

上面的代码片段为我们提供了以下输出:

Function.prototype.length 是可枚举的:false
结果:true

Object.prototype但在 javascript 中,一切都是对象,并通过其原型链继承属性,包括Function. 那么当我们将相同的属性分配给 时会发生length什么Object.prototype

var result1 = true;
var result2 = true;
Object.prototype.length = 42;
Object.prototype.otherProperty = 42;
for (var propertyName in Function) {
    if (propertyName == 'length') {
        result1 = false;
    }
    if (propertyName == 'otherProperty') {
        result2 = false;
    }
}

var isLengthEnumerable = Object.prototype.propertyIsEnumerable('length');
var isOtherPropertyEnumerable = Object.prototype.propertyIsEnumerable('otherProperty');
console.log('Object.prototype.length is enumerable: ' + isLengthEnumerable);
console.log('Object.prototype.otherProperty is enumerable: ' + isOtherPropertyEnumerable);
console.log('Result1: ' + result1);
console.log('Result2: ' + result2);

上面的代码片段为我们提供了以下结果:

Object.prototype.length 可枚举:真
Object.prototype.otherProperty 可枚举:真
结果1:真 结果
2:假

由于Object.prototype.length我们刚刚分配的属性可枚举的,你会认为result1现在是false. 但是因为Function已经有了一个length属性(虽然不是可枚举的),所以length继承自的属性Object.prototype是不会枚举的。该物业已被遮蔽

这在 IE11 中是不会发生的,Object.prototype.length无论如何都会有枚举,result1也会变成false这样。

于 2018-06-14T21:22:51.890 回答