JS 面试01

 

 

 

JS中基本数据类型

Number,String,Boolean,null,undefined,symbol,bigint(后两个为ES6新增)

应用数据类型

object,function(__proto__ Function.prototype)                         

object:普通对象,数组对象,正则对象,日期对象,Math数学函数对象。

 

 

JS中this五种情况的综合梳理
this的指向,是在函数被调用的时候确定的。而不是函数声明的时候确定的。而确定this的指向难就难在函数被调用的方式是多种多样的,所以我们就需要从函数执行的各种方式分别去分析this的指向。

1. this与普通函数执行(默认绑定)

默认绑定:函数体如果在非严格模式下,this绑定到window,严格模式下绑定到undefined

2. this与对象中的方法执行(隐式绑定)

3.this与call,apply,bind(显示绑定)

显示绑定规则:this指向第一个参数。

4. this与构造函数调用(new 绑定)

使用new来调用函数,或者说发生构造函数调用时,会自动执行下面的操作:

  1. 创建(或者说构造)一个全新的对象
  2. 这个新对象会被执行[[原型]]链接。
  3. 这个新对象会绑定到函数调用的this.
  4. 如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象。

5.this与箭头函数

5.1箭头函数中的this指向包裹它的第一个普通函数中的this

 

call、apply和bind方法的用法以及区别

call、apply、bind的作用是改变函数运行时this的指向

call

call 方法第一个参数是要绑定给this的值,后面传入的是一个参数列表。当第一个参数为null、undefined的时候,默认指向window。

apply

apply接受两个参数,第一个参数是要绑定给this的值,第二个参数是一个参数数组。当第一个参数为null、undefined的时候,默认指向window。

 唯一的差别在于:当函数需要传递多个变量时, apply 可以接受一个数组作为参数输入, call 则是接受一系列的单独变量。

bind

和call很相似,第一个参数是this的指向,从第二个参数开始是接收的参数列表。区别在于bind方法返回值是函数以及bind接收的参数列表的使用。

  • bind返回值是函数
  • bind 方法不会立即执行,而是返回一个改变了上下文 this 后的函数。而原函数 printName 中的 this 并没有被改变,依旧指向全局对象 window。      

call、apply和bind函数存在的区别:

bind返回对应函数, 便于稍后调用; apply, call则是立即调用。

除此外, 在 ES6 的箭头函数下, call 和 apply 将失效, 对于箭头函数来说:

  • 箭头函数体内的 this 对象, 就是定义时所在的对象, 而不是使用时所在的对象;所以不需要类似于var _this = this这种丑陋的写法
  • 箭头函数不可以当作构造函数,也就是说不可以使用 new 命令, 否则会抛出一个错误
  • 箭头函数不可以使用 arguments 对象,,该对象在函数体内不存在. 如果要用, 可以用 Rest 参数代替

检测数据类型的方法:

1. typeof

typeof 是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型。
返回的结果用该类型的字符串(全小写字母)形式表示
包括以下 7 种:number、boolean、symbol、string、object、undefined、function 等

2、instanceof

instanceof 是用来判断 A 是否为 B 的实例,表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false。
在这里需要特别注意的是:instanceof 检测的是原型

instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。

3、constructor

当一个函数 F被定义时,JS引擎会为F添加 prototype 原型,然后再在 prototype上添加一个 constructor 属性,并让其指向 F 的引用。

  1. null 和 undefined 是无效的对象,因此是不会有 constructor 存在的,这两种类型的数据需要通过其他方式来判断

    函数的 constructor 是不稳定的,这个主要体现在自定义对象上,当开发者重写 prototype 后,原有的 constructor 引用会丢失,constructor 会默认为 Object

4、Object.prototype.toString

toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。

对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。

 

 

posted @ 2021-04-14 22:34  kyrie_226  阅读(48)  评论(0)    收藏  举报