元组中的 JavaScript 变量赋值

IT技术 javascript tuples destructuring
2021-03-18 18:09:17

在 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

有没有更好的方法来模拟 JavaScript 5 中的 Python 元组?

更新:请参阅有关 ES6 的答案,对于新项目,它应该比 CoffeeScript 更受青睐。

6个回答

Javascript 1.7 添加了解构赋值,使您基本上可以做您想做的事情。

function getTuple(){
   return ["Bob", 24];
}
var [a, b] = getTuple();
// a === "bob" , b === 24 are both true

你必须以丑陋的方式去做。如果你真的想要这样的东西,你可以看看CoffeeScript,它有它和很多其他功能,使它看起来更像 python (抱歉让它听起来像一个广告,但我真的很喜欢它。)

嗯,这很有趣,只是我自己遇到了这个场景,因为 JavaScript 似乎没有提供明显的元组支持,并且来自函数式编程的紧张时期,您开发了对元组的需求。我也刚刚发现了这个,但不确定它是否有效,它在元组支持方面看起来也不错: cs.umd.edu/projects/PL/arrowlets/api-tuples.xhtml我肯定会看看 CoffeeScript。
2021-05-08 18:09:17
更新这个答案会很棒,很多 CoffeeScript 的想法已经移植到 javascript,不再需要 CoffeeScript
2021-05-18 18:09:17

你可以做类似的事情:

var tuple = Object.freeze({ name:'Bob', age:14 })

然后将姓名和年龄称为属性

tuple.name 
tuple.age 
我不会投反对票,但从技术上讲,这是不正确的。在声明对象后,您仍然可以更改(即变异)tuple.name 和 tuple.age 的值。根据定义,不可变类型在定义后不能更改。它们就像只读类型,其中参数及其值只能声明一次。
2021-04-25 18:09:17
@EvanPlaice 我不明白可变性问题的来源——元组在原始 Python 示例中不是一成不变的!
2021-04-28 18:09:17
@EvanPlaice 如果可变性是一个问题,你可以使用Object.freeze(),即:tuple = Object.freeze({ name:'Bob', age:14 })
2021-05-06 18:09:17
@canon 我同意,这可能是整个线程中唯一可接受/正确的方法。不幸的是,mcm 的答案不会冻结对象,因此它仍然是可变的。
2021-05-09 18:09:17
@DanielBuckmaster Python 中列表和元组之间的区别在于,列表是可变的,而元组则不是。请参阅docs.python.org/2/tutorial/...JavaScript 本身并不支持元组,因为所有 JS 数据结构都是可变的,除非您在创建对象后调用 Object.freeze()。
2021-05-16 18:09:17

这种“元组”功能在 EcmaScript2015 中称为解构,很快就会被最新的浏览器支持。暂时只有 Firefox 和 Chrome 支持

但是,嘿,您可以使用转译器

代码看起来和 python 一样好:

let tuple = ["Bob", 24]
let [name, age] = tuple

console.log(name)
console.log(age)
致未来的读者:自 chrome 49 起,chrome 支持此功能(根据 Mozilla 文档)。您还可以使用此处的 Mozilla 文档检查兼容性:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-04-22 18:09:17

冻结数组的行为与 Python 元组相同:

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

今天适用于所有最新的浏览器。

不可以。const 不可重新分配。你不能做 const tuple = ["Jim", 35]; 元组 = [“詹姆斯”,35]。你可以做 const tuple = ["Jim", 35]; 元组[0] =“詹姆斯”;因此它不是一成不变的。
2021-05-17 18:09:17
你不能把它设置成一个常量吗?const 是不可变的,不是吗?
2021-05-21 18:09:17