来自元组的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" 

https://jsbin.com/fubaluwimo/edit?js,console

这是一个简单的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 ...