Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #351 (permalink)  
Старый 06.11.2015, 20:41
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

trikadin, а, сорри. Не проверил сам. Думал, что свойства не работают.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #352 (permalink)  
Старый 06.11.2015, 20:57
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Сообщение от FINoM
trikadin, а, сорри. Не проверил сам. Думал, что свойства не работают.
Так что темак весьма полезный, плюс отлично поддерживается

Проблема в том, что для дата-биндинга куда актуальнее отслеживать не изменения в DOM (потому что, как правило, нужно отслеживать только ввод в текстовые поля), а объекты в JS.

Кстати, я тут подумал -- в твой бенчмарк по измерению скорости, по-честному, нужно добавить ситуацию, когда отслеживаемых свойств больше одного -- скажем, несколько десятков. Интересно, какая будет ситуация тогда.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #353 (permalink)  
Старый 06.11.2015, 21:00
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от trikadin
Кстати, я тут подумал -- в твой бенчмарк по измерению скорости, по-честному, нужно добавить ситуацию, когда отслеживаемых свойств больше одного -- скажем, несколько десятков. Интересно, какая будет ситуация тогда.
Сорри, нет возможности этим заниматься. Если хочешь, велкам. Лицензия - WTFPL
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #354 (permalink)  
Старый 06.11.2015, 21:19
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

FINoM, если будет время и желание. Хотя смысла теперь в этом немного: фича только в хроме, все остальные браузеры, даже если и собирались имплементить, то теперь радостно забьют на нее (депрекейтед же).
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #355 (permalink)  
Старый 29.01.2016, 19:50
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

await yield
Ответить с цитированием
  #356 (permalink)  
Старый 21.03.2016, 15:21
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Далеко не все разработчики успели понять что-же такое ECMAScript2015,
а тут уже грядет ECMAScript2016, который, если ориентироваться на прошлый год, будет принять через пару-тройку месяцев. Например, на сайте Мозиллы заявлены typed-objects. Иными словами, в js потихоньку приходит типизация

UPD: https://github.com/hemanth/es7-features
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 21.03.2016 в 15:23.
Ответить с цитированием
  #357 (permalink)  
Старый 21.03.2016, 16:21
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Я давно юзаю ES7 фичи, такие как асинки или декораторы
__________________
kobezzza
code monkey
Ответить с цитированием
  #358 (permalink)  
Старый 21.03.2016, 23:44
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Сообщение от kobezzza
декораторы
Которые никогда уже не стандартизируют, по ходу.

И вообще набор фичей, достигших Stage 3, что-то не впечатляет.
https://github.com/tc39/ecma262/blob/master/README.md
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #359 (permalink)  
Старый 22.03.2016, 01:05
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от trikadin
И вообще набор фичей, достигших Stage 3, что-то не впечатляет.
есть такое дело

голосуем за опциональную типизацию
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #360 (permalink)  
Старый 31.12.2018, 05:17
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Я бы хотел предложить вариант, как могла бы выглядеть типизация в JavaScript.

Мне кажется, что предложенные варианты неявной типизации 1) синтаксически усложнены и 2) не учитывают некоторые особенности JavaScript

Тип объекта — ссылка на функцию, при помощи которой сконструирован объект (явно или неявно). null и undefined, а также объекты вида { __proto__: null } не имеют конструктора. Тип может быть простым и составным.

Простой тип объекта o может быть выведен при помощи o.constructor

Например, в следующем примере
const PI = 3.14159265;
const re = /a/gi;
const IS_PROXY = Symbol("is proxy");
const now = new Date();

простой тип констант PI, re, IS_PROXY и now выводится неявно как Number, RegExp, Symbol и Date соответственно.

Далее в рассуждениях я буду обозначать вид простого типа при помощи звёздочки *. Т. е. в примере выше объекты имели вид *.

Рассмотрим вычисленное выражение Promise.resolve(5). С одной стороны можно сказать, что оно имеет простой тип Promise. Однако начав работать с этим объектом, можно заметить, что оно не полностью описывает всё, что достижимо в этом объекте. Например, можно извлечь значение, которое хранится в Promise. На самом деле это тип Promise, который содержит тип Number. Это составной тип.
Рассмотрим вычисленное выражение ["id", 60]. Оно похоже на простой тип Array. Однако при помощи перебора элементов этого массива можно установить, что оно содержит достижимые объекты, которые тоже имеют свой тип. Это составной тип.
Рассмотрим вычисленное выражение (a, p) => `€ ${a * (1 - p / 100)}`. Оно похоже на простой тип Function. Однако исследуя аргументы и возвращаемый результат функций, т. е. то, что достижимо в любой функции, мы видим, что они имеют свой тип. Функция — составной тип.

Такие виды типов можно обозначить так:
Вид *<*> для типа, который зависит от другого типа, например тип Promise<Number>
Вид *<*, *> для типа, который зависит от двух других типов, например тип Array<String, Number>
Вид *<*, *, *> для типа, который зависит от трёх других типов, например тип Function<Number, Number, String>
Составной тип может зависеть от любого кол-ва типов. Зависящие типы — аргументы вида.
Также для составного типа можно определить тип хвоста. Например,
вид *<...*> показывает, что тип зависит от любого кол-ва одного и того же другого типа, например тип Set<...Number> для множества содержащего любое кол-во чисел.
вид *<*, ...*> показывает, что тип зависит от другого типа и любого кол-ва одного и того же третьего типа, например тип Array<RegExp, ...String> для массива, содержащего рег. выр. и любое кол-во строк.

Функция без аргумента имеет вид Function<*>, т. е. у её зависящего типа указывается только возвращаемый тип
Функция с одним аргументом имеет вид Function<*, *>, т. е. у её зависящих типов указывается тип аргумента и возвращаемый тип
Функция с двумя аргументами имеет вид Function<*, *, *>, т. е. у её зависящих типов указываются типы аргументов и возвращаемый тип и т. д.

Поскольку у видов Function последний аргумент указывает на тип возвращаемого значения, то тип хвоста списка аргументов указывается в списке типов вида предпоследним.
Вид Function<...*, *>, например тип Function<...Number, Boolean> для функции, которая принимает в качестве аргументов любое кол-во чисел и возвращает true или false.
Вид Function<*, ...*, *>, например тип Function<Array<String>, ...String, String> для функции, которая принимает массив строк и любое кол-во строк и возвращает строку и т. д.

В JavaScript может быть реализован достаточно мощный механизм вывода типов, который позволит не указывать типы функций. Можно будет указать тип функции явно для того, чтобы ограничить её использование только для конкретных типов данных, либо для структурированного оформления исходного кода.

Синтаксис типов (определение BindingIdentifier взято из 9-ого издания ECMAScript)

Код:
Type :
	BindingIdentifier
	BindingIdentifier < TypeParameters >

TypeParameters :
	TypeRestParameter
	TypeRestParameter , Type
	TypeParameterList
	TypeParameterList , TypeRestParameter
	TypeParameterList , TypeRestParameter , Type

TypeRestParameter :
	... Type

TypeParameterList :
	Type
	TypeParameterList , Type
В 9-ом издании ECMAScript определённые синтаксические правила дополняются:

Код:
FormalParameter[Yield, Await] :
	BindingElement[?Yield, ?Await]
	Type WhiteSpace BindingElement[?Yield, ?Await]

MethodDefinition[Yield, Await] :
	PropertyName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] }
	Type WhiteSpace PropertyName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] }
	GeneratorMethod[?Yield, ?Await]
	AsyncMethod[?Yield, ?Await]
	AsyncGeneratorMethod[?Yield, ?Await]
	get PropertyName[?Yield, ?Await] ( ) { FunctionBody[~Yield, ~Await] }
	get Type WhiteSpace PropertyName[?Yield, ?Await] ( ) { FunctionBody[~Yield, ~Await] }
	set PropertyName[?Yield, ?Await] ( PropertySetParameterList ) { FunctionBody[~Yield, ~Await] }

Expression[In, Yield, Await] :
	AssignmentExpression[?In, ?Yield, ?Await]
	AssignmentExpression[?In, ?Yield, ?Await] :: Type
	Expression[?In, ?Yield, ?Await] , AssignmentExpression[?In, ?Yield, ?Await]
	Expression[?In, ?Yield, ?Await] , AssignmentExpression[?In, ?Yield, ?Await] :: Type
Хотя можно ещё более подробно указать в правилах синтаксиса, как можно использовать неявные типы, но я думаю, что для начала хватит такого определения. В этих правилах говорится, что у метода/сеттера может быть указан тип каждого аргумента. Также может быть указан возвращаемый тип метода/геттера.
Также любое выражение может быть снабжено типом. (так называемое типизированное выражение)

Возможно ключевое void стоит указывать там, где ожидается null или undefined? Например, функция alert может иметь тип Function<Object, void>

Посмотрите на примеры:

1. Деструктуризация по типу.
class Vector {
	constructor(Number x, Number y, Number z) {
		this.x = x
		this.y = y
		this.z = z
	}

	Vector add(Vector { x, y, z }) {
		return new Vector(
			this.x + x,
			this.y + y,
			this.z + z
		)
	}
}


Код выше работает так(это не значит, что он должен работать именно так, возможны оптимизации на уровне движка)
class Vector {
	constructor() {
		if(
			Object(arguments[0]) instanceof Number &&
			Object(arguments[1]) instanceof Number &&
			Object(arguments[2]) instanceof Number
		) {
			const [x, y, z] = arguments;
			this.x = x
			this.y = y
			this.z = z
		}

		else
			throw new TypeError("No method arises from provided arguments");
	}

	add() {
		if(
			Object(arguments[0]) instanceof Vector
		) {
			const [{x, y, z}] = arguments;
			return new Vector(
				this.x + x,
				this.y + y,
				this.z + z
			)
		}

		else
			throw new TypeError("No method arises from provided arguments");
	}
}




2. Перегрузка
class SomeClass {
	Number add(Number num1, Number num2) {
		return num1 + num2;
	}

	String add(String str1, String str2) {
		return str1 + str2;
	}
}


Это выполняется так
class SomeClass {
	add() {
		if(
			Object(arguments[0]) instanceof Number &&
			Object(arguments[1]) instanceof Number
		) {
			const [num1, num2] = arguments;
			return num1 + num2;
		} else

		if(
			Object(arguments[0]) instanceof String && 
			Object(arguments[1]) instanceof String
		) {
			const [str1, str2] = arguments;
			return str1 + str2;
		}

		else
			throw new TypeError("No method arises from provided arguments");
	}
}



Поскольку типы имеют свой собственный контекст, где они могут быть использованы, то я думаю, что можно ввести также литералы для типов.

Array или []
Array<Number> или [Number]
Array<...RegExp> или [...RegExp]
Array<String, Number> или [String, Number]
Array<String, ...String> или [String, ...String]

Function<Response, Array<Number>> или Response => [Number]
Function<Number> или () => Number
Function<...Number, Number> или (...Number) => Number
Function<Function<...Object, Array<Object>>, String> или ((...{}) => [{}]) => String
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать HTML фичи? 2chan Events/DOM/Window 6 26.09.2014 18:50