nerv, для написания итераторов удобно использовать генераторы.
function *makeIterator(array){ var nextIndex = 0; while (nextIndex < array.length) { yield array[nextIndex++]; } } var iterator = makeIterator([1,2,3]); for (var key of iterator) { alert(key); } А ещё можно так: for (var key of (el for (el of [1,2,3]))) { alert(key); } |
kobezzza, ага, спасибо, я знаю. Только без regeneratorRuntime в ES5 работать не будет.
Кстати, эта поделка от фейсбука https://github.com/facebook/regenerator |
Цитата:
|
Наткнулся тут на одну фичу, здесь, вроде, еще не было:
let room = new Room(); let character = new Character({room}); assert.equal(character.room, room); room.destroy(); assert.isNull(character.room); assert.isNull(room); //!!! И даже кодить ничего не надо: const revoke = Symbol(); class Model { constructor() { let { proxy, revoke: revokeHandler } = Proxy.revocable(this, {}); this[revoke] = revokeHandler; return proxy; } destroy() { this[revoke](); } } class Character extends Model { constructor(room) { super(); Object.assign(this, { room }); } } class Room extends Model {} https://people.mozilla.org/~jorendor...roxy.revocable |
Изобретаем Deferred по новой :D
class Deferred { constructor(generator) { this.promise = new Promise((resolve, reject) => { Object.assign(this, {resolve, reject}); }); generator.next(); let next = value => { let result = generator.next(value); if (!result.done) { value = result.value; if (value && value.next) { new Deferred(value).done(next).fail(this.reject); } else { next(value); } } }; next(this); } done(onFulfilled) { this.promise.then(onFulfilled); return this; } fail(onRejected) { this.promise.catch(onRejected); return this; } } function * getFoo() { let deferred = yield; setTimeout(function() { deferred.resolve('foo'); }, 100); } function * getBar() { let deferred = yield; let foo = yield getFoo(); setTimeout(function() { deferred.resolve(foo + 'bar'); }, 100); } new Deferred(getBar()).done(function(value) { console.log(value); }); // в консоль выведется "foobar" |
Octane, поясняй пож. я, например, нифига не понял :)
Tagged template strings. Вызываем функции без скобок? alert`1` тот же код, пропущенный через babel: "use strict"; var _taggedTemplateLiteral = function (strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }; alert(_taggedTemplateLiteral(["1"], ["1"])); |
Цитата:
var myStr = ` Hello ${name}! I'm glad to see you. `; Если все оставить как есть, то в нашей строке будут переводы строк и начальные пробелы, а зачастую нам это совсем не нужно. В некоторых языках существуют разные литералы строк, которые могут по разному обрабатывать такие кейзы, но в JS решили сделать самый универсальный способ: позволить пользователю самому определять "тег" для строки, где обрабаывать нужную логику (экранирование, переводы строк и т.д.) var myStr = n2br` Hello ${name}! I'm glad to see you. `; Скобки тут бы очень мешались, поэтому их нет, всё просто :) К сожалению тег может быть только один :( |
К моему удивлению, с babel прокатил такой синтаксис:
class X { 'method'() { } } Баг или фича? |
Цитата:
class X { method() { } '@method'() { } [1 + 2]() { } } |
melky,
Цитата:
Цитата:
|
Часовой пояс GMT +3, время: 21:51. |