对象和哈希之间的区别?
在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! 永远不要在生产代码中分配给Object
types的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会有类似的提升)。
基本上发生的是:
- 为了实现一个dynamic的对象,可以在其上快速添加和删除属性 – 散列表是最简单的解决scheme – 但速度不如Java中的常规对象(随机访问…)。
- 如果你的对象是一个普通的对象(具有按特定顺序设置的最后一组属性等),或者一个哈希表,V8所做的就是基于less量策略来猜测。 起初,它假定这是一个简单的对象,每个新的属性都会导致创build一个对象的新结构,并复制旧对象和新属性。 如果对象被分类为“困难” – 它将被移到一个安静的地方。
- 如果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中的对象只是键/值属性],因此混乱。