String (değer) ile value.toString () arasındaki fark nedir


105

Javascript, türler ve tür dönüştürmeleriyle ilgili birçok "hile" içerir, bu yüzden bu 2 yöntemin aynı olup olmadığını veya onları farklı kılan bir köşe durumu olup olmadığını merak ediyorum.

Yanıtlar:


123

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:

  1. Varsa, toStringyöntemi uygulayın.
    • Eğer resultbir olan ilkel , geri dönüş result2. Adım, başka go.
  2. Varsa, valueOfyöntemi uygulayın.
    • Eğer resultbir olan ilkel , geri dönüş result3. Adım, başka go.
  3. Fırlat 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:


1
Üçüncü bir "yol" vardır, eğer bunu çağırırsanız: new String(value)herhangi bir değerde, her zaman bir dizge nesnesi döndürür.
Herbertusz

@Herbertusz new String({toString: null})bir TypeError.
Константин Ван

Sembollerin eklenmesiyle 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).
yeerk

24

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.


3
JavaScript'te hiç boş işaretçi istisnası görmedim ... bunu nerede gördünüz?
Dagg Nabbit

Güzel. bir örnekle daha güzel olurdu
mykhal

@no, @casablanca Düzeltildi. Java'ya alışkınım. @mykhal Bu nasıl görünüyor?
Jonathan

Bir "null" dizesi döndürür :)
moefinley

1

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


1

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.

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.