在Actionscript 3中,"in"运算符和"hasOwnProperty"方法之间有什么区别?

Mic*_*yer 15 actionscript actionscript-3

"in"运算符和"hasOwnProperty"方法似乎是可以互换的,但我想知道是否正在检查继承的属性或其他东西,而另一个不是或类似的东西.我对使用字典的情况特别感兴趣,但我怀疑它与其他用途不同.

"hasOwnProperty"在这里的官方文档中描述,"in" 在这里描述,但如果有区别,我没有发现它非常清楚.

Mic*_*yer 14

相信这个宝贵的答案实际上让我有点麻烦.似乎有更多的事情发生,而不仅仅是与原型相关的差异.我发现的是

当该键是引用类型时,hasOwnProperty不能用于查看字典中是否存在键,但是in运算符可以.

这是一个展示的例子.

码:

var test:Function = function(key:*,label:String):void
    {
        var d:Dictionary = new Dictionary(true);
        d[key] = true;
        trace(label);
        trace("  hasOwnProperty: " + (d.hasOwnProperty(key)?"true":"false <== !!PROBLEM!!"));
        trace("  in: " + (key in d));
        trace("  []: " + d[key]);
    };
test({}, "indexed by object");
test("string", "key is string");
test(0, "key is number");
test(true, "key is boolean");
Run Code Online (Sandbox Code Playgroud)

结果:

indexed by object
  hasOwnProperty: false <== !!PROBLEM!!
  in: true
  []: true
key is string
  hasOwnProperty: true
  in: true
  []: true
key is number
  hasOwnProperty: true
  in: true
  []: true
key is boolean
  hasOwnProperty: true
  in: true
  []: true
Run Code Online (Sandbox Code Playgroud)

  • 而且还有更多.hasOwnProperty不支持静态查找.例如,`**静态属性**` - 在对象的定义类或其任何超类中使用static关键字定义的变量,常量或方法; 和`**Prototype属性**` - 在原型对象上定义的属性,它是对象原型链的一部分.`将返回`false`. (2认同)