var test = new Boolean(0)
test.prop = "OK!"
Czy możesz zmienić wartość test
na true
?Zmień wartość owiniętego pierwotnego typu danych
, ale test.prop
powinien nadal być "OK!"
innymi słowy, test
powinny być tego samego obiektu
var test = new Boolean(0)
test.prop = "OK!"
Czy możesz zmienić wartość test
na true
?Zmień wartość owiniętego pierwotnego typu danych
, ale test.prop
powinien nadal być "OK!"
innymi słowy, test
powinny być tego samego obiektu
Wbudowany owijarki obiektów (utworzony z Boolean
, Number
, String
i Date
constuctors) zachować pierwotny owinięty wartość we właściwości wewnętrznej nazwie [[PrimitiveValue]]
, które nie mogą być zmienione, ale ...
można zastąpić metodę valueOf
swojego obiektu test
:
var test = new Boolean(0);
test.prop = "OK!"
// override valueOf:
test.valueOf = function() { return true; };
if (test == true) { // using the equals operator explicitly for type conversion
alert(test.prop); //"OK!"
}
Będzie działać, ponieważ metoda valueOf
jest używana wewnętrznie przez mechanizmy konwersji typu uruchomione przez operatora równości.
Gdy jeden z operandów jest wartością logiczną, oba są konwertowane na końcu na Number.
Jeśli nie używa operatora równości (np if (test) { ... }
), ponieważ test
jest obiektem, po konwersji bezpośrednio logiczną, będzie zawsze dają true
.
Każdy obiekt przekształca się logiczną spowoduje wartość true
jedyne wartości, które wytwarzają false
efekcie są wartości „falsey” (null
, undefined
, 0
, NaN
pusty tekst, i oczywiście wartość false
), cokolwiek innego będzie produkować true
.
Więcej informacji:
nr
var test = new Boolean(0);
tworzy nowy obiekt i umieszcza odniesienie do niej w 'test'
test.prop = 'ss'
dynamicznie stawia nowa właściwość obiektu (meta-programowanie FTW!)
test = true;
przypisuje test do typu pierwotnego typu Boolean. Odniesienie do obiektu Boolean zostanie utracone.
Wreszcie, obiekt Boolean nie ma żadnych metod przełączania lub ponownego przypisywania jego wartości, tj. Obiekty Boolean są niezmienne.
Jednak można dodać metodę Boolean.prototype to zmienić, jeśli chcesz ....
owijki obiektów utworzyć niezmienna typu odniesienia w JS. Ponieważ w JS pierwotne typy danych są niezmienne, ich odniesienia również powinny być niezmienne.Może to być przydatne w rzadkich przypadkach, ale najprawdopodobniej nie zrobi tego, co chcesz. Na przykład, jeśli chcesz zmienić pierwotną wartość źródła i obejrzeć odniesienia do niego, nie możesz użyć konstruktora obiektów, aby osiągnąć pożądany efekt. Najlepszym rozwiązaniem byłoby uniknięcie konstruktora Object
i użycie odpowiedniego literału obiektowego do umieszczenia pierwotnej wartości w ramach właściwości w następujący sposób;
var pv = "test",
pvr = {0: pv},
arr = new Array(5).fill().map(_ => pvr);
console.log(JSON.stringify(arr));
pvr[0] = "Hello";
console.log(JSON.stringify(arr));
chociaż reprezentacja ciąg pozostaje 'FALSE, ponieważ wartość bazowy nie zmieniła .. –
@Gaby, cóż, to zależy od tego, w jaki sposób konwersja typu jest wykonana, na przykład, jeśli łączymy z nim ciąg znaków, np 'test + ''' wynikiem będzie "true" (najpierw użyty zostanie "valueOf"), jeśli użyjesz konstruktora 'String' jako funkcji, np .:' String (test); 'to wywoła Metoda '' Boolean.prototype.toString'] (http://ecma262-5.com/ELS5_HTML.htm#Section_15.6.4.2). Zgadzam się, dobrze jest również zastąpić 'toString'. – CMS
ah bardzo ładne .. Właśnie zaalarmowałem wartość 'alert (test)' i wyświetliło 'false'. Wygląda na to, że metoda 'alert' używa konstruktora String lub wywołuje' toString' na swoich argumentach .. dzięki dla głów. –