相关疑难解决方法(0)

如何有效地计算JavaScript中对象的键/属性数?

计算对象的键/属性数的最快方法是什么?它可以在不迭代对象的情况下完成此操作吗?即没有做

var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) count++;
Run Code Online (Sandbox Code Playgroud)

(Firefox确实提供了一个神奇的__count__属性,但是在版本4的某个地方删除了它.)

javascript performance properties key count

1452
推荐指数
14
解决办法
62万
查看次数

JavaScript中的Map vs Object

我刚刚发现了chromestatus.com,在我失去了几个小时之后,发现了这个功能条目:

地图:地图对象是简单的键/值映射.

那让我困惑.常规的JavaScript对象是字典,所以Map与字典有什么不同?从概念上讲,它们是相同的(根据 地图和字典之间的区别是什么?)

文档chromestatus引用也没有帮助:

映射对象是键/值对的集合,其中键和值都可以是任意ECMAScript语言值.不同的键值只能出现在Map集合中的一个键/值对中.使用在创建Map时选择的比较算法区分不同的键值.

Map对象可以按插入顺序迭代其元素.必须使用散列表或其他机制来实现Map对象,这些机制平均提供对集合中元素数量的次线性访问时间.此Map对象规范中使用的数据结构仅用于描述Map对象所需的可观察语义.它不是一个可行的实施模型.

...对我来说仍然听起来像是一个对象,显然我错过了一些东西.

为什么JavaScript获得(受到良好支持的)Map对象?它有什么作用?

javascript dictionary ecmascript-6

242
推荐指数
11
解决办法
7万
查看次数

ES6 Map和WeakMap有什么区别?

看看这个这个 MDN页面,似乎地图和WeakMaps之间的唯一区别是WeakMaps缺少"大小"属性.但这是真的吗?他们之间有什么区别?

javascript ecmascript-harmony weakmap ecmascript-6

83
推荐指数
6
解决办法
2万
查看次数

为什么JavaScript中的对象不可访问?

为什么默认情况下对象不可迭代?

我一直看到与迭代对象有关的问题,常见的解决方案是迭代对象的属性并以这种方式访问​​对象中的值.这似乎很常见,它让我想知道为什么对象本身不可迭代.

for...of默认情况下,像ES6 这样的语句很适合用于对象.因为这些功能仅适用于不包含{}对象的特殊"可迭代对象" ,所以我们必须通过箍来使这个对我们想要使用它的对象起作用.

for ... of语句创建一个循环迭代可迭代对象 (包括Array,Map,Set,arguments对象等)......

例如,使用ES6 生成器功能:

var example = {a: {e: 'one', f: 'two'}, b: {g: 'three'}, c: {h: 'four', i: 'five'}};

function* entries(obj) {
   for (let key of Object.keys(obj)) {
     yield [key, obj[key]];
   }
}

for (let [key, value] of entries(example)) {
  console.log(key);
  console.log(value);
  for (let [key, value] of entries(value)) {
    console.log(key);
    console.log(value);
  }
}
Run Code Online (Sandbox Code Playgroud)

当我在Firefox(支持ES6)中运行代码时,上面按照我期望的顺序正确记录数据:

hacky的输出

默认情况下,{}对象不可迭代,但为什么?缺点是否超过了可迭代对象的潜在好处?与此相关的问题是什么?

此外,由于{}对象是从"阵列状"集合和"可迭代的对象",如不同NodeList,HtmlCollection以及arguments …

javascript arrays iterator ecmascript-5 ecmascript-6

72
推荐指数
4
解决办法
5万
查看次数

ES6 Map:为什么/何时使用对象或函数作为键?

我已经阅读了Map的内容,并了解了Object与Map之间的区别.我不明白为什么我会使用objectsfunctions作为Map允许的键.

问题:为什么以及何时设置objectfunction作为密钥?

javascript ecmascript-6

15
推荐指数
1
解决办法
1031
查看次数

了解地图与对象MDN文档

有一个问题在这里是类似的,但专门针对"键时,在运行时未知".

Map状态的MDN文档:

当密钥未知时直到运行时,并且当所有键都是相同类型且所有值都是相同类型时,请使用对象上的映射.

当存在对各个元素进行操作的逻辑时使用对象.

我理解有关使用地图的建议"当密钥在运行时才知道".

当所有键都是相同类型且所有值都是相同类型时,我对此行感到困惑.他们试图在那里建议什么?我的意思是,如果我的所有键都不是同一类型,我是否也不会被迫使用Map,因为它支持不同类型的键?另外,为什么值的类型决定了我是使用Map还是Object?

另外,我真的不明白"当存在对各个元素进行操作的逻辑时使用对象".有人能给我一个他们的意思吗?

javascript ecmascript-6

6
推荐指数
1
解决办法
221
查看次数

何时在 ES6 中使用 Object map 与 Map 类

假设我想创建一个字典,例如,汽车品牌到一个或多个模型。

似乎我可以在 ES6 中以两种不同的方式做到这一点。

1. 创建一个对象映射:

代码:

const makesAndModels = {
    "mazda": [
        { name: "Miata" },
        { name: "626" }
    ],
    "toyota": [
        { name: "Camry" }
    ],
    ...
};
Run Code Online (Sandbox Code Playgroud)

2. 创建一个 ES6 Map 实例:

代码:

const makes = {
    mazda: { name: "Mazda" },
    toyota: { name: "Toyota" }
};

const makesAndModels = new Map([
    [makes.mazda, [
        { name: "Miata" },
        { name: "626" }
    ]],
    [makes.toyota, [
        { name: "Camry" }
    ]],
    ...
]);
Run Code Online (Sandbox Code Playgroud)

上述两种方法之间的主要区别和优缺点是什么?

javascript ecmascript-6

4
推荐指数
1
解决办法
4750
查看次数

ES6 映射键可以是字符串或数字

我有一个 ES6 Map ,其中键是数字。有时键是数字,有时键是表示数字的字符串。对我来说,地图在运行时永远不会有重复的键。示例我永远不会拥有键 "1" 和 1 。

从地图检索时,我需要一个简单的单行代码,它将否定键是字符串还是数字。

var map = new Map();
undefined
map.set('1', 'string one');
map.set(2, 'number tow')
Map(2) {"1" => "string one", 2 => "number tow"}
map.get(1)
undefined
map.get('1')
"string one"
Run Code Online (Sandbox Code Playgroud)

javascript ecmascript-6

1
推荐指数
1
解决办法
6576
查看次数