复习: JavaScript常见面试题系列一
1.js数据类型?
- String Number Boolean Undefined Null Symbol(ES6)(基本数据类型5种)
- Object(复杂数据类型1种)
2.Symbol的作用?
-
创建:通过symbol()创建
-
参数:用于描述该类型,可省略
-
应用场景:作为对象的属性名使用
- 作用1:把一些不需要对外操作和访问的属性使用Symbol来定义,因为Symbol类型的key是不能通过Object.keys()或者for … in来枚举的
- 赋值、取值使用 []
- 获取对象Symbol属性的值也可使用Object.getOwnPropertySymbol(obj)
-
作用2:使用Symbol来代替常量
2.判断变量的类型
- typeof
- 返回 String Number Boolean Undefined Null Symbol Object + function
- 主要用于判断基本数据类型
- 为何返回值中有function?
- 答:function本质上也是一个对象,但是function对象与普通对象相比,其内部有一个[[Call]]方法,用来表示这个对象是可调用的,typeof操作符在判断Object时,如果内部实现了[[Call]]方法,就返回function
- instanceof及原理
- 用于判断复杂数据类型、判断继承
- 内部机制通过原型链来实现的
判断继承
function Foo() {
this.name = 'xf'
this.age = '22'
}
function GFoo() {
this.country = 'China'
}
Foo.prototype = new GFoo()
let foo = new Foo()
console.log(foo instanceof Foo) // true
console.log(foo instanceof GFoo) // true
手写instanceof
实现原理:构造函数的原型对象是否在实例的原型链上
// 手写instanceof
function instance_of(L, R) {//L 代表实例 R 代表要判断的复杂类型
let O = R.prototype
L = L.__proto__
while(true){
if (L == null) return false
if (L == O) return true
L = L.__proto__
}
}