2015-01-01 8 views
21

vs yeni Symbol.toPrimitive sembolü, bir amacı anahtar olarak kullanıldığında, should define bir fonksiyon, bir nesnenin temel değerini dönmek için olan sokulur Symbol.toPrimitive:ECMAScript'te 6, Object.prototype.valueOf

let object = { 
    aNumber: 0, 
    [Symbol.toPrimitive]() { 
     return this.aNumber; 
    } 
}; 

object.aNumber = 5; 
console.log(object + 2) // 7 

Bununla birlikte, aynı zamanda, temel bir değere, bir nesneyi dönüştürmek için yeniden olabilir, according to the documentationObject.prototype.valueOf işlevi vardır: bu yüzden

let object = { 
    aNumber: 0, 
    valueOf() { 
     return this.aNumber; 
    } 
}; 

object.aNumber = 5; 
console.log(object + 2) // 7 

, bu yollardan hangi Bir nesneyi ilkel değerine dönüştürmek, yeni bir nesne tanımlarken ES6'da kullanılmalıdır?

+1

[Teknik] (http://people.mozilla.org/~jorendorff/es6-draft.html#sec-toprimitive) -> _The Anahtar işletme ToPrimitive bir giriş bağımsız değişken ile isteğe bağlı argüman PreferredType alır. Soyut işlem ToPrimitive, giriş argümanını Nesne olmayan bir türe dönüştürür. Bir nesne birden fazla ilkel türüne dönüştürebiliyorsa, bu tip tercihini tercih etmek için tercih edilen İpucu PreferredType kullanabilir. - Özel '.toPrimitive()' ise '.valueOf()' nın reesarı döndürülür. – Andreas

+0

@Andreas Bağlandığınız paragraf, "Symbol" belirtimiyle değil, _any_ ilkel olmayan değeri ilkel olana dönüştürmedir. 'Symbol.toPrimitive' için uygun spec [paragraf 19.4.3.4 içinde.] Olduğu (https://people.mozilla.org/~jorendorff/es6-draft.html#[email protected]@toprimitive) –

cevap

10

Symbol.toPrimitive'un temel amacı, toString ve valueOf farklı zorlama senaryolarında çağrılan sırasını değiştirmektir.

Bunun bir örneği varsayılan olarak bunu bir sayı bir dizeye değerini dönüştürür Date yerli nesne geçerli: Bunu yapmak istemiyorsanız

console.log(1 + new Date()); // "1Mon Aug 15 2016 13:25:31 GMT-0500 (EST)" 

var a = new Date(1000); 
console.log(a == 1000); // false 
console.log(a == a.toString()); // true 

, sadece gerektiği Bu yerel nesnelerin çoğu JavaScript yapması gereken şeydir - hem obj.valueOf ve obj.toString istediğiniz davranışı eşleştirmek için geçersiz kılar. ToPrimitive soyut işlem ToPrimitive çağrıldığını nedene bağlı olarak zorlama için bunlardan birini çağırabilir hem valueOfvetoString, geçersiz kılınmış

Not.

+1

“Symbol” artık tüm modern tarayıcılarda (IE11) ve “Symbol.toPrimitive” [şu anda Chrome, Firefox ve Düğüm tarafından desteklenmektedir] (http://kangax.github.io/compat-table/es6/) tarafından desteklenmektedir. # test-kuyu-known_symbols_Symbol.toPrimitive). – rvighne

+1

@rvighne Hatırlatıcı için teşekkürler, cevabı güncelledim. –

+0

Ayrıca "Symbol.toPrimitive", hangi türün dönüştürüleceğini gösteren bir argümanla çağrılır ("default". "Number" veya "string") – jcubic