이 여기에 다른 모든 설명에 불과 보완 지식 - 내가 하지 사용하는 제안 .constructor
사방.
TL; DR은 : 상황에서 어디는 typeof
옵션이 아닙니다, 그리고 당신이 프로토 타입 체인에 대해 걱정하지 않는 것을 알고있을 때 , Object.prototype.constructor
가능한 또는 더 나은 대안보다 수 있습니다 instanceof
:
x instanceof Y
x.constructor === Y
1.1 이후 표준으로 사용되므로 이전 버전과의 호환성에 대해 걱정할 필요가 없습니다.
무함마드 우 메르 (Muhammad Umer)는이 글을 여기 어딘가에 간단히 언급했습니다. 전부는 아니다 - 그래서 그것은 프로토 타입 모두에서 작동 null
또는 undefined
:
// (null).constructor; // TypeError: null has no properties
// (undefined).constructor; // TypeError: undefined has no properties
(1).constructor; // function Number
''.constructor; // function String
([]).constructor; // function Array
(new Uint8Array(0)).constructor; // function Uint8Array
false.constructor; // function Boolean()
true.constructor; // function Boolean()
(Symbol('foo')).constructor; // function Symbol()
// Symbols work, just remember that this is not an actual constructor:
// new Symbol('foo'); //TypeError: Symbol is not a constructor
Array.prototype === window.frames.Array; // false
Array.constructor === window.frames.Array.constructor; // true
또한 사용 사례에 따라 전체 프로토 타입 체인을 확인할 필요가없는 것 보다 훨씬 빠를 수 있습니다 instanceof
. 필자의 경우 값이 형식화 된 배열인지 확인하는 빠른 방법이 필요했습니다.
function isTypedArrayConstructor(obj) {
switch (obj && obj.constructor){
case Uint8Array:
case Float32Array:
case Uint16Array:
case Uint32Array:
case Int32Array:
case Float64Array:
case Int8Array:
case Uint8ClampedArray:
case Int16Array:
return true;
default:
return false;
}
}
function isTypedArrayInstanceOf(obj) {
return obj instanceof Uint8Array ||
obj instanceof Float32Array ||
obj instanceof Uint16Array ||
obj instanceof Uint32Array ||
obj instanceof Int32Array ||
obj instanceof Float64Array ||
obj instanceof Int8Array ||
obj instanceof Uint8ClampedArray ||
obj instanceof Int16Array;
}
https://run.perf.zone/view/isTypedArray-constructor-vs-instanceof-1519140393812
그리고 결과 :
Chrome 64.0.3282.167 (64 비트, Windows)
Firefox 59.0b10 (64 비트, Windows)
호기심으로, 나는 빠른 장난감 벤치 마크를했다 typeof
; 놀랍게도 성능이 훨씬 떨어지고 Chrome에서는 조금 더 빠릅니다.
let s = 0,
n = 0;
function typeofSwitch(t) {
switch (typeof t) {
case "string":
return ++s;
case "number":
return ++n;
default:
return 0;
}
}
// note: no test for null or undefined here
function constructorSwitch(t) {
switch (t.constructor) {
case String:
return ++s;
case Number:
return ++n;
default:
return 0;
}
}
let vals = [];
for (let i = 0; i < 1000000; i++) {
vals.push(Math.random() <= 0.5 ? 0 : 'A');
}
https://run.perf.zone/view/typeof-vs-constructor-string-or-number-1519142623570
참고 : 기능이 나열된 순서는 이미지 간을 전환합니다!
Chrome 64.0.3282.167 (64 비트, Windows)
Firefox 59.0b10 (64 비트, Windows)
참고 : 기능이 나열된 순서는 이미지 간을 전환합니다!