MaybeHandle<JSObject> JSObject::New(Handle<JSFunction> constructor,
Handle<JSReceiver> new_target,
Handle<AllocationSite> site) {
// If called through new, new.target can be:
// - a subclass of constructor,
// - a proxy wrapper around constructor, or
// - the constructor itself.
// If called through Reflect.construct, it's guaranteed to be a constructor.
Isolate* const isolate = constructor->GetIsolate();
DCHECK(constructor->IsConstructor());
DCHECK(new_target->IsConstructor());
DCHECK(!constructor->has_initial_map() ||
!InstanceTypeChecker::IsJSFunction(
constructor->initial_map().instance_type()));
Handle<Map> initial_map;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, initial_map,
JSFunction::GetDerivedMap(isolate, constructor, new_target), JSObject);
constexpr int initial_capacity = V8_ENABLE_SWISS_NAME_DICTIONARY_BOOL
? SwissNameDictionary::kInitialCapacity
: NameDictionary::kInitialCapacity;
Handle<JSObject> result = isolate->factory()->NewFastOrSlowJSObjectFromMap(
initial_map, initial_capacity, AllocationType::kYoung, site);
return result;
}
3条答案
按热度按时间r6hnlfcb1#
性能方面,将它们视为哈希值似乎是安全的。历史上有很多文章说不要相信它。从我的经验来看,肯定有一些情况下,对象可能比Map更符合人体工程学。
基准测试-https://jsfiddle.net/soparrissays/Lt0znmxw/
你可以看到,无论对象的大小如何,每个CRUD操作都能够执行大约相同数量的ops/sec,这表明每个操作都是O(1)。下面是在Chrome中运行的:
在过去,我看到其他浏览器的行为类似。
2023更新
我应该只读源代码-如果我阅读这个权利,这是一个Map与更多的功能围绕它https://github.com/v8/v8/blob/2b79cfd81f6acdfec29661ce2b39d60f4a45b14f/src/objects/js-objects.cc#L2391
我推测Map可能会给你带来一些性能,但是它的clear对象非常快,而且它们的属性看起来属于一个hash。所以当然要选择合适的工具来完成这项工作。如果你需要围绕Object构建的所有工具,使用它们仍然是安全的!
pu82cl6c2#
JavaScript对象 * 是 * 散列。我无法想象任何正常的实现不会对对象属性提供恒定时间的CRUD操作。
您是否发现这种方法存在特定的性能问题?
hc2pp10m3#
JavaScript中的对象是哈希表的一个例子,因为对象数据被表示为键和值。