prostu ciekawi:Dlaczego 4 nie jest instancją numeru?
- 4 Ilość instanceof => false
- nowy numer (4) instanceof Number => true?
Dlaczego tak jest? To samo z ciągów:
'some string' instanceof String
zwraca falsenew String('some string') instanceof String
=> trueString('some string') instanceof String
zwraca również fałszywe('some string').toString instanceof String
zwraca również fałszywe
dla obiektu, typy macierzy lub funkcja operatora instanceof działa zgodnie z oczekiwaniami. Po prostu nie wiem, jak to zrozumieć.
[nowe spostrzeżenia]
Object.prototype.is = function() {
var test = arguments.length ? [].slice.call(arguments) : null
,self = this.constructor;
return test ? !!(test.filter(function(a){return a === self}).length)
: (this.constructor.name ||
(String(self).match (/^function\s*([^\s(]+)/im)
|| [0,'ANONYMOUS_CONSTRUCTOR']) [1]);
}
// usage
var Newclass = function(){}; // anonymous Constructor function
var Some = function Some(){}; // named Constructor function
(5).is(); //=> Number
'hello world'.is(); //=> String
(new Newclass()).is(); //=> ANONYMOUS_CONSTRUCTOR
(new Some()).is(); //=> Some
/[a-z]/.is(); //=> RegExp
'5'.is(Number); //=> false
'5'.is(String); //=> true
musisz użyć 'Number.prototype.isPrototypeOf (inp)' - Twój sposób również działałby, gdyby został poprawnie wykonany: 'inp.constructor === Number'; może zawieść, ponieważ 'konstruktor' jest tylko właściwością prototypu i może zostać nadpisany! – Christoph
Nie jestem pewien, czy rozumiem, co masz na myśli, gdy "można nadpisać". Nie oznacza to, że mogę nadpisać konstruktor innym konstruktorem (wypróbowałem go). Number.prototype.isPrototypeOf (4) zwraca wartość false, ale nie mogę tego użyć do sprawdzenia typu wartości pierwotnych, czy mam rację? – KooiInc
To był cały punkt (prymitywny! == zawijany prymityw)! Sprawdzanie konstruktorów jest niebezpieczne z powodu 'obj [' constructor '] = ??? 'działa! Proponuję użyć mojej funkcji 'typeOf()'; do traktowania prymitywów i owiniętych prymitywów to samo, użyj 'if (typeOf (x) .toLowerCase() === 'string')' – Christoph