2015-11-22 29 views
15

C# dilinden Lisp - Scala - Haskell arasında her şeyle çalışmış ve bunları destekleyen her dilde, semboller hemen hemen aynı şekilde davranıyor; Yani, aynı ada sahip herhangi iki sembolün, tekil nesneler oldukları için özdeş oldukları garanti edilir.ES6 Sembollerini Anlama

Raket: (equal? 'foo 'foo) gerçek

Common Lisp: (eq 'foo 'foo) gerçek

Yakut: :foo == :foo gerçek

Scala: 'foo == 'foo gerçek

ES6: Symbol('foo') === Symbol('foo')yanlış

Sembollerin tekil olduğu yararı açıktır: Onları anahtarınız girişinize eşit olmama riskine girmeden bunları haritalar/sözlükler içinde kullanabilirsiniz, çünkü dil aniden farklı şekillerde karar vermiştir (size bakarak, Ruby)

Peki neden ECMAScript 6 bu konuda farklı bir yaklaşım benimsiyor ve bu konuda nasıl yardımcı olabilirim?

cevap

14

yapabilirsiniz (sıralama-) kayıtlı (global) sembollerini kullanarak adıyla "bilinebilir" olmak sembollerin efekti elde a sahip

var s1 = Symbol.for("foo"); 
var s2 = Symbol.for("foo"); 
s1 === s2; // true 

sen de kendi Sembol kayıt oluşturabilirsiniz Tabii Harita örneği veya düz bir nesne.

düzenlemek — Ben opsiyonel dize parametresi amacı yeni Sembol örneğini yaparken ekleyeceğiz programcısı için bir sembol anlamını ve amacını tanımlayan bir yolunu sunmaktır. Bu dize olmadan, bir Sembol bir Sembol olarak düzgün çalışır, ancak bir hata ayıklayıcısında bir nesneyi çıkarırsanız, bu anonim Sembol örnekleri tarafından girilen özellikler yalnızca değerlerdir. Sembol tuşlarıyla bir nesnedeki sayısal özellikleri koruyorsanız, yalnızca bazı rakamlar görürsünüz ve bu kafa karıştırıcı olur. Bir Symbol örneğiyle ilişkilendirilmiş açıklama dizesi, programcı referans bilgisini Sembolün benzersizliğinden ödün vermeden bir anahtar değer olarak verir.

Son olarak, benzer şekilde oluşturulmuş iki Symbol örneğinde her zaman .toString() aramasının sonucunu karşılaştırabilirsiniz. Ben şüpheli bu uygulamanın sorgulanabilir sayılacağını, ancak kesinlikle bunu yapabilirsiniz.

bir bakıma bu JavaScript Sembol yaratılış varsayılan davranış türü demek daha daha kullanışlı yapar diye düşündüğüm oluyor — daha düzenleme, Clojure içinde Erlang atomlar veya tuşları. Dil, varsayılan olarak, benzersiz olması garantili bir değer sağladığından, ad alanı çarpışmasının temel sorunu oldukça iyi çözülür. "İyi bilinen" sembollerle çalışmak hala mümkündür, ancak çarpışmalardan kaçınmak isteyebilecek diğer kodlarla ilgili anlaşmazlıklardan endişelenmenize gerek kalmadan benzersiz değerlere sahip olmak iyidir. JavaScript, bir programcının varlığından bile haberi olmayan bir kod tarafından kirletilebilecek bir global isim alanının, bir şekilde benzersiz ve kesinlikle benzersiz ve kontrol edilemeyen bir soruna sahiptir, çünkü kod, tarayıcı ortamından farklı bir tarafın eylemlerine bağlı olarak çarpışabilir. ve bilinmeyen bir sayıda yazılım mimarları.

+1

niçin 'sort-of' - 'etrafında almak için iyi bir yol gibi görünüyor' –

+0

@JaromandaX iyi bir şekilde kapsam değil, ama sanırım başka bir dilde (Erlang) semboller için durum böyle. Clojure ... ve şu anda aklıma gelen tek şey bu. – Pointy

+0

Bu cevap "neden" ile ilgilenmiyor. – Ben