Javascript: Массив не меняется, это ошибка?

1

Массив не изменяется с помощью [...].splice(index, 1, change) и [...][index] = change методы [...][index] = change. См. Пример для получения дополнительной информации.

Примечание. Я знаю о js, он меняется где угодно, кроме t === 1. Может ли кто-нибудь объяснить это поведение, это известная ошибка или есть решение?

Я хочу найти решение для него, потому что хочу создать "Interpolator for Tweening library" с поддержкой относительной строки (объект, массив, число поддерживаются позже, я добавлю).

// RegExp variables
var numRegExp =
  /\s+|([A-Za-z?().,{}:""[\]#]+)|([-+/*%]+=)?([-+*/%]+)?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;

// Helpers
function s2f(val) {
  var floatedVal = parseFloat(val);
  return typeof floatedVal === "number" && !isNaN(floatedVal) ? floatedVal : val;
}
var relativeModes = {
  '+=': 1,
  '-=': 1,
  '*=': 2,
  '/=': 3,
  '%=': 4
};

function r2n(s, e) {
  if (typeof e === 'number') {
    return e - s;
  } else {
    var rv = relativeModes[e.substr(0, 2)],
      v = e.substr(2);
    if (rv === 1) {
      var e2 = e[0] + v;
      return (s + parseFloat(e2)) - s;
    } else if (rv === 2) {
      return (s * +v) - s;
    } else if (rv === 3) {
      return (s / +v) - s;
    } else if (rv === 4) {
      return (s * (+v / 100)) - s;
    }
  }
  return e;
}

function s2n(str) {
  return str.match(numRegExp).map(s2f);
}

// Splitted functions
var stringTween = function(s, e, d) {
  d = d !== undefined ? d : 10000;
  var sv = s2n(s);
  var ev = s2n(e);
  var rv = ev.map(function(e, i) {
    return typeof e === 'string' && e.indexOf('=') === 1 ? e : null;
  });
  ev = ev.map(function(e, i) {
    return rv[i] !== null ? r2n(sv[i], e) : typeof e === 'number' ? e - sv[i] : e;
  });
  return function(t) {
    var str = '';
    for (var i = 0, len = ev.length; i < len; i++) {
      var a = sv[i],
        b = ev[i],
        r = rv[i];
      str += typeof b === 'number' ? a + b * t : a;
      if (t === 1 && r !== null) {
        document.body.innerHTML += 'This script executes <code>t === 1</code>, relative value isn\'t null, but <code>sv</code> or <code>ev</code> not changes, this is BUG?' + '<br/>';
        sv[i] += b;
        ev[i] = r2n(sv[i], r);
      }
    }
    return str;
  }
}

// Test case
var st = performance.now(),
  rep = 1;
requestAnimationFrame(function anim(time) {
  var t = (time - st) / 2000;
  t = t > 1 ? 1 : t;
  document.body.innerHTML += stringTween('translate3d(10px, 20px, 30px)', 'translate3d(+=20px, 30px, 35px)')(t) + '<br/>';
  if (t === 1) {
    if (rep > 0) {
      rep--;
      st = time
    } else {
      return false;
    }
  }
  requestAnimationFrame(anim);
});
#note {
  color: red;
}

html {
  font-family: Arial;
  font-size: 1em;
}
<h1>Tested mode</h1>
<h2>
  - Chrome<br/> - NodeJS 6.x<br/> - IE Edge <br/>
</h2>
<p id="note">Please not teach me by not related answer like use selector outside frame-loop, optimize it, reduce relayout, cache node</p>

<body>

</body>

Спасибо

  • 1
    Это действительно много кода. Попробуйте уменьшить его, пожалуйста.
  • 1
    кстати, | 0 выглядит умным, но он уменьшает диапазон числа до 32 бит.
Показать ещё 4 комментария
Теги:
arrays

1 ответ

0
Лучший ответ

Переменные функции не могут использоваться совместно

Ещё вопросы

Сообщество Overcoder
Наверх
Меню