[javascript] 일부 리터럴에서 instanceof가 false를 반환하는 이유는 무엇입니까?

"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 BooleanNumber있고 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

당신은 모두를 볼 수있는 typeofinstanceof값이 부울, 숫자 또는 문자열인지 테스트에 불충분 한 – 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; 

당신은 이것을 사용할 수 있습니다, 그것은 두 경우 모두에 작동합니다

  1. var text="foo"; // typeof가 작동합니다

  2. String text= new String("foo"); // instanceof가 작동합니다


답변

이는 ECMAScript 사양 섹션 7.3.19 3 단계 에서 정의됩니다 .If Type(O) is not Object, return false.

즉, Objin Obj instanceof Callable이 객체가 아닌 경우, instanceof의지는 false직접 단락 됩니다.


답변

나는 가능한 해결책을 생각해 냈다고 생각합니다.

Object.getPrototypeOf('test') === String.prototype    //true
Object.getPrototypeOf(1) === String.prototype         //false