关于这个问题我是这么理解的,在js中确实对象是最强大的,任何在其他语言当中的类似对象的数据结构,在js里都可以是对象。但也正因为如此宽泛,让我们的使用过程中会产生一些疑惑或误解,才需要对各种的对象做分类。
所以回过头来再说对象,字典与枚举的关系。
他们的相同点:
他们都是键值对集合(KeyValuePair)
他们的Key都不能重复
他们的不同点:
对象:
对象的的Key可以是字符串类型或数值类型。如果同时包含这两种就类数组对象,比如document.getElementBy...系列函数的返回值:HTMLCollection,再比如HTML元素的子元素集合:NodeList,以及HTML元素的属性值:NamedNodeMap,等都是类数组对象。
对象的Value的类型,可以是任意类型。而且是在一个对象变量中的Value都可以是任意类型,如JSON对象。
字典:
而字典的Key一定是字符串类型的(其他语言中不是,受限于js语言),字典的Value也可以任意类型,但在一个字典对象变量中的所有Value一定是相同类型,也就是说字典其实是个Object<string, TValue>。
例:比如前面刚刚提到的HTML元素的attributes属性值:NamedNodeMap,就是应该一个典型的字典对象:它属于Dictionary<string, Attr>。
但是奇葩的是NamedNodeMap也支持数组下标式访问,所以它同时也是一个List<Attr>,在js里只能归结于他是类数组对象的范畴内了。
枚举:
而最后的枚举对象的范围会更小,枚举的值一般为基本数据类型,在其他语言中甚至只能是数值类型。
例如,定义一个枚举对象用于一组常量:
在TypeScript为了照顾js语言的日常使用,把enum关键字的编译后代码做成了双向访问的类数组对象。
也就是既可以用过名称获得数值,也可以通过数值获得名称。使用非常方便:
【TypeScript代码中的枚举】 enum ownerTypeEnum { public = 0, private } 【编译为JS后的代码】 var ownerTypeEnum; (function (ownerTypeEnum) { ownerTypeEnum[ownerTypeEnum["public"] = 0] = "public"; ownerTypeEnum[ownerTypeEnum["private"] = 1] = "private"; })(ownerTypeEnum || (ownerTypeEnum = {})); // 效果: // ownerTypeEnum.private -> 1 // ownerTypeEnum[1] -> "private"