@@ -370,8 +370,14 @@ const defaultMethods = {
370
370
compile : ( data , buildState ) => {
371
371
if ( ! Array . isArray ( data ) || ! data . length ) return false
372
372
let res
373
+
373
374
try {
374
- res = buildState . compile `((context, above) => { try { return ${ data [ 0 ] } } catch(err) { above = [null, context, above]; context = { type: err.type || err.message || err.toString() }; `
375
+ // This is a very specific optimization to speed up the common case of trying to coerce a value to a number, and falling back to a different value.
376
+ if ( '+' in data [ 0 ] && data . length > 1 ) {
377
+ res = buildState . compile `((context, above) => { try { const precoerceNumber = a => a; return Number.isNaN(prev = ${ data [ 0 ] } ) ? ${ data [ 1 ] } : prev } catch(err) { above = [null, context, above]; context = { type: err.type || err.message || err.toString() }; `
378
+ } else {
379
+ res = buildState . compile `((context, above) => { try { return ${ data [ 0 ] } } catch(err) { above = [null, context, above]; context = { type: err.type || err.message || err.toString() }; `
380
+ }
375
381
} catch ( err ) {
376
382
// eslint-disable-next-line no-ex-assign
377
383
if ( Number . isNaN ( err ) ) err = { type : 'NaN' }
@@ -1019,7 +1025,7 @@ defaultMethods['+'].compile = function (data, buildState) {
1019
1025
return `precoerceNumber(${ data . map ( i => numberCoercion ( i , buildState ) ) . join ( ' + ' ) } )`
1020
1026
}
1021
1027
if ( typeof data === 'string' || typeof data === 'number' || typeof data === 'boolean' ) return `precoerceNumber(+${ buildString ( data , buildState ) } )`
1022
- return buildState . compile `(Array.isArray(prev = ${ data } ) ? prev.reduce((a,b) => (+a)+(+precoerceNumber(b)), 0) : + precoerceNumber(prev))`
1028
+ return buildState . compile `(Array.isArray(prev = ${ data } ) ? prev.reduce((a,b) => (+a)+(+precoerceNumber(b)), 0) : precoerceNumber(+ prev))`
1023
1029
}
1024
1030
1025
1031
// @ts -ignore Allow custom attribute
@@ -1044,7 +1050,7 @@ defaultMethods['-'].compile = function (data, buildState) {
1044
1050
return `${ data . length === 1 ? '-' : '' } precoerceNumber(${ data . map ( i => numberCoercion ( i , buildState ) ) . join ( ' - ' ) } )`
1045
1051
}
1046
1052
if ( typeof data === 'string' || typeof data === 'number' ) return `(-${ buildString ( data , buildState ) } )`
1047
- return buildState . compile `(Array.isArray(prev = ${ data } ) ? prev.length === 1 ? -precoerceNumber(prev[0]) : assertSize(prev, 1).reduce((a,b) => (+precoerceNumber(a))-(+precoerceNumber(b))) : -precoerceNumber(prev))`
1053
+ return buildState . compile `(Array.isArray(prev = ${ data } ) ? prev.length === 1 ? -precoerceNumber(prev[0]) : assertSize(prev, 1).reduce((a,b) => (+precoerceNumber(a))-(+precoerceNumber(b))) : -precoerceNumber(+ prev))`
1048
1054
}
1049
1055
// @ts -ignore Allow custom attribute
1050
1056
defaultMethods [ '/' ] . compile = function ( data , buildState ) {
0 commit comments