code: function changeQuestions(propertyList, change, union) {
      var propertyListDepth = propertyList.length
      var unioned = union!==undefined
  
      var changeIsWithinInnerProperty = true // assume true until proven otherwise
      var changeCouldRelocateInnerProperty = true // assume true until prove otherwise
      for(var n=0; n<propertyListDepth; n++) {
          // stringifying the property parts so that indexes can either be strings or integers, but must ensure we don't stringify undefined (possible todo: when/if you get rid of dot notation, this might not be necessary anymore? not entirely sure)
          if(change.property[n] === undefined || change.property[n]+'' !== propertyList[n]+'') {
              changeIsWithinInnerProperty = false
              if(n<change.property.length) {
                  changeCouldRelocateInnerProperty = false
              }
          }
      }
  
      if(!unioned && change.property.length < propertyListDepth
         || unioned && (change.type === 'set' && change.property.length <= propertyListDepth   // if this is a unioned observee, replacing it actually removes it
                     || change.type !== 'set' && change.property.length < propertyListDepth)
      ) {
          changeIsWithinInnerProperty = false
      } else {
          changeCouldRelocateInnerProperty = false
      }
  
      return {couldRelocate: changeCouldRelocateInnerProperty, isWithin: changeIsWithinInnerProperty}
  }
docs: answers certain questions about a change compared to a property list returns an object like: { isWithin: _,           // true if changeIsWithinInnerProperty couldRelocate: _       // true if changeCouldRelocateInnerProperty or if innerProperty might be removed }