Avi*_*sho 3 javascript performance ecmascript-6
Map.has()用于检查 key 是否存在Map而不是 using有什么好处Map.get()吗?(代码可读性原因除外)
我检查了 ES2015 语言规范,除了返回值外,两种方法似乎都相同,所以我相信性能是相同的,但也许还有一些我不知道的其他方面会影响这里的性能。
Map.prototype.has ( key )
采取以下步骤:
令 M 为 this 值。如果 Type(M) 不是 Object,则抛出 TypeError 异常。如果 M 没有 [[MapData]] 内部槽,则抛出 TypeError 异常。让条目成为列表,它是 M 的 [[MapData]] 内部槽的值。对作为条目元素的每个记录 {[[key]], [[value]]} p 重复,如果 p.[[key]] 不为空并且 SameValueZero(p.[[key]], key) 是真,返回真。返回假。
Map.prototype.get ( key )
采取以下步骤:
令 M 为 this 值。如果 Type(M) 不是 Object,则抛出 TypeError 异常。如果 M 没有 [[MapData]] 内部槽,则抛出 TypeError 异常。让条目成为列表,它是 M 的 [[MapData]] 内部槽的值。对作为条目元素的每个记录 {[[key]], [[value]]} p 重复,如果 p.[[key]] 不为空并且 SameValueZero(p.[[key]], key) 是真,返回 p.[[value]]。返回未定义。
Map.has更可取的原因之一是如果键恰好存在,但值是假的。如果您使用Map.get,您还必须检查该值是否存在=== undefined(即使这样也不能保证该键不存在——该键可能存在,但其值为undefined):
// Not good enough:
const map = new Map();
map.set('foo', 0);
if (map.get('foo')) {
console.log('Map has "foo" key');
}Run Code Online (Sandbox Code Playgroud)
// Better, but not foolproof:
const map = new Map();
map.set('foo', 0);
map.set('bar', undefined);
const valAtFoo = map.get('foo');
if (valAtFoo !== undefined) {
console.log('Map has "foo" key');
}
// Incorrect:
const valAtBar = map.get('bar');
if (valAtBar !== undefined) {
console.log('Map has "bar" key');
}Run Code Online (Sandbox Code Playgroud)
// Solution: use map.has instead of map.get
const map = new Map();
map.set('foo', 0);
map.set('bar', undefined);
if (map.has('foo')) {
console.log('Map has "foo" key');
}
if (map.has('bar')) {
console.log('Map has "bar" key');
}Run Code Online (Sandbox Code Playgroud)
您将Map.has出于与Object.prototype.hasOwnProperty用于检查对象是否具有特定属性的相同原因使用 -用于检查在某些情况下obj[prop]是否prop存在不够好。
这不是性能问题——而是因为在某些情况下,别无他法。(.has虽然你说忽略那部分,但也更具可读性)
| 归档时间: |
|
| 查看次数: |
1410 次 |
| 最近记录: |