【问题标题】:Difference between an object and a hash?对象和哈希之间的区别?
【发布时间】:2010-11-11 17:24:08
【问题描述】:

在 JavaScript 中,对象和哈希有什么区别?你如何创造一个与另一个,你为什么要关心?下面的代码示例有区别吗?

var kid = {
 name: "juni",
 age: 1
}

还有:

var kid = new Object();
kid.name = "juni";
kid.age = 1;

还有:

var kid = new Object();
kid["name"] = "juni";
kid["age"] = 1;

你能想到我应该说明的任何其他代码示例吗?

这里的核心问题对象和哈希有什么区别?

【问题讨论】:

  • 我认为您的陈述“and object 和 hash 之间的差异”是指“and object 和 (hash)map 之间的差异”。
  • 好点...但 Hash 不是真正的 Javascript 类型吗?
  • JavaScript 中不存在哈希类型。 {} 只是 Object 类型的简写初始化器。而[] 只是Array 类型的简写初始化器。
  • 也许是 Prototype Hash 类让我感到困惑:prototypejs.org/api/hash
  • 如果您只是想存储键/值对,那么 Prototype 中绝对不需要那种 'Hash' 类型。

标签: javascript json


【解决方案1】:

它们是一样的。

你可以互换使用它们。

【讨论】:

    【解决方案2】:

    根本没有。这三个实际上是相等的。

    【讨论】:

    【解决方案3】:

    您的任何样品都没有任何差异。它们都是具有命名属性的对象。您刚刚展示了创建/引用这些属性的不同方式。

    【讨论】:

      【解决方案4】:

      我认为这都是一样的。第三个版本可以与动态属性名称一起使用。第一个写的最短。

      【讨论】:

        【解决方案5】:

        它们是可以互换使用的不同符号系统。在很多情况下,使用方括号语法 [ ] 可能更有吸引力,例如在使用变量引用对象时。

        var temp  = "kid";
        var obj = new Object();
        obj[temp] = 5; // this is legal, and is equivalent to object.kid
        obj.temp = 5; // this references literally, object.temp
        

        【讨论】:

          【解决方案6】:

          它们是一样的。正如[]new Array() 是一样的。

          有关 JavaScript 核心类型的更多信息,请查看MDC Core JavaScript 1.5 reference

          如果您想证明{}new Object() 相同:

          Object.prototype.helloWorld = function () { alert('Foo!'); };
          var a = new Object();
          var b = {};
          a.helloWorld();
          b.helloWorld();
          

          !!!警告 ACHTUNG AVERTISSEMENT !!! 永远不要在生产代码中分配给Object 类型的prototype 属性。您将污染整个全局命名空间。

          【讨论】:

            【解决方案7】:

            实际上,JavaScript 中没有所谓的“hashtable”或“hashmap”。 JavaScript 中的对象表现得像一个“哈希”[JavaScript 中的对象只是键/值属性],因此会造成混淆。

            【讨论】:

              【解决方案8】:

              实际上,JavaScript 中的每个对象都是一个哈希。这是对象的属性和方法的散列。事实上,Javascript 中的所有内容都是一个哈希(即名称/值对的列表)。

              每次调用对象的方法、属性或仅引用任何变量时,都会执行内部哈希查找。

              【讨论】:

              • 简而言之,它是一个广义映射,而不是 JavaScript 中每个对象的哈希值。在 Java、C# 等语言中,映射用于同质类型的数据,而在 JavaScript 中,map 的数据只是异构的。
              【解决方案9】:

              在 Java 和 C# 等其他语言中,可以使用任何对象(不仅仅是字符串或数字)作为哈希表/哈希映射中的键,这在 JavaScript 中不是这样:键被简单地转换为字符串。

              var h = {}, k = {};
              h[k] = "One";
              alert( h[ "[object Object]" ] ); // Alerts "One"
              

              使用任意对象作为键会很有用,在这种情况下,您可以使用jshashtable 之类的东西。

              免责声明:我编写了 jshashtable。

              【讨论】:

                【解决方案10】:

                从技术上讲,它们是相同的。编写代码时,您可以轻松地做到myobject['someproprty' + 'somethingElseConcatenated],而使用“点表示法”则无法做到这一点 - myobject.someproperty 是您所能做的。

                ECMAscript 的作者之一 Douglas Crockford 建议不要使用 var a = new Object() 语法,因为某种我不太明白的原因。不管怎样,有兴趣的可以看看他的介绍(由几个部分组成,第一个在这里http://video.yahoo.com/watch/111593/1710507

                【讨论】:

                  【解决方案11】:

                  每个引擎(浏览器)都以不同的方式实现它,但让我们专注于 chrome 的 V8(基于我一年前在大多数现代浏览器上进行的性能测试,如果您遵循 v8 指导方针,它们会提供类似的性能提升)。

                  基本上发生的事情是:

                  1. 要实现一个动态对象,可以在其上动态添加和删除属性 - 哈希表是最简单的解决方案 - 但它的效率不如 java 中的常规对象(随机访问...)。
                  2. V8 所做的是尝试根据少数策略来猜测您的对象是常规对象(具有按特定顺序设置的最终属性集等)还是哈希表。起初它假设这是一个简单的对象,并且每个新属性都会导致创建对象的新结构并在其上复制旧结构以及新属性。如果对象被归类为“困难” - 它会被移动到一个 hushtable。
                  3. 如果 v8 发现太多“错误” - 它将所有内容移动到哈希表中 - 因此性能会很差(这就是为什么要使用构造函数来初始化所有成员或在 json 中初始化的结构...)

                  请查看以下链接: https://developers.google.com/v8/design#prop_access

                  www.quora.com/Are-JavaScript-Objects-implemented-as-HashTables-Is-key-value-access-O-1

                  jayconrod.com/posts/52/a-tour-of-v8-object-representation

                  也是一个很好的讲座: https://www.youtube.com/watch?v=UJPdhx5zTaw

                  希望对你有帮助……

                  【讨论】:

                    猜你喜欢
                    • 2017-10-17
                    • 1970-01-01
                    • 2010-10-26
                    • 2021-04-01
                    • 2012-01-12
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-07-13
                    • 1970-01-01
                    相关资源
                    最近更新 更多