对象和哈希之间的区别?

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

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

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

没有任何 所有这三个字面上是平等的。

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

 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 

在其他语言(如Java和C#)中,可以在散列表/散列映射中使用任何对象(而不仅仅是string或数字)作为关键字,而JavaScript中则不是这样:将键简单地转换为string。

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

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

免责声明:我写了jshashtable。

你们的样本没有任何区别。 它们都是具有命名属性的对象。 您刚刚显示了创build/引用这些属性的不同方法。

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

每次调用对象的方法,属性,或者只是引用任何variables,就执行内部哈希查找。

他们是一样的。

你可以交换使用它们。

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

他们是一样的。 就像[]new Array()一样。

有关JavaScript核心types的更多信息,请参阅MDC Core JavaScript 1.5参考 。

如果你想certificate{}new Object()相同:

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

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

技术上,他们是一样的。 当你编写代码时,你可以很容易地做myobject['someproprty' + 'somethingElseConcatenated] ,当你使用“点符号”的myobject.someproperty你不能这样做 – myobject.someproperty就是你所能做的。

ECMAscript的作者之一道格拉斯·克罗克福德(Douglas Crockford)build议不要使用var a = new Object()语法,因为我不太明白。 无论如何,如果你感兴趣的话,值得一看他的演示(它由几个部分组成,第一个是http://video.yahoo.com/watch/111593/1710507

每个引擎(浏览器)都以不同的方式实现,但让我们关注于Chrome的V8(基于一年前在大多数现代浏览器上执行的性能testing,如果您遵循V8指南,它们的performance会有类似的提升)。

基本上发生的是:

  1. 为了实现一个dynamic的对象,可以在其上快速添加和删除属性 – 散列表是最简单的解决scheme – 但速度不如Java中的常规对象(随机访问…)。
  2. 如果你的对象是一个普通的对象(具有按特定顺序设置的最后一组属性等),或者一个哈希表,V8所做的就是基于less量策略来猜测。 起初,它假定这是一个简单的对象,每个新的属性都会导致创build一个对象的新结构,并复制旧对象和新属性。 如果对象被分类为“困难” – 它将被移到一个安静的地方。
  3. 如果v8注意到太多的“错误” – 它将所有的东西都移动到哈希表中 – 所以你得到的性能很差(这就是为什么你要使用构造函数来初始化所有的成员或结构在JSON里)

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

http://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

希望能帮助到你…

实际上,在JavaScript中并没有什么叫做“hashtable”或“hashmap”。 JavaScript中的对象就像一个“哈希”[JavaScript中的对象只是键/值属性],因此混乱。