From: Evan You Date: Thu, 17 Oct 2019 01:36:17 +0000 (-0400) Subject: perf: revert to _isRef for perf X-Git-Tag: v3.0.0-alpha.0~388 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cdee65aa1b3f0187949a0c186ee6ee78bf0df5c3;p=thirdparty%2Fvuejs%2Fcore.git perf: revert to _isRef for perf Benchmarking shows checking for a plain property is about 4~5x faster than checking for a Symbol, likely because the Symbol does not fit well into V8's hidden class model. --- diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index 3dc478f61b..ec26028b2e 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -1,5 +1,5 @@ import { effect, ReactiveEffect, activeReactiveEffectStack } from './effect' -import { Ref, refSymbol, UnwrapRef } from './ref' +import { Ref, UnwrapRef } from './ref' import { isFunction, NOOP } from '@vue/shared' export interface ComputedRef extends WritableComputedRef { @@ -46,7 +46,7 @@ export function computed( } }) return { - [refSymbol]: true, + _isRef: true, // expose effect so computed can be stopped effect: runner, get value() { diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index 7fec6ffbfd..24fabbc869 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -4,10 +4,8 @@ import { isObject } from '@vue/shared' import { reactive } from './reactive' import { ComputedRef } from './computed' -export const refSymbol = Symbol(__DEV__ ? 'refSymbol' : '') - export interface Ref { - [refSymbol]: true + _isRef: true value: UnwrapRef } @@ -21,7 +19,7 @@ export function ref(raw: any) { } raw = convert(raw) const v = { - [refSymbol]: true, + _isRef: true, get value() { track(v, OperationTypes.GET, '') return raw @@ -35,7 +33,7 @@ export function ref(raw: any) { } export function isRef(v: any): v is Ref { - return v ? v[refSymbol] === true : false + return v ? v._isRef === true : false } export function toRefs( @@ -53,7 +51,7 @@ function toProxyRef( key: K ): Ref { return { - [refSymbol]: true, + _isRef: true, get value(): any { return object[key] },