for-of.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. 'use strict';
  2. var isArguments = require('es5-ext/function/is-arguments')
  3. , callable = require('es5-ext/object/valid-callable')
  4. , isString = require('es5-ext/string/is-string')
  5. , get = require('./get')
  6. , isArray = Array.isArray, call = Function.prototype.call
  7. , some = Array.prototype.some;
  8. module.exports = function (iterable, cb/*, thisArg*/) {
  9. var mode, thisArg = arguments[2], result, doBreak, broken, i, l, char, code;
  10. if (isArray(iterable) || isArguments(iterable)) mode = 'array';
  11. else if (isString(iterable)) mode = 'string';
  12. else iterable = get(iterable);
  13. callable(cb);
  14. doBreak = function () { broken = true; };
  15. if (mode === 'array') {
  16. some.call(iterable, function (value) {
  17. call.call(cb, thisArg, value, doBreak);
  18. if (broken) return true;
  19. });
  20. return;
  21. }
  22. if (mode === 'string') {
  23. l = iterable.length;
  24. for (i = 0; i < l; ++i) {
  25. char = iterable[i];
  26. if ((i + 1) < l) {
  27. code = char.charCodeAt(0);
  28. if ((code >= 0xD800) && (code <= 0xDBFF)) char += iterable[++i];
  29. }
  30. call.call(cb, thisArg, char, doBreak);
  31. if (broken) break;
  32. }
  33. return;
  34. }
  35. result = iterable.next();
  36. while (!result.done) {
  37. call.call(cb, thisArg, result.value, doBreak);
  38. if (broken) return;
  39. result = iterable.next();
  40. }
  41. };