首页 文章

如何在Dart中查明变量是否存在

提问于
浏览
3

在JavaScript中,我可以使用“in”运算符来检查变量是否存在 . 所以,也许这段代码可以正常工作 .

index.html

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>Using in operator</title>
 </head>
 <body>
  <div id="div1">hello</div>
  <script>
   document.someValue = "testValue";
   if( 'someValue' in document ) {
    document.getElementById('div1').innerHTML = document.someValue;
   }else{
    document.getElementById('div1').innerHTML = "not found";
   }
  </script>
 </body>
</html>

结果,div1的最终内容将是“testValue” . 但是,Dart没有“in”运算符 . 在Dart中,HtmlDocument类确实有contains()方法 . 但是,方法的参数类型是Node,而不是String . 我也试过这段代码 .

print( js.context['document'] );
print( js.context['document']['someValue'] );

“js.context ['document']”运行良好并返回HtmlDocument对象的实例 . 但是,“js.context ['document'] ['someValue']”完全不起作用 . 这不返回任何错误或没有错误 .

在Dart中有没有办法检查变量的存在? :-(

谢谢你的阅读!

2 回答

  • 4

    没有简单的方法来检查对象是否具有任意成员 .

    如果您希望Dart对象具有字段,您可能会这样做,因为您希望它实现具有该字段的接口 . 在这种情况下,只需检查类型:

    if (foo is Bar) { Bar bar = foo; print(bar.someValue); }
    

    Dart对象的属性在创建后不会更改 . 它有成员,或者没有成员,类型决定了它 .

    如果你希望对象拥有该成员,但你不知道声明该成员的类型(那么你可能做的事情有点太棘手了,但是)那么你可以尝试在try catch中使用它 .

    var someValue = null;
    try {
      someValue = foo.someValue;
    } catch (e) {
      // Nope, wasn't there.
    }
    

    对于真正的探索性编程,您可以使用 dart:mirrors 库 .

    InstanceMirror instance = reflect(foo);
    ClassMirror type = instance.type;
    MethodMirror member = type.instanceMembers[#someValue];
    if (member != null && member.isGetter) {
      var value = instance.getField(#someValue).reflectee;  // Won't throw.
      // value was there.
    } else {
      // value wasn't there.
    }
    
  • 2

    假设你使用dart:js你可以使用JsObject.hasProperty

    js.context.hasProperty('someValue');
    

相关问题