对象和哈希之间的区别?

时间:2009-07-17 14:05:12

标签: javascript json

在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;

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

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

11 个答案:

答案 0 :(得分:55)

没有。所有这三者在字面上都是平等的。

答案 1 :(得分:18)

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

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

答案 2 :(得分:6)

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

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

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

免责声明:我写过jshashtable。

答案 3 :(得分:4)

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

答案 4 :(得分:4)

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

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

答案 5 :(得分:3)

他们是一样的。

你可以互换使用它们。

答案 6 :(得分:3)

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

答案 7 :(得分:2)

他们是一样的。就像[]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 !!! 永远不要在生产代码中分配prototype类型的Object属性。你将污染整个全局命名空间。

答案 8 :(得分:1)

从技术上讲,它们是一样的。当您编写代码时,您可以轻松地执行myobject['someproprty' + 'somethingElseConcatenated],这在使用“点符号”时无法执行 - myobject.someproperty就是您所能做的。

ECMAscript的autors之一道格拉斯·克罗克福德建议不要使用var a = new Object()语法,因为某些原因我没有抓到。无论如何,如果你对它感兴趣,它值得观看他的演示文稿(它由几部分组成,第一部分在这里http://video.yahoo.com/watch/111593/1710507

答案 9 :(得分:1)

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

它基本上发生的是:

  1. 要实现一个动态对象,可以在其上动态添加和删除属性 - 哈希表是最简单的解决方案 - 但速度方面它不如java中的常规对象(随机访问...)那样高效。
  2. 如果您的对象是常规对象(具有按特定顺序设置的最终属性集等等)或哈希表,V8会根据几种策略进行猜测。首先,它假定这是一个简单的对象,每个新属性都会导致创建一个新的对象结构,并复制旧对象和新属性。如果对象被分类为&#34;困难&#34; - 它被移到了一个hushtable。
  3. 如果v8注意到太多&#34;错误&#34; - 它将所有东西都移动到哈希表 - 因此你的性能很差(这就是为什么你要使用构造函数来初始化你在json中的所有成员或结构......)
  4. 请看这个链接: 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

    希望它有所帮助...

答案 10 :(得分:0)

实际上,JavaScript中没有任何名为“hashtable”或“hashmap”的东西。 JavaScript中的对象表现得像'hash'[JavaScript中的对象只是键/值属性],因而混乱。