code: function immutableSet(source, exprPaths, pathsStart, pathsLen, value, data) {
      if (pathsStart >= pathsLen) {
          return value;
      }
  
      if (source == null) {
          source = {};
      }
  
      var pathExpr = exprPaths[pathsStart];
      var prop = evalExpr(pathExpr, data);
      var result = source;
  
      if (source instanceof Array) {
          var index = +prop;
          prop = isNaN(index) ? prop : index;
  
          result = source.slice(0);
          result[prop] = immutableSet(source[prop], exprPaths, pathsStart + 1, pathsLen, value, data);
      }
      else if (typeof source === 'object') {
          result = {};
  
          for (var key in source) {
              /* istanbul ignore else  */
              if (key !== prop && source.hasOwnProperty(key)) {
                  result[key] = source[key];
              }
          }
  
          result[prop] = immutableSet(source[prop], exprPaths, pathsStart + 1, pathsLen, value, data);
      }
  
      if (pathExpr.value == null) {
          exprPaths[pathsStart] = {
              type: typeof prop === 'string' ? ExprType.STRING : ExprType.NUMBER,
              value: prop
          };
      }
  
      return result;
  }
docs: 数据对象变更操作
  
  @inner
  @param {Object|Array} source 要变更的源数据
  @param {Array} exprPaths 属性路径
  @param {number} pathsStart 当前处理的属性路径指针位置
  @param {number} pathsLen 属性路径长度
  @param {*} value 变更属性值
  @param {Data} data 对应的Data对象
  @return {*} 变更后的新数据