Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   JS.next(стандарты, фичи, движки) (https://javascript.ru/forum/offtopic/50248-js-next-standarty-fichi-dvizhki.html)

kobezzza 01.03.2015 22:34

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);
}

nerv_ 01.03.2015 22:51

kobezzza, ага, спасибо, я знаю. Только без regeneratorRuntime в ES5 работать не будет.

Кстати, эта поделка от фейсбука https://github.com/facebook/regenerator

kobezzza 01.03.2015 22:56

Цитата:

Сообщение от nerv_ (Сообщение 359156)
kobezzza, ага, спасибо, я знаю. Только без regeneratorRuntime в ES5 работать не будет.

Кстати, эта поделка от фейсбука https://github.com/facebook/regenerator

Угу, она юзается в Babel.

Erolast 07.03.2015 21:38

Наткнулся тут на одну фичу, здесь, вроде, еще не было:

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

Octane 09.03.2015 21:02

Изобретаем 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"

melky 12.03.2015 18:55

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"]));

kobezzza 12.03.2015 19:53

Цитата:

Octane, поясняй пож. я, например, нифига не понял

Tagged template strings. Вызываем функции без скобок?
Ну, это решение следующей проблемы:

var myStr = `
  Hello ${name}!
  I'm glad to see you.
`;


Если все оставить как есть, то в нашей строке будут переводы строк и начальные пробелы, а зачастую нам это совсем не нужно. В некоторых языках существуют разные литералы строк, которые могут по разному обрабатывать такие кейзы, но в JS решили сделать самый универсальный способ: позволить пользователю самому определять "тег" для строки, где обрабаывать нужную логику (экранирование, переводы строк и т.д.)

var myStr = n2br`
  Hello ${name}!
  I'm glad to see you.
`;


Скобки тут бы очень мешались, поэтому их нет, всё просто :)

К сожалению тег может быть только один :(

FINoM 12.03.2015 19:57

К моему удивлению, с babel прокатил такой синтаксис:
class X {
	'method'() {
		
	}
}

Баг или фича?

kobezzza 12.03.2015 19:59

Цитата:

Сообщение от FINoM (Сообщение 360965)
К моему удивлению, с babel прокатил такой синтаксис:
class X {
	'method'() {
		
	}
}

Баг или фича?

Это нормальный синтаксис ES6:

class X {
	method() {

	}

	'@method'() {

	}

	[1 + 2]() {

	}
}

Safort 12.03.2015 20:51

melky,
Цитата:

Tagged template strings. Вызываем функции без скобок?
kobezzza,
Цитата:

Скобки тут бы очень мешались, поэтому их нет, всё просто
Я однажды чуть не психанул и не переписал все вызовы методов в таком стиле :D


Часовой пояс GMT +3, время: 21:51.