Yanıtlar:
Tamamen aynı değildirler ve aslında, işlev olarak adlandırılan String yapıcısı (ilk örneğiniz), sonunda, toStringgeçen nesnenin yöntemini çağırır, örneğin:
var o = { toString: function () { return "foo"; } };
String(o); // "foo"
Öte yandan, bir tanımlayıcı atıfta bulunursa nullveya yöntemi undefinedkullanamazsanız, toStringsize bir TypeErroristisna verecektir :
var value = null;
String(null); // "null"
value.toString(); // TypeError
StringBir fonksiyonu olarak adlandırılan yapıcı kabaca eşdeğer olacaktır:
value + '';
Object- to- Primitive'den tür dönüştürme kuralları , [[DefaultValue]]dahili işlem olan spesifikasyonda ayrıntılı olarak açıklanmıştır .
Kısaca özetlemek gerekirse, Object -to- String'den dönüştürürken aşağıdaki adımlar atılır:
toStringyöntemi uygulayın.
resultbir olan ilkel , geri dönüş result2. Adım, başka go.valueOfyöntemi uygulayın.
resultbir olan ilkel , geri dönüş result3. Adım, başka go.TypeError.Yukarıdaki kurallar göz önüne alındığında, ilgili anlambilimlere bir örnek verebiliriz:
var o = {
toString: function () { return "foo"; },
valueOf: function () { return "bar"; }
};
String(o); // "foo"
// Make the toString method unavailable:
o.toString = null;
String(o); // "bar"
// Also make the valueOf method unavailable:
o.valueOf = null;
try {
String(o);
} catch (e) {
alert(e); // TypeError
}
Bu mekanizma hakkında daha fazla bilgi edinmek istiyorsanız, ToPrimitiveve ToStringdahili işlemlere bakmanızı tavsiye ederim .
Bu makaleyi de okumanızı tavsiye ederim:
new String({toString: null})bir TypeError.
String()ve + ''şimdi oldukça önemli bir fark var. String(Symbol())çalışacak, ancak Symbol() + ''bir hata atacak (ve Symbol (), null ve undefined'ın aksine, sahte bir korumayı geçecek, böylece x && (x + '')şimdi atabilir).
value.toString()valueboş ise hataya neden olur . String(value)yapmamalı.
Örneğin:
var value = null;
alert(value.toString());
başarısız olacak çünkü value == null.
var value = null;
alert(String(value));
"boş" (veya benzeri) yazan bir mesaj görüntülemelidir, ancak kilitlenmeyecektir.
String(value)veya value.toString()gibi özellikleri olmayan değerler dışında her durumda olduğu gibi aynı sonucu almalıdır . aynı sonucu verecektir.nullundefined''+value
String () [ yapıcı çağrısı ] temelde .toString () 'i çağırıyor
.toString () ve String () ilkel değerlerde (sayı, boolean, dize) çağrılabilir ve temelde özel bir şey yapmaz:
true => 'true'
false => 'false'
17 => '17'
'merhaba' => 'merhaba'
Ancak bu işlevleri nesneler üzerinde çağırmak, işlerin ilginçleştiği yerdir:
nesnenin kendi .toString () işlevi varsa, bu nesnenin bir dizge olarak işlem görmesi gerektiğinde çağrılacaktır (açıkça / örtük olarak)
let obj = {
myName:"some object",
toString:function(){ return this.myName; }
}
//implicitly treating this obj as a string
"hello " + obj; //"hello some object"
//OR (explicitly)
"hello " + String(obj) //calling the existent toString function
//OR
"hello " + obj.toString(); //calling toString directly
Bu arada, bu nesneyi bir sayı olarak değerlendirmek istiyorsanız, içinde tanımlanmış bir .valueOf () işlevine sahip olmalıdır .
ya ikimiz de tek bir nesnede varsa?
Bu nesneyi bir dizge olarak ele almak istiyorsak => .toString () kullanın
bu nesneyi bir sayı olarak ele almak istiyorsak => .valueOf () kullanın
ya sadece .valueOf () tanımlıysak?
Nesnenin içinde tanımlanan .valueOf () , nesneyi bir dizge veya sayı olarak ele almak isteyip istemediğimizi çağrılacaktır.
new String(value)herhangi bir değerde, her zaman bir dizge nesnesi döndürür.