Javascript 对象和散列之间的区别?

Javascript 对象和散列之间的区别?,javascript,json,Javascript,Json,在JavaScript中,对象和散列之间的区别是什么?你如何创造一个与另一个,为什么你会在意?以下代码示例之间是否存在差异 var kid = { name: "juni", age: 1 } 以及: 以及: 你能想到我应该说明的其他代码示例吗 这里的核心问题是对象和散列之间的区别是什么?它们是相同的 你可以互换使用它们。根本没有。这三种情况实际上是相等的。您的任何样品都没有任何差异。它们都是具有命名属性的对象。您刚刚展示了创建/引用这些属性的不同方法。我认为这是一样的。第三个版本可以与动

在JavaScript中,对象和散列之间的区别是什么?你如何创造一个与另一个,为什么你会在意?以下代码示例之间是否存在差异

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

以及:

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

这里的核心问题是对象和散列之间的区别是什么?

它们是相同的


你可以互换使用它们。

根本没有。这三种情况实际上是相等的。

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

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

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

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

它们是一样的。正如
[]
新数组()
一样

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

如果您想证明
{}
新对象()相同


!!!警告:避免决不在生产代码中为
对象
类型的
原型
属性赋值。您将污染整个全局名称空间。

实际上,JavaScript中没有所谓的“hashtable”或“hashmap”。JavaScript中的对象的行为类似于“散列”[JavaScript中的对象只是键/值属性],因此存在混淆

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


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

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

var h = {}, k = {};
h[k] = "One";
alert( h[ "[object Object]" ] ); // Alerts "One"
使用任意对象作为键可能很有用,在这种情况下,您可以使用以下内容


免责声明:我编写了jshashtable。

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

ECMAscript的一位自动作者Douglas Crockford建议不要使用
var a=new Object()
语法,原因是我没有完全理解。无论如何,如果你对他的演示感兴趣,那就值得一看(它由几个部分组成,第一部分在这里)

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

它基本上发生的是:

  • 要实现动态对象,可以动态地添加和删除其属性—哈希表是最简单的解决方案—但在速度上不如java中的常规对象(随机访问…)有效
  • V8所做的是尝试根据一些策略猜测您的对象是否是常规对象(按特定顺序设置了最后一组属性,等等)或哈希表。首先,它假定这是一个简单的对象,每个新属性都会导致创建一个对象的新结构,并复制该对象上的旧结构和新属性。如果该对象被归类为“困难”,则将其移动到hushtable
  • 如果v8注意到太多的“错误”-它会将所有内容移动到哈希表-因此性能很差(这就是为什么要使用构造函数初始化json中初始化的所有成员或结构…)
  • 请参阅以下链接:

    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

    这也是一个非常好的讲座:


    希望能有所帮助……

    我认为您的语句“和对象与散列之间的差异”的意思是“和对象与(散列)映射之间的差异”。很好……但散列不是实际的Javascript类型吗?Javascript中没有散列类型。
    {}
    只是
    对象
    类型的简写初始值设定项。和
    []
    只是
    数组
    类型的简写初始值设定项。也许是原型散列类让我感到困惑:如果您只想存储键/值对,那么原型中绝对不需要该“散列”类型。不正确,或者至少过于简化。这并不是说“它们之间没有区别”它们实际上都是一样的,所以差别的大小不是
    0
    ,而是
    NaN
    。然而……在这里,它们表明不同的
    isObject
    实现可以给出不同的答案。简而言之,它是一个广义映射,而不是JavaScript中每个对象的哈希。在Java、C#和e等语言中tc.,映射用于同质类型的数据,而在JavaScript中,
    map
    的数据只是异构的。
    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
    
    Object.prototype.helloWorld = function () { alert('Foo!'); };
    var a = new Object();
    var b = {};
    a.helloWorld();
    b.helloWorld();
    
    var h = {}, k = {};
    h[k] = "One";
    alert( h[ "[object Object]" ] ); // Alerts "One"