"foo" instanceof String //=> false
"foo" instanceof Object //=> false
true instanceof Boolean //=> false
true instanceof Object //=> false
false instanceof Boolean //=> false
false instanceof Object //=> false
// the tests against Object really don't make sense
배열 리터럴과 객체 리터럴이 일치합니다 …
[0,1] instanceof Array //=> true
{0:1} instanceof Object //=> true
왜 모두 다 그렇지 않습니까? 아니면 왜 모두 그렇지 않습니까?
그렇다면 그들은 어떤 예입니까?
FF3, IE7, Opera 및 Chrome에서 동일합니다. 따라서 적어도 일관성이 있습니다.
몇 가지를 놓쳤다.
12.21 instanceof Number //=> false
/foo/ instanceof RegExp //=> true
답변
기본 요소는 Javascript 내에서 작성된 오브젝트와 다른 유형입니다. 로부터 모질라 API 문서 :
var color1 = new String("green");
color1 instanceof String; // returns true
var color2 = "coral";
color2 instanceof String; // returns false (color2 is not a String object)
코드로 기본 유형을 구성하는 방법을 찾을 수 없습니다. 아마 불가능할 수도 있습니다. 아마도 사람들이 typeof "foo" === "string"
대신에 사용 하는 이유 일 것 입니다 instanceof
.
이와 같은 것들을 기억하는 쉬운 방법은 “나는 제정신이고 배우기 쉬운 것이 궁금하다”고 스스로에게 묻는 것입니다. 답이 무엇이든 Javascript는 다른 일을합니다.
답변
나는 사용한다:
function isString(s) {
return typeof(s) === 'string' || s instanceof String;
}
JavaScript에서 문자열은 리터럴 또는 객체 일 수 있기 때문입니다.
답변
JavaScript에서 프리미티브 (부울, 널, 숫자, 문자열 및 값 undefined
(및 ES6의 기호 ))를 제외한 모든 것이 오브젝트 (또는 최소한 오브젝트로 취급 될 수 있음)입니다.
console.log(typeof true); // boolean
console.log(typeof 0); // number
console.log(typeof ""); // string
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof []); // object
console.log(typeof {}); // object
console.log(typeof function () {}); // function
보시다시피 객체, 배열 및 값 null
은 모두 객체로 간주됩니다 ( null
존재하지 않는 객체에 대한 참조입니다). 함수는 특별한 유형의 호출 가능한 객체 이기 때문에 구별 됩니다. 그러나 여전히 개체입니다.
반면에 리터럴은 true
, 0
, ""
및 undefined
하지 개체입니다. JavaScript에서 기본 값입니다. 그러나 부울, 숫자 및 문자열에는 constructor Boolean
이 Number
있고 String
각각 추가 된 기능을 제공하기 위해 각각의 기본 요소를 랩핑합니다.
console.log(typeof new Boolean(true)); // object
console.log(typeof new Number(0)); // object
console.log(typeof new String("")); // object
당신은 원시 값이 내 포장 할 때 볼 수있는 것처럼 Boolean
, Number
그리고 String
생성자 각각 그들은 개체가됩니다. instanceof
연산자는 (은 반환 이유입니다 개체에 대한 작동 false
기본 값) :
console.log(true instanceof Boolean); // false
console.log(0 instanceof Number); // false
console.log("" instanceof String); // false
console.log(new Boolean(true) instanceof Boolean); // true
console.log(new Number(0) instanceof Number); // true
console.log(new String("") instanceof String); // true
당신은 모두를 볼 수있는 typeof
및 instanceof
값이 부울, 숫자 또는 문자열인지 테스트에 불충분 한 – typeof
단지 원시 논리 값, 숫자, 문자열 작동; 및 instanceof
원시 논리 값, 숫자, 문자열이 작동하지 않습니다.
다행히이 문제에 대한 간단한 해결책이 있습니다. 의 기본 구현 toString
(즉, 기본적으로 정의 된대로 Object.prototype.toString
)은 [[Class]]
기본 값과 객체 의 내부 속성을 반환 합니다.
function classOf(value) {
return Object.prototype.toString.call(value);
}
console.log(classOf(true)); // [object Boolean]
console.log(classOf(0)); // [object Number]
console.log(classOf("")); // [object String]
console.log(classOf(new Boolean(true))); // [object Boolean]
console.log(classOf(new Number(0))); // [object Number]
console.log(classOf(new String(""))); // [object String]
[[Class]]
값 의 내부 속성은 값보다 훨씬 유용 typeof
합니다. 우리는 다음과 같이 Object.prototype.toString
자신의 (더 유용한) 버전의 typeof
연산자 를 만드는 데 사용할 수 있습니다 .
function typeOf(value) {
return Object.prototype.toString.call(value).slice(8, -1);
}
console.log(typeOf(true)); // Boolean
console.log(typeOf(0)); // Number
console.log(typeOf("")); // String
console.log(typeOf(new Boolean(true))); // Boolean
console.log(typeOf(new Number(0))); // Number
console.log(typeOf(new String(""))); // String
이 기사가 도움이 되었기를 바랍니다. 프리미티브와 랩핑 된 객체의 차이점에 대한 자세한 내용은 다음 블로그 게시물을 참조하십시오. JavaScript 프리미티브의 비밀 생활
답변
생성자 속성을 사용할 수 있습니다.
'foo'.constructor == String // returns true
true.constructor == Boolean // returns true
답변
typeof(text) === 'string' || text instanceof String;
당신은 이것을 사용할 수 있습니다, 그것은 두 경우 모두에 작동합니다
-
var text="foo";
// typeof가 작동합니다 -
String text= new String("foo");
// instanceof가 작동합니다
답변
이는 ECMAScript 사양 섹션 7.3.19 3 단계 에서 정의됩니다 .If Type(O) is not Object, return false.
즉, Obj
in Obj instanceof Callable
이 객체가 아닌 경우, instanceof
의지는 false
직접 단락 됩니다.
답변
나는 가능한 해결책을 생각해 냈다고 생각합니다.
Object.getPrototypeOf('test') === String.prototype //true
Object.getPrototypeOf(1) === String.prototype //false