来自元组的JavaScriptvariables赋值
在Python 2和Python 3等其他语言中,您可以定义和赋值给一个元组variables,并像这样获取它们的值:
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
有没有更好的方法来模拟JavaScript 5中的Python元组?
你必须这样做丑陋的方式。 如果你真的想要这样的东西,你可以看看CoffeeScript ,它有很多其他function,使它看起来更像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
这个“元组”function在EcmaScript2015中被称为解构(destructuring),并且即将被最新的浏览器支持。 目前, 只有Firefox和Chrome支持它 。
但是,嘿,你可以使用一个翻译 。
代码看起来和python一样好:
let tuple = ["Bob", 24] let [name, age] = tuple console.log(name) console.log(age)
不幸的是,你不能在(ECMA | Java)脚本中使用这个元组赋值语法。
编辑:有人链接到Mozilla / JS 1.7 – 这不会跨浏览器工作,但如果不需要,那么你的答案。
JavaScript中不支持元组
如果你正在寻找一个不可改变的列表,Object.freeze()可以用来创build一个不可变的数组。
Object.freeze()方法冻结一个对象:也就是说,阻止新的属性被添加到它; 防止现有的属性被删除; 并防止现有属性或其可枚举性,可configuration性或可写性发生改变。 实质上,该对象是有效的不可变的。 该方法返回被冻结的对象。
来源: Mozilla开发者networking – 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 ]
这并不打算在现实生活中实际使用,只是一个有趣的练习。 请参阅为什么使用JavaScript eval函数是一个坏主意? 了解详情。
这是最接近你可以得到,而不诉诸供应商特定的扩展:
myArray = [1,2,3]; eval(set('a,b,c = myArray'));
帮手function:
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(','); }
certificate它在任意范围内工作:
(function(){ myArray = [4,5,6]; eval(set('x,y,z = myArray')); console.log(y); // prints 5 })()
eval
在Safari中不受支持。
作为部长答案的更新,你现在可以用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 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等元组。
您也可以在Javascript中使用元组types。 只需用更高阶的函数来定义(学术术语是教会编码):
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)); // ab
[a, b, c] = [2, 'momo', 7] // b === 'momo', c ===7 ...