>  기사  >  웹 프론트엔드  >  JavaScript의 유형 확인: typeof와 instanceof 연산자의 차이점

JavaScript의 유형 확인: typeof와 instanceof 연산자의 차이점

青灯夜游
青灯夜游앞으로
2020-12-17 09:35:132272검색

typeof와 instanceof 연산자 모두 JavaScript에서 유형 검사를 수행할 수 있는데, 둘 사이의 차이점은 무엇인가요? 이 기사에서는 typeof와 instanceof 연산자의 차이점을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

JavaScript의 유형 확인: typeof와 instanceof 연산자의 차이점

관련 추천: "javascript 비디오 튜토리얼"

똑똑한 사람들은 JS가 약한 유형의 언어이며 변수 유형에 제한이 없다는 것을 알아야 합니다.

예를 들어, 문자열 유형을 사용하여 변수를 생성하면 나중에 동일한 변수에 숫자를 할당할 수 있습니다.

let message = 'Hello'; // 分配一个字符串

message = 14; // 分配一个数字

이 역학은 유연성을 제공하고 변수 선언을 단순화합니다.

단점은 변수에 특정 유형의 값이 포함되어 있는지 결코 확인할 수 없다는 것입니다. 예를 들어 다음 함수 greet(who)에는 문자열 매개변수가 필요하지만 어떤 유형의 매개변수로도 함수를 호출할 수 있습니다. greet(who)需要一个字符串参数,但是,我们可以使用任何类型的参数来调用该函数:

function greet(who) {
  return `Hello, ${who}!`
}

greet('World'); // => 'Hello, World!'
// You can use any type as argument
greet(true);    // => 'Hello, true!'
greet([1]);     // => 'Hello, 1!'

有时我们需要在 JS 中检查变量的类型,要怎么做?

使用typeof运算符以及instanceof来检查实例类型。

1.<span style="font-size: 18px;">typeof</span>运算符

在 JS 中,基本类型有 StringNumberBooleanSymbol 等。此外,还有函数、对象和特殊值undefinednull

typeof是用于确定 expression 类型的运算符:

const typeAsString = typeof expression;

expression 的计算结果是我们要查找的类型的值。 expression 可以是变量myVariable,属性访问器myObject.myProp,函数调用myFunction()或数字 14

typeof expression,取决于expression的值,结果可能为:'string''number''boolean''symbol''undefined''object''function'

我们来看看typeof运算符每种类型的情况:

A) String:

const message = 'hello!';
typeof message; // => 'string'

B) Number:

const number = 5;
typeof number; // => 'number'

typeof NaN;    // => 'number'

C) Boolean:

const ok = true;
typeof ok; // => 'boolean'

D) Symbol:

const symbol = Symbol('key');
typeof symbol; // => 'symbol'

E) undefined:

const nothing = undefined;
typeof nothing; // => 'undefined'

F) Objects:

const object = { name: 'Batman' };
typeof object; // => 'object'

const array = [1, 4, 5];
typeof array; // => 'object'

const regExp = /Hi/;
typeof regExp; // => 'object'

G) Functions:

function greet(who) {
  return `Hello, ${who}!`
}

typeof greet; // => 'function'

1.1 typeof null

如上我们看到的,用 typeof 判断对象结果是 'object'

但是,typeof null也会计算为'object'

const missingObject = null;
typeof missingObject; // => 'object'

typeof null'object'是 JS 初始实现中的一个错误。

因此,在使用typeof检测对象时,需要另外检查null

function isObject(object) {
  return typeof object === 'object' && object !== null;
}

isObject({ name: 'Batman' }); // => true
isObject(15);                 // => false
isObject(null);               // => false

1.2 typeof 和未定义的变量

虽然typeof expression通常决定于expression的类型,但也可以使用typeof来确定是否定义了变量。

// notDefinedVar is not defined
notDefinedVar; // throws ReferenceError

typeof有一个不错的属性,当typeof评估未定义变量的类型时,不会引发 ReferenceError 错误:

// notDefinedVar is not defined
typeof notDefinedVar; // => 'undefined'

变量notDefinedVar没有在当前作用域内定义。然而,typeof  notDefinedVar不会抛出引用错误,而是将结果计算为 'undefined'

我们可以使用typeof来检测是否未定义变量,如果typeof myVar === 'undefined'true, 则 myVar 未定义。

2. instanceof 运算符

使用 JS 函数的通常方法是通过在其名称后添加一对括号来调用它:

function greet(who) {
  return `Hello, ${who}!`;
}

greet('World'); // => 'Hello, World!'

greet('World')是常规函数调用。

JS 函数可以做更多的事情:它们甚至可以构造对象! 要使函数构造对象,只需在常规函数调用之前使用new关键字:

function Greeter(who) {
  this.message = `Hello, ${who}!`;
}

const worldGreeter = new Greeter('World');
worldGreeter.message; // => 'Hello, World!'

new Greeter('World')是创建实例worldGreeter的构造函数调用。

如何检查 JS 是否使用特定构造函数创建了特定实例? 使用 instanceof 运算符:

const bool = object instanceof Constructor;

其中object是对对象求值的表达式,而Constructor是构造对象的类或函数,instanceof计算为布尔值。

worldGreeter实例是使用Greeter构造函数创建的,因此worldGreeter instanceof Greeter计算结果为true

从ES6 开始,可以使用 class 来定义对象。例如,定义一个类Pet,然后创建它的一个实例myPet

class Pet {
  constructor(name) {
    this.name = name;
  }
}

const myPet = new Pet('Lily');
JS에서 변수 유형을 확인해야 하는 경우가 있습니다. , 어떻게 해야 할까요? 🎜🎜인스턴스 유형을 확인하려면 typeof 연산자와 instanceof를 사용하세요. 🎜🎜1.<span style="font-size: 18px;">유형</span>연산자🎜🎜JS에서 기본 유형은 String, Number, Boolean 및 Symbol 등 또한 함수, 개체, 특수 값 ​​undefinenull이 있습니다. 🎜🎜typeofexpression의 유형을 결정하는 데 사용되는 연산자입니다. 🎜
myPet instanceof Pet; // => true
🎜expression은 우리가 찾고 있는 유형의 값으로 평가됩니다. . 표현식은 변수 myVariable, 속성 접근자 myObject.myProp, 함수 호출 myFunction() 또는 번호 >14. 🎜🎜표현식 유형, 표현식 값에 따라 결과는 다음과 같습니다: 'string', 'number' 코드> , <code>'부울', '기호', '정의되지 않음', '객체', '함수'. 🎜🎜 typeof 연산자의 각 유형을 살펴보겠습니다. 🎜🎜A) 문자열:🎜
const plainPet = { name: 'Zoe' };
plainPet instanceof Pet; // => false
🎜B) 숫자:🎜
function isRegExp(value) {
  return value instanceof RegExp;
}
isRegExp(/Hello/); // => true
isRegExp('Hello'); // => false

function isArray(value) {
  return value instanceof Array;
}
isArray([1, 2, 3]); // => true
isArray({ prop: 'Val' }); // => false
🎜C) 부울:🎜
class Cat extends Pet {
  constructor(name, color) {
    super(name);
    this.color = color;
  }
}

const myCat = new Cat('Callie', 'red');
🎜D) 기호:🎜
myCat instanceof Pet; // => true
🎜E) 정의되지 않음:🎜
myCat instanceof Pet; // => true
🎜F) 객체:🎜rrreee🎜G) 함수:🎜rrreee🎜1.1 typeof null🎜🎜 위에서 본 것처럼 typeof를 사용하세요. 객체를 판단하는 방법은 '객체'입니다. 🎜🎜그러나 typeof null'object'로 계산됩니다! 🎜rrreee🎜typeof null'object'인 것은 JS 초기 구현의 버그였습니다. 🎜🎜따라서 typeof를 사용하여 개체를 감지하는 경우 null을 추가로 확인해야 합니다. 🎜rrreee🎜1.2 typeof 및 정의되지 않은 변수🎜🎜 typeof 표현식은 일반적으로 표현식의 유형에 따라 결정되지만 typeof는 변수 정의 여부를 결정하는 데 사용될 수도 있습니다. 🎜rrreee🎜typeof에는 typeof가 정의되지 않은 변수의 유형을 평가할 때 ReferenceError 오류가 발생하지 않는 멋진 속성이 있습니다. 🎜rrreee🎜 notDefinedVar 변수가 현재 범위에 정의되어 있지 않습니다. 그러나 typeof notDefinedVar는 참조 오류를 발생시키지 않고 대신 'undefined'로 평가됩니다. 🎜🎜 typeof를 사용하여 변수가 정의되지 않았는지 여부를 감지할 수 있습니다. typeof myVar === 'undefine'true인 경우 myVar가 정의되지 않았습니다. 🎜🎜2. instanceof 연산자🎜🎜 JS 함수를 사용하는 일반적인 방법은 이름 뒤에 괄호 쌍을 추가하는 것입니다. . 호출: 🎜rrreee🎜greet('World')는 일반 함수 호출입니다. 🎜🎜JS 함수는 훨씬 더 많은 일을 할 수 있습니다. 객체를 생성할 수도 있습니다! 함수가 객체를 생성하도록 하려면 일반 함수 호출 전에 new 키워드를 사용하면 됩니다. 🎜rrreee🎜new Greeter('World')는 worldGreeter의 생성자 호출. 🎜🎜JS가 특정 생성자를 사용하여 특정 인스턴스를 생성했는지 확인하는 방법은 무엇입니까? instanceof 연산자를 사용하세요. 🎜rrreee🎜여기서 object는 객체를 평가하는 표현식이고 Constructor는 객체를 구성하는 클래스 또는 함수입니다. , instanceof는 부울 값으로 평가됩니다. 🎜🎜worldGreeter 인스턴스는 Greeter 생성자를 사용하여 생성되므로 Greeter의 이 worldGreeter 인스턴스true로 평가됩니다. 🎜🎜ES6부터는 class를 사용하여 객체를 정의할 수 있습니다. 예를 들어 Pet 클래스를 정의한 다음 myPet의 인스턴스를 만듭니다.🎜
class Pet {
  constructor(name) {
    this.name = name;
  }
}

const myPet = new Pet('Lily');

new Pet('Lily')是创建实例myPet的构造调用。

由于myPet是使用Pet类构造的-const myPet = new Pet('Lily'), 所以 myPet instanceof Pet 的结果为 true

myPet instanceof Pet; // => true

但是,普通对象不是Pet的实例:

const plainPet = { name: 'Zoe' };
plainPet instanceof Pet; // => false

我们发现instanceof对于确定内置的特殊实例(如正则表达式、数组)很有用:

function isRegExp(value) {
  return value instanceof RegExp;
}
isRegExp(/Hello/); // => true
isRegExp('Hello'); // => false

function isArray(value) {
  return value instanceof Array;
}
isArray([1, 2, 3]); // => true
isArray({ prop: 'Val' }); // => false

2.1 instanceof 和父类

现在,Cat 扩展了父类Pet

class Cat extends Pet {
  constructor(name, color) {
    super(name);
    this.color = color;
  }
}

const myCat = new Cat('Callie', 'red');

不出所料,myCatCat类的实例:

myCat instanceof Pet; // => true

但同时,myCat也是基类Pet的一个实例:

myCat instanceof Pet; // => true

3. 总结

JS 是一种弱类型的语言,这意味着对变量的类型没有限制。

typeof expression可以用来查看 expression 的类型,结果是可能是其中的一个:'string''number''boolean', 'symbol''undefined''object''function'

typeof null的值为'object',因此使用typeof检测对象的正确方法是typeof object ==='object'&& object!== null

instanceof运算符让我们确定实例的构造函数。 如果objectConstructor的实例,则object instanceof Constructortrue

原文地址:https://dmitripavlutin.com/javascript-typeof-instanceof/

作者:Dmitri Pavlutin

译文地址:https://segmentfault.com/a/1190000038312457

更多编程相关知识,请访问:编程课程!!

위 내용은 JavaScript의 유형 확인: typeof와 instanceof 연산자의 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제