【问题标题】:Javascript expression: object array;Javascript 表达式:对象数组;
【发布时间】:2016-08-22 16:25:59
【问题描述】:

我正在使用 ng-flow 示例进行基本图像上传。我看到了一个我不明白它是如何工作的表达式。

基本上就是这样的表达方式:

<p>Demo object array expression in Javascript:</p>
<p id="demo"></p>

<script>
  var expr = !!{png:1,gif:1,jpg:1,jpeg:1}['pdf', 'gif', 'jpg'];
  document.getElementById("demo").innerHTML = expr ;
</script>

如果数组在最后一个元素中有一个有效的图像,上面的意思似乎返回true。我不知道为什么,但是在我研究了代码之后,这是我的结论。

如果有人可以帮助我理解上述内容并给我一个文档链接,我将不胜感激。我到处搜索,但没有找到任何参考。

Click here to see the html which has this expression from ng-flow

我认为代码的目的是在文件不是图像时禁用文件的上传。

任何人都可以推荐和更简单的替代方案,请告诉我。

塔雷克

【问题讨论】:

  • 您在链接到的页面上的哪个位置看到该表达式?它有!!{png:1,gif:1,jpg:1,jpeg:1}[$file.getExtension()]
  • 这正是你提到的那个。我只是简化了它,并将 [$file.getExtension()] 替换为 ['pdf', 'gif', 'jpg']。
  • 但是$file.getExtension() 只是一个字符串,而不是 3 个字符串。你没有简化它,而是让它变得更加混乱。

标签: javascript expression ng-flow


【解决方案1】:

该语句实际上有很多内容,但主要是布尔逻辑。

首先看声明['pdf', 'gif', 'jpg']。这包含 javascript , 运算符,它将包含它的语句的返回值设置为最后一个逗号之后的值。

例如

var a = 1, 2, 'foo'; // a -> 'foo'

var foo = ['a', 'b', 'c'];
foo[0, 2, 1]; // foo[0, 2, 1] -> foo[1] -> 'b' 

在这种情况下,它解析为['jpg']

这里的一些文档:

Javascript comma operator

您可能已经猜到了,! 返回一个布尔表达式,它将truthytrue 语句的值反转为false,将falseyfalse 语句的值反转为true .

{png:1,gif:1,jpg:1,jpeg:1}['jpg'];1,这是一个 truthy 值。 !1 变为 false。最后!false 就是true

在这里查看更多:

Truthy

Falsy

Logical operators

【讨论】:

  • 这个表达式似乎是在故意混淆视听。 ['pdf', 'gif', 'jpg'] 看起来像一个字符串数组,但实际上它被用作对象的属性访问器。
  • @Barmar 是的,他们在这里使用它是没有意义的
  • 我什至不确定他是从哪里弄来的。它不在问题的链接中。
  • 好的,我明白了。所以它实际上是使用 [] 括号来获取对象属性。我还以为是数组。因此,如果该属性未定义,它将是“未定义”,这就是它使用双重否定的原因。谢谢...!
  • @tarekahf 它还使用双重否定将 1 转换为 true ,但这可以通过将对象更改为 {png:true, gif:true, jpg: true, jpeg: true} 来完成。我猜他们用1 让它更短。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多