Назначения переменных javaScript от кортежей
-
12-10-2019 - |
Вопрос
На других языках, таких как Python 2 и Python 3, вы можете определить и назначать значения переменной кортежа и получить их значения, как это:
tuple = ("Bob", 24)
name, age = tuple
print(name) #name evaluates to Bob
print(age) #age evaluates to 24
Есть ли что -то подобное в JavaScript? Или мне просто нужно сделать это уродливым способом с массивом:
tuple = ["Bob", 24]
name = tuple[0] //name Evaluates to Bob
age = tuple[1] //age Evaluates to 24
Есть ли лучший способ имитировать кортежи Python в JavaScript 5?
Решение
Вы должны сделать это уродливым способом. если ты В самом деле хочу что -то подобное, вы можете проверить CoffeeScript, в котором есть и многие другие функции, которые делают его больше похожим на Python (извините за то, что он звучит как реклама, но мне это очень нравится.)
Другие советы
JavaScript 1.7 добавлен разрушенное задание что позволяет вам делать по существу то, что вы хотите.
function getTuple(){
return ["Bob", 24];
}
var [a, b] = getTuple();
// a === "bob" , b === 24 are both true
Вы можете сделать что -то подобное:
var tuple = Object.freeze({ name:'Bob', age:14 })
а затем обратитесь к имени и возрасту как атрибуты
tuple.name
tuple.age
Эта функция «кортеж» она называется деструктуризацией в Ecmascript2015 и вскоре поддерживается современными браузерами. На данный момент, Только Firefox и Chrome поддерживают это.
Но эй, ты можешь использовать транспорист.
Код будет выглядеть так же хорошо, как Python:
let tuple = ["Bob", 24]
let [name, age] = tuple
console.log(name)
console.log(age)
Замороженный массив ведет себя одинаково с корпусом из питона:
const tuple = Object.freeze(["Bob", 24]);
let [name, age]; = tuple
console.debug(name); // "Bob"
console.debug(age); // 24
Быть причудливым и определить класс
class Tuple extends Array {
constructor(...items) {
super(...items);
Object.freeze(this);
}
}
let tuple = new Tuple("Jim", 35);
let [name, age] = tuple;
console.debug(name); // Jim
console.debug(age); // 35
tuple = ["Bob", 24]; // no effect
console.debug(name); // Jim
console.debug(age); // 25
Работает сегодня во всех последних браузерах.
К сожалению, вы не можете использовать этот синтаксис назначения кортежей в сценарии (ECMA | java).
РЕДАКТИРОВАТЬ: Кто -то связан с Mozilla/JS 1.7 - это не сработает кросс -браузер, но если это не требуется, то есть ваш ответ.
КУТУ не поддерживаются в JavaScript
Если вы ищете неизменный список, Object.Freeze () может использоваться, чтобы сделать массив неизбежным.
Метод Object.Freeze () замораживает объект: то есть предотвращает добавление новых свойств; предотвращает удаление существующих свойств; и предотвращает изменение существующих свойств, или их перечисление, конфигурируемость или записи. По сути, объект делает эффективно неизменным. Метод возвращает замороженный объект.
Источник: Mozilla Developer Network - Object.Freeze ()
Назначьте массив как обычно, но заблокируйте его, используя 'object.freeze ()
> tuple = Object.freeze(['Bob', 24]);
[ 'Bob', 24 ]
Используйте значения, как вы будете регулярно массив (Python Multi-Assignment не поддерживается)
> name = tuple[0]
'Bob'
> age = tuple[1]
24
Попытка назначить новое значение
> tuple[0] = 'Steve'
'Steve'
Но значение не изменено
> console.log(tuple)
[ 'Bob', 24 ]
Это не предназначено для того, чтобы на самом деле использоваться в реальной жизни, просто интересное упражнение. Видеть Почему использование функции eval JavaScript - плохая идея? Для деталей.
Это самое близкое, что вы можете получить, не прибегая к расширениям, специфичным для поставщика:
myArray = [1,2,3];
eval(set('a,b,c = myArray'));
Вспомогательная функция:
function set(code) {
var vars=code.split('=')[0].trim().split(',');
var array=code.split('=')[1].trim();
return 'var '+vars.map(function(x,i){return x+'='+array+'['+i+']'}).join(',');
}
Доказательство того, что он работает в произвольной области:
(function(){
myArray = [4,5,6];
eval(set('x,y,z = myArray'));
console.log(y); // prints 5
})()
eval
не поддерживается в сафари.
В качестве обновления ответа министра вы можете сделать это с ES2015:
function Tuple(...args) {
args.forEach((val, idx) =>
Object.defineProperty(this, "item"+idx, { get: () => val })
)
}
var t = new Tuple("a", 123)
console.log(t.item0) // "a"
t.item0 = "b"
console.log(t.item0) // "a"
Вы также можете иметь тип кортежа в JavaScript. Просто определите его с помощью функций более высокого порядка (академический термин - это церковное кодирование):
const Tuple = (...args) => {
const Tuple = f => f(...args);
return Object.freeze(Object.assign(Tuple, args));
};
const get1 = tx => tx((x, y) => x);
const get2 = tx => tx((x, y) => y);
const bimap = f => g => tx => tx((x, y) => Tuple(f(x), g(y)));
const toArray = tx => tx((...args) => args);
// aux functions
const inc = x => x + 1;
const toUpperCase = x => x.toUpperCase();
// mock data
const pair = Tuple(1, "a");
// application
console.assert(get1(pair) === 1);
console.assert(get2(pair) === "a");
const {0:x, 1:y} = pair;
console.log(x, y); // 1 a
console.log(toArray(bimap(inc) (toUpperCase) (pair))); // [2, "A"]
const map = new Map([Tuple(1, "a"), Tuple(2, "b")]);
console.log(map.get(1), map.get(2)); // a b
Обратите внимание Tuple
не используется в качестве нормального конструктора. Решение вообще не полагается на систему прототипов, а исключительно на функции более высокого порядка.
Каковы преимущества кортежей Array
S используется как кортежи? Церковные кодируемые кортежи являются неизменными по дизайну и, таким образом, предотвращают побочные эффекты, вызванные мутациями. Это помогает создать более надежные приложения. Кроме того, легче рассуждать о коде, который различает Array
S как тип коллекции (например, [a]
) и кортежи как связанные данные различных типов (например, (a, b)
).
Вот простая реализация JavaScript Tuple:
var Tuple = (function () {
function Tuple(Item1, Item2) {
var item1 = Item1;
var item2 = Item2;
Object.defineProperty(this, "Item1", {
get: function() { return item1 }
});
Object.defineProperty(this, "Item2", {
get: function() { return item2 }
});
}
return Tuple;
})();
var tuple = new Tuple("Bob", 25); // Instantiation of a new Tuple
var name = tuple.Item1; // Assignment. name will be "Bob"
tuple.Item1 = "Kirk"; // Will not set it. It's immutable.
Это 2-й тупин, однако, вы можете изменить мой пример, чтобы поддержать 3,4,5,6 и т. Д. Стужки.
[a, b, c] = [2, 'momo', 7] // b === 'momo', c ===7 ...