JavaScript 前端面试 3(等于、全等、instanceof、typeof 、原型、原型链)
五、==和===的区别,分别在什么时候使用?
==等于操作符,===全等操作符
1:等于操作符
如果操作数相等 == 返回true
JavaScript存在隐式转换,==会先进行类型转换,再确定操作数是否相等,如果有一个是bool值,就把它转换成数值在进行比较,字符串也是一样,如果一个操作数是对象,另一个操作数不是对象,使用valueof()获得其原始值再比较。
注:null和undefined相等,如果有一个操作数是NaN返回false
如果两个操作数都是对象但是比较的不是同一个对象,但是它们指向同一个对象,则结果仍然返回true
2.全等操作符
===要求再不转换的前提下相等才返回true,类型、值都要相同
undefined和null自身严格相等
六:typeof 和 instanceof的区别
1:typeof
typeof返回一个字符串,表示未经计算的操作数类型
使用方法:tpyeof(operand)//也可以不用括号
tpyeof(null)是object但是这是一个bug ,null不是对象也不是引用数据类型,如果要在if条件中判断null直接用===null就可以,引用类型的数据除了function会被识别其他都是object。如果想要判断一个变量是否存在不能使用if(a)如果没有声明会报错,可以使用:
2:instanceof
用于检测构造函数prototype属性是否出现在某个实例对象的原型链上
原理就是顺着原型链一直找,知道找到原型对象否则返回false
七:什么是原型、原型链?
1:原型
JavaScript常被描述为基于原型的语言
每一个对象都拥有一个原型对象
试图访问一个对象的属性的时候 不仅仅会访问该对象还会搜索该对象的原型
属性和方法都在构造器的protype属性上
举个例子:
函数可以有属性。每个函数都要一个特殊的属性protype(原型)
原型对象有一个自有属性constructor,这个属性指向该函数
2:原型链(prototype chain)
原型对象也可以有原型,这样一层层以此类推就形成了原型链
它解释了为什么一个对象会拥有定义在其他对象的属性和方法
对象实例在它的构造器之间建立了一个链接(_proto_属性,是从构造函数的prototype属性派生的)
原型链分析
-
构造函数
Person
存在原型对象Person.prototype
-
每个构造函数都有一个
prototype
属性,指向其原型对象。
-
-
构造函数生成实例对象
person
,person
的__proto__
指向构造函数Person
原型对象-
当我们通过
new Person()
创建一个实例对象person
时,person
的__proto__
会指向Person.prototype
。
-
-
Person.prototype.__proto__
指向内置对象,因为Person.prototype
是个对象,默认是由Object
函数作为类创建的,而Object.prototype
为内置对象-
Person.prototype
是一个对象,其__proto__
指向Object.prototype
,因为所有对象默认继承自Object.prototype
。
-
-
Person.__proto__
指向内置匿名函数anonymous
,因为Person
是个函数对象,默认由Function
作为类创建-
Person
是一个函数对象,其__proto__
指向Function.prototype
,即内置的匿名函数anonymous
。
-
-
Function.prototype
和Function.__proto__
同时指向内置匿名函数anonymous
,这样原型链的终点就是null
-
Function.prototype
和Function.__proto__
都指向同一个内置匿名函数anonymous
,而anonymous
的__proto__
是null
,表示原型链的终点。
-
总结
-
构造函数
Person
的原型对象Person.prototype
的__proto__
指向Object.prototype
。 -
实例对象
person
的__proto__
指向Person.prototype
。 -
函数对象
Person
的__proto__
指向Function.prototype
。 -
Function.prototype
和Function.__proto__
都指向内置匿名函数anonymous
,其__proto__
为null
,表示原型链的终点。
-
一切对象都是继承自
Object
对象,Object
对象直接继承根源对象null
-
一切的函数对象(包括
Object
对象),都是继承自Function
对象 -
Object
对象直接继承自Function
对象 -
Function
对象的__proto__
会指向自己的原型对象,最终还是继承自Object
对象