lib/update-props.js
function updateProps (domNode, oldVirtualNode, oldProps, newVirtualNode, newProps) {
  if (oldProps) {
    for (var name in oldProps) {
      if (name === 'ref' || name === 'on') continue
      if (name in EVENT_LISTENER_PROPS) continue
      if (!newProps || !(name in newProps)) {
        if (name === 'dataset') {
          updateProps(domNode.dataset, null, oldProps && oldProps.dataset, null, null)
        } else if (name !== 'innerHTML' && oldVirtualNode && SVG_TAGS.has(oldVirtualNode.tag)) {
          domNode.removeAttribute(SVG_ATTRIBUTE_TRANSLATIONS.get(name) || name)
        } else {
          // Clear property for objects that don't support deletion (e.g. style
          // or className). If we used null instead of an empty string, the DOM
          // could sometimes stringify the value and mistakenly assign 'null'.
          domNode[name] = EMPTY
          delete domNode[name]
        }
      }
    }
  }

  if (newProps) {
    for (var name in newProps) {
      if (name === 'ref' || name === 'on') continue
      if (name in EVENT_LISTENER_PROPS) continue
      var oldValue = oldProps && oldProps[name]
      var newValue = newProps[name]
      if (name === 'dataset') {
        updateNestedProps(domNode.dataset, oldValue, newValue, false)
      } else if (name === 'style' && typeof newValue !== 'string') {
        if (typeof oldValue === 'string') {
          domNode.style = ''
          oldValue = null
        }
        updateNestedProps(domNode.style, oldValue, newValue, true)
      } else if (name === 'attributes') {
        updateAttributes(domNode, oldValue, newValue)
      } else {
        if (newValue !== oldValue) {
          if (name !== 'innerHTML' && newVirtualNode && SVG_TAGS.has(newVirtualNode.tag)) {
            domNode.setAttribute(SVG_ATTRIBUTE_TRANSLATIONS.get(name) || name, newValue)
          } else if (newVirtualNode && newVirtualNode.tag === 'input'
            && name === 'value' && domNode[name] === newValue) {
            // Do not update `value` of an `input` unless it differs.
            // Every change will reset the cursor position.
          } else {
            domNode[name] = newValue
          }
        }
      }
    }
  }
}
function updateProps (domNode, oldVirtualNode, oldProps, newVirtualNode, newProps) {
  if (oldProps) {
    for (var name in oldProps) {
      if (name === 'ref' || name === 'on') continue
      if (name in EVENT_LISTENER_PROPS) continue
      if (!newProps || !(name in newProps)) {
        if (name === 'dataset') {
          updateProps(domNode.dataset, null, oldProps && oldProps.dataset, null, null)
        } else if (name !== 'innerHTML' && oldVirtualNode && SVG_TAGS.has(oldVirtualNode.tag)) {
          domNode.removeAttribute(SVG_ATTRIBUTE_TRANSLATIONS.get(name) || name)
        } else {
          // Clear property for objects that don't support deletion (e.g. style
          // or className). If we used null instead of an empty string, the DOM
          // could sometimes stringify the value and mistakenly assign 'null'.
          domNode[name] = EMPTY
          delete domNode[name]
        }
      }
    }
  }

  if (newProps) {
    for (var name in newProps) {
      if (name === 'ref' || name === 'on') continue
      if (name in EVENT_LISTENER_PROPS) continue
      var oldValue = oldProps && oldProps[name]
      var newValue = newProps[name]
      if (name === 'dataset') {
        updateNestedProps(domNode.dataset, oldValue, newValue, false)
      } else if (name === 'style' && typeof newValue !== 'string') {
        if (typeof oldValue === 'string') {
          domNode.style = ''
          oldValue = null
        }
        updateNestedProps(domNode.style, oldValue, newValue, true)
      } else if (name === 'attributes') {
        updateAttributes(domNode, oldValue, newValue)
      } else {
        if (newValue !== oldValue) {
          if (name !== 'innerHTML' && newVirtualNode && SVG_TAGS.has(newVirtualNode.tag)) {
            domNode.setAttribute(SVG_ATTRIBUTE_TRANSLATIONS.get(name) || name, newValue)
          } else if (newVirtualNode && newVirtualNode.tag === 'input'
            && name === 'value' && domNode[name] === newValue) {
            // Do not update `value` of an `input` unless it differs.
            // Every change will reset the cursor position.
          } else {
            domNode[name] = newValue
          }
        }
      }
    }
  }
}
function updateProps ( domNode , oldVirtualNode , oldProps , newVirtualNode , newProps ) { if ( oldProps ) { for ( var name in oldProps ) { if ( name === 'ref' || name === 'on' ) continue if ( name in EVENT_LISTENER_PROPS ) continue if ( ! newProps || ! ( name in newProps ) ) { if ( name === 'dataset' ) { updateProps ( domNode . dataset , null , oldProps && oldProps . dataset , null , null ) } else if ( name !== 'innerHTML' && oldVirtualNode && SVG_TAGS . has ( oldVirtualNode . tag ) ) { domNode . removeAttribute ( SVG_ATTRIBUTE_TRANSLATIONS . get ( name ) || name ) } else { // Clear property for objects that don't support deletion (e.g. style // or className). If we used null instead of an empty string, the DOM // could sometimes stringify the value and mistakenly assign 'null'. domNode [ name ] = EMPTY delete domNode [ name ] } } } } if ( newProps ) { for ( var name in newProps ) { if ( name === 'ref' || name === 'on' ) continue if ( name in EVENT_LISTENER_PROPS ) continue var oldValue = oldProps && oldProps [ name ] var newValue = newProps [ name ] if ( name === 'dataset' ) { updateNestedProps ( domNode . dataset , oldValue , newValue , false ) } else if ( name === 'style' && typeof newValue !== 'string' ) { if ( typeof oldValue === 'string' ) { domNode . style = '' oldValue = null } updateNestedProps ( domNode . style , oldValue , newValue , true ) } else if ( name === 'attributes' ) { updateAttributes ( domNode , oldValue , newValue ) } else { if ( newValue !== oldValue ) { if ( name !== 'innerHTML' && newVirtualNode && SVG_TAGS . has ( newVirtualNode . tag ) ) { domNode . setAttribute ( SVG_ATTRIBUTE_TRANSLATIONS . get ( name ) || name , newValue ) } else if ( newVirtualNode && newVirtualNode . tag === 'input' && name === 'value' && domNode [ name ] === newValue ) { // Do not update `value` of an `input` unless it differs. // Every change will reset the cursor position. } else { domNode [ name ] = newValue } } } } } }
Using var to avoid "Unsupported phi use of variable" deoptimization in Chrome 56
Using var to avoid Unsupported phi use of variable deoptimization in Chrome 56