来自元组的JavaScript变量赋值

Kar*_*arl 87 javascript tuples destructuring

在Python 2和Python 3等其他语言中,您可以为元组变量定义和赋值,并检索它们的值,如下所示:

tuple = ("Bob", 24)
name, age = tuple
print(name)           #name evaluates to Bob
print(age)            #age evaluates to 24
Run Code Online (Sandbox Code Playgroud)

JavaScript中有类似的东西吗?或者我只需要用数组的丑陋方式来做:

tuple = ["Bob", 24]
name = tuple[0]       //name Evaluates to Bob
age = tuple[1]        //age Evaluates to 24
Run Code Online (Sandbox Code Playgroud)

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

pc1*_*ter 102

Javascript 1.7添加了结构化赋值,它允许您基本上完成您所追求的目标.

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

  • 它现在实际上是ES6的一部分. (59认同)
  • @ninjagecko:"JavaScript"是Mozilla的实现,解构分配将成为即将到来的ecmascript标准的一部分 (13认同)
  • 几年后,我的答案在技术上已经变得正确,但对正确和有帮助都没有帮助.好极了! (8认同)
  • 这不是基于标准的javascript,而是特定于Mozilla的扩展. (5认同)

Gab*_*aru 48

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


mon*_*amp 27

你可以做类似的事情:

var tuple = Object.freeze({ name:'Bob', age:14 })
Run Code Online (Sandbox Code Playgroud)

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

tuple.name 
tuple.age 
Run Code Online (Sandbox Code Playgroud)

  • 我不会downvote但技术上这是不正确的.在声明对象后,您仍然可以更改(即改变)tuple.name和tuple.age的值.根据定义,不可变类型在定义后不能更改.它们就像只读类型,其中参数及其值只能声明一次. (5认同)
  • @EvanPlaice如果可变性是一个问题,你可以使用[`Object.freeze()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze),即:`tuple = Object.freeze({name:'Bob',年龄:14})` (4认同)

Adr*_*ian 26

这个"元组"功能在EcmaScript2015中称为解构,很快就会得到最新浏览器的支持.目前,只有Firefox和Chrome支持它.

但是,嘿,你可以使用一个转换器.

代码看起来和python一样好:

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

console.log(name)
console.log(age)
Run Code Online (Sandbox Code Playgroud)

  • 对于未来的读者:自 chrome 49 起,chrome 支持此功能(根据 Mozilla 文档)。您还可以使用此处的 Mozilla 文档检查兼容性:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment (2认同)
  • 这应该被认为是新接受的答案. (2认同)

Mat*_*vis 10

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

const tuple = Object.freeze(["Bob", 24]);
let [name, age]; = tuple
console.debug(name); // "Bob"
console.debug(age); // 24
Run Code Online (Sandbox Code Playgroud)

看中并定义一个类

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
Run Code Online (Sandbox Code Playgroud)

今天可以在所有最新的浏览器中使用。

  • 否。 const 不可重新分配。你不能做 const tuple = ["Jim", 35]; 元组 = [“詹姆斯”,35]。你可以做 const tuple = ["Jim", 35]; 元组[0] =“詹姆斯”;因此它不是一成不变的。 (3认同)
  • 具有这样的不变性实际上很酷。 (2认同)

med*_*iev 5

遗憾的是,您无法在(ECMA | Java)脚本中使用该元组赋值语法.

编辑:有人链接到Mozilla/JS 1.7 - 这不适用于跨浏览器,但如果不需要,则有你的答案.


Eva*_*ice 5

JavaScript不支持元组

如果您正在寻找不可变列表,可以使用Object.freeze()来使数组不可变.

Object.freeze()方法冻结一个对象:即阻止向其添加新属性; 防止删除现有属性; 并防止现有属性或其可枚举性,可配置性或可写性被更改.实质上,该对象实际上是不可变的.该方法返回被冻结的对象.

来源:Mozilla开发者网络 - Object.freeze()

像往常一样分配数组,但使用'Object.freeze()锁定它

> tuple = Object.freeze(['Bob', 24]);
[ 'Bob', 24 ]
Run Code Online (Sandbox Code Playgroud)

像使用常规数组一样使用值(不支持python多重赋值)

> name = tuple[0]
'Bob'
> age = tuple[1]
24
Run Code Online (Sandbox Code Playgroud)

尝试分配新值

> tuple[0] = 'Steve'
'Steve'
Run Code Online (Sandbox Code Playgroud)

但价值没有改变

> console.log(tuple)
[ 'Bob', 24 ]
Run Code Online (Sandbox Code Playgroud)