Bir nesneyi döndüren ECMAScript 6 ok işlevi


619

Bir nesneyi ok işlevinden döndürürken , dilbilgisindeki bir belirsizlik nedeniyle fazladan {}bir returnanahtar kelime ve bir anahtar kelime kullanmak gerekli görünüyor .

Bu yazamam p => {foo: "bar"}ama yazmak zorunda olduğum anlamına geliyor p => { return {foo: "bar"}; }.

Ok fonksiyonu bir nesnenin başka bir şey dönerse, {}ve return, örneğin gereksizdir: p => "foo".

p => {foo: "bar"}döner undefined.

Modifiye edilmiş bir : beklenmeyen simge: ' '”p => {"foo": "bar"} atar .SyntaxError:

Kaçırdığım açık bir şey var mı?

Yanıtlar:


1108

Dönen nesne hazır bilgisini parantez içine almanız gerekir. Aksi takdirde, kıvırcık parantezlerin fonksiyonun gövdesini gösterdiği kabul edilecektir. Aşağıdaki işler:

p => ({ foo: 'bar' });

Başka bir ifadeyi parantez içine almanıza gerek yoktur:

p => 10;
p => 'foo';
p => true;
p => [1,2,3];
p => null;
p => /^foo$/;

ve bunun gibi.

Başvuru: MDN - Nesne değişmezlerini döndürme


7
Neden ebeveynlerin fark yarattığını merak ediyorum .
wrschneider

40
@wrschneider çünkü parens olmadan js ayrıştırıcı onun bir işlev gövdesi olduğunu, bir nesne değil ve foo bir etiket olduğunu düşünüyor
alexpods

21
@wrschneider daha spesifik olarak, AST düğümleri açısından, parantezlerin kullanılması, bir nesne ifadesinin var olabileceği bir ifade ifadesini gösterirken, varsayılan olarak, süslü parantezler bir blok ifadesi olarak yorumlanır.
Patrick Roberts

5
Hiçbir fikrim neden bu eserler, ancak değerini kullanmak istiyorsanız pnesnesi değişmez gelince tuşu, bu böyle yaparız: p => ({ [p]: 'bar' }). Olmadan, []ya undefinedharf ya da kelimenin tam anlamıyla mektup olacaktır p.
DanMan

1
@DanMan Bilgisayarlı özellikler olarak adlandırılır ve nesne değişmezlerinin bir özelliğidir.
D. Pardal

62

Sözdiziminin neden geçerli olduğunu (ancak beklendiği gibi çalışmadığını) merak edebilirsiniz:

var func = p => { foo: "bar" }

JavaScript'in etiket sözdizimi nedeniyle :

Yukarıdaki kodu ES5'e aktarırsanız, şöyle görünmelidir:

var func = function (p) {
  foo:
  "bar"; //obviously no return here!
}

5
Etiketler nadiren kullanılan ve ezoterik bir özelliktir. GERÇEKTEN herhangi bir değeri var mı? Kullanımdan kaldırılmaları ve nihayetinde kaldırılmaları gerektiğini hissediyorum.
Kenmore

@Kenmore Bkz. Stackoverflow.com/questions/55934490/… - geriye dönük uyumluluk. Tarayıcılar, mevcut siteleri bozan bir özellik uygulamayı reddedecektir
CertainPerformance

@ Etiketlenmişse, iç içe döngülerden çıkabilirsiniz. Sık kullanılmaz ama kesinlikle faydalıdır.
Petr Odut

17

Ok işlevinin gövdesi kıvırcık parantez içine sarılmışsa, örtük olarak döndürülmez. Nesneyi parantez içine alın. Böyle bir şey olurdu.

p => ({ foo: 'bar' })

Vücudu parens'e sararak işlev geri döner { foo: 'bar }.

Umarım bu sorununuzu çözer. Değilse, son zamanlarda Ok işlevleriyle ilgili daha ayrıntılı bir makale yazdım. Umarım faydalı bulursunuz. Javascript Ok İşlevleri


2

doğru yollar

  1. normal dönüş nesnesi

const getUser = user => {return { name: user.name, age: user.age };};

const user = { name: "xgqfrms", age: 21 };

console.log(getUser(user));
//  {name: "xgqfrms", age: 21}
  1. (js ifadeleri)

const getUser = user => ({ name: user.name, age: user.age });

const user = { name: "xgqfrms", age: 21 };

console.log(getUser(user));
//  {name: "xgqfrms", age: 21}

açıklamak

görüntü

Aynı cevabı burada bulabilirsiniz!

https://github.com/lydiahallie/javascript-questions/issues/220

https://mariusschulz.com/blog/returning-object-literals-from-arrow-functions-in-javascript


1

Konu:

Yaptığınız zaman:

p => {foo: "bar"}

JavaScript yorumlayıcısı, çok ifadeli bir kod bloğu açtığınızı düşünüyor ve bu blokta açıkça bir return ifadesinden bahsetmeniz gerekiyor.

Çözüm:

Senin Eğer ok fonksiyonu ifadesi bir sahip tek açıklama , o zaman aşağıdaki sözdizimini kullanabilirsiniz:

p => ({foo: "bar", attr2: "some value", "attr3": "syntax choices"})

Ancak birden çok ifadeye sahip olmak istiyorsanız , aşağıdaki sözdizimini kullanabilirsiniz:

p => {return {foo: "bar", attr2: "some value", "attr3": "syntax choices"}}

Yukarıdaki örnekte, ilk küme parantezleri kümesi çok ifadeli bir kod bloğu açar ve ikinci küme parantezleri dinamik nesneler içindir. Ok işlevinin çoklu ifade kod bloğunda, return ifadelerini açıkça kullanmanız gerekir

Daha fazla ayrıntı için JS Ok İşlev İfadeleri için Mozilla Docs'a bakın


-2

Daha özel çözümler için bunu her zaman kontrol edebilirsiniz:

x => ({}[x.name] = x);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.