首页 > 解决方案 > 用于访问嵌套数组中元素的 Javascript 点和括号与 python 括号表示法?

问题描述

我想知道为什么用于访问嵌套在字典中的列表中的元素的 Python 语法在 JavaScript 中不起作用。

例如,如果我们有myStorage字典/对象。我想访问元素"maps"

var myStorage = {
  "car": {
    "inside": {
      "glove box": "maps",
      "passenger seat": "crumbs"
     },
    "outside": {
      "trunk": "jack"
    }
  }
};

为什么下面的 Python 样式命令即使在 Python 中也能在 JavaScript 中工作?

myStorage["car"["inside"["glove box"]]];

但是 javascript 中的点和括号表示法有效。

myStorage.car.inside["glove box"];

标签: javascriptpython

解决方案


正如评论中提到的,这是两种不同的语言。C 与 C++ 的语法在某些方面也很相似,但如果您不知道它在后台做什么,它的行为会有所不同。其他语言也一样。语法只是程序员遵循的一组规则,因此“机器”无论是 VM(字节或不同)、编译器还是直接 CPU 都可以以某种方式使用它。

如果你从最底层的部分开始抽象,即 CPU 指令,你会得到低级语言到高级/高级/脚本,并通过各种抽象,即使语法可能相似甚至相同(Python / Ruby / Haskell)使用代码的引擎会表现不同。如果您想同时在 Python 和 JS 中编写代码,那么学习语法只是其中一个步骤。

Python 中的 dot-access 用于getattr()后台,如果缺少此类属性,您将得到一个AttributeError提升。没有要返回的预定义值,因为 Python 会强制程序员在重要的情况下明确表示。

另一方面,对于 JavaScript,如果缺少该属性,则有一个默认值,即您不会收到错误,而是默认的undefined.

然而,当使用 Python 的__dict__属性 ( thing.__dict__[key]) 或vars(object)[key]. 这样,您可以更接近 JS 规则,例如:vars(object).get(key, None),但是某些对象没有__dict__(例如 C/C++/Cython 扩展时这样编写),因此在这种情况下,您还需要检查__slots__属性:

def js_access(obj, key, default=None):
    if hasattr(obj, "__dict__"):
        return getattr(obj, key, default)
    elif hasattr(obj, "__slots__"):
        ...
    elif <other cases>:
        ...

相同/相似的语法,不同的执行规则。


推荐阅读