1 typeof
操作符返回一个字符串,表示未经计算的操作数的类型。
返回结果有:"number"、"string"、"boolean"、"object"、"function" 、 "undefined" 、"symbol"
官方提供如下:![](https://img-blog.csdnimg.cn/c674892974224a869e908ad54a4b3f84.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAc28gZGUgc2kgbmVp,size_20,color_FFFFFF,t_70,g_se,x_16)
console.log(typeof 1) // 'number'
console.log(typeof '1') // 'string'
console.log(typeof undefined) // 'undefined'
console.log(typeof true) // 'boolean'
console.log(typeof Symbol()) // 'symbol'
console.log(typeof null) // 'object'
console.log(typeof []) // 'object'
console.log(typeof {}) // 'object'
console.log(typeof console) // 'object'
console.log(typeof console.log) // 'function'
注:
1. 如果我们想要判断一个变量是否存在,可以使用typeof
:(不能使用if(a)
, 若a
未声明,则报错)
if(typeof a != 'undefined'){
//变量存在
}
2. typeof null
为object
,只是JavaScript
存在的一个悠久 Bug
,不代表null
就是引用数据类型,并且null
本身也不是对象。由于 null
代表的是空指针(大多数平台下值为 0x00),因此,null 的类型标签是 0,typeof null
也因此返回 "object"
。
3. 除 Function 外的所有构造函数的类型都是 'object'
var str = new String('String');
var num = new Number(100);
typeof str; // 返回 'object'
typeof num; // 返回 'object'
var func = new Function();
typeof func; // 返回 'function'
4. 在 ECMAScript 2015 之前,typeof
总能保证对任何所给的操作数返回一个字符串。即便是没有声明的标识符,typeof
也能返回 'undefined'
。使用 typeof
永远不会抛出错误。
但在加入了块级作用域的 let 和 const 之后,在其被声明之前对块中的 let
和 const
变量使用 typeof
会抛出一个 ReferenceError。块作用域变量在块的头部处于“暂存死区”,直至其被初始化,在这期间,访问变量将会引发错误。
typeof undeclaredVariable === 'undefined';
typeof newLetVariable; // ReferenceError
typeof newConstVariable; // ReferenceError
typeof newClass; // ReferenceError
let newLetVariable;
const newConstVariable = 'hello';
class newClass{};
2 instanceof
用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上
var arr = [1, 2, 3]
//console.log(arr)
var date = new Date()
//console.log('typeof----', typeof arr) //object
//console.log('typeof----', typeof date) //object
console.log(arr instanceof Array) //true
console.log(arr instanceof Object) //true
console.log(Array instanceof Object) //true //数组是对象中的一种
//自定义一个方法检测
function myInstanceof(child, parent) {
let left = child.__proto__
let right = parent.prototype
while (true) {
if (left === null) {
return false
}
if (left === right) {
return true
}
//如果一次没找到,顺着原型链向上继续找
left = left.__proto__
}
}
var arr1 = [2, 3, 4]
console.log('是否???', myInstanceof(arr, Object)) //true
console.log('是否???', myInstanceof(arr, Array)) //true
console.log('是否???', myInstanceof(arr, Date)) //false
3 Symbol.hasInstance
用于判断某对象是否为某构造器的实例。因此你可以用它自定义 instanceof 操作符在某个类上的行为。
class Array1 {
static [Symbol.hasInstance](instance) {
return Array.isArray(instance);
}
}
console.log([] instanceof Array1); // true
简单的说,就是当其他对象使用 instanceof 运算符,判断是否为该对象的实例时,会调用这个方法。
// 证明x确实是MyClass的实例
class MyClass {}
var x = new MyClass()
console.log(x instanceof MyClass); // true
console.log(MyClass[Symbol.hasInstance](x));//true