JavaScript面试题重难点总结


1. 介绍一下类型转换

当遇到加法运算时:

  1. 任何内容与字符串相连接,另一端都会转化成字符串
  2. 除字符串以外的任何内容,与数值相加,都将优先转化成数值来运算
  3. 当使用数值和引用类型相加时,引用类型自动转化成字符串

当遇到减法运算时:

  1. 不论遇到什么数值类型,两端都会隐式转化为数值进行运算
  2. 引用类型在隐式转换数值时,都会转换为NaN
  3. 但是数组是一个特殊的引用类型,当隐式转换时,优先转换成字符串,然后再转换成数值

知道数组的特殊性,数组在任何运算中都优先转化为字符串,再转化成对应的类型。

但是对象不是,对象在相加运算时先转化为字符串,非相加(减法)运算时转化为数值。

2. 什么是函数柯里化?

柯里化(currying)又称部分求值。一个柯里化的函数首先会接收一些参数,接收了这些参数后,该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保存起来。待到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值。

柯里化函数的作用:如果方法中固定了某些参数,你可以得到接收余下参数的一个函数。

也就是说,柯里化函数调用后,得到的是一个函数。柯里化可以帮助我们把相同的参数固定下来,把任意的多参函数通过固定参数的方式,变为单参函数,这样就不用每次调用函数的时候都去反复传递这些一样的参数了。

function curry(company, department) {
    
     //接收固定的公司、部门
  return function (name, age) {
    
    
    console.log(`我是 ${
      
      company} ${
      
      department} 部门的 ${
      
      name}${
      
      age}`);
  }
}
let print = curry('ali', 'F77'); // 传递固定的公司、部门
 
print('zhangsan', 20);//调用 return 出来的函数并传变化的参数
print('lisi', 30)

3. 浏览器有哪些兼容问题

浏览器有哪些兼容问题

4. 简述 commonJS、AMD 和 CMD

简述 commonJS、AMD 和 CMD

5. 构造函数、实例对象、原型对象三者的关系是什么?

在这里插入图片描述

每创建一个函数,该函数都会自动带有一个prototype属性。该属性是一个指针,指向一个对象,该对象称之为原型对象(后期我们可以使用这个原型对象帮助我们在js中实现继承)
原型对象上默认有一个属性constructor,该属性也是一个指针,指向其相关联的构造函数。通过调用构造函数产生的实例对象,都拥有一个内部属性,指向了原型对象。其实例对象能够访问原型对象上的所有属性和方法。

总结:三者的关系是,每个构造函数都有一个原型对象,原型对象上包含着一个指向构造函数的指针,而实例都包含着一个指向原型对象的内部指针。通俗的说,实例可以通过内部指针访问到原型对象,原型对象可以通过constructor找到构造函数。

6. ja同源策略?cors跨域方案?

同源策略(Sameoriginpolicy),是一种约定,它是浏览器最核心也最基本的安全功能

所谓同源(即指在同一个域)具有以下三个相同点

  • 协议相同(protocol)
  • 主机相同(host)
  • 端口相同(port)

反之非同源请求,也就是协议、端口、主机其中一项不相同的时候,这时候就会产生跨域

ja同源策略?cors跨域方案

项目中用到的cors方案:

在封装的axios中使用请求拦截器,在请求头中加入请求的地址,这时候由于浏览器的同源策略会出现跨域访问,这时候就通过在服务端引入cors包,来解决跨域问题。

7. 介绍下事件代理,主要解决什么问题

介绍下事件代理,主要解决什么问题

8. new 的原理是什么?通过 new 的方式创建对象和通过字面量创建有什么区别?

new关键字进行了如下的操作(为了便于描述,obj用来表示创建的空对象、用constrc来表示构造函数):

  1. 创建一个空对象obj({});

  2. 将obj的[[prototype]]属性指向构造函数constrc的原型(即obj.[[prototype]] = constrc.prototype)。

  3. 将构造函数constrc内部的this绑定到新建的对象obj,执行constrc(也就是跟调用普通函数一样,只是此时函数的this为新创建的对象obj而已,就好像执行obj.constrc()一样);

  4. 若构造函数没有返回非原始值(即不是引用类型的值),则返回该新建的对象obj(默认会添加return this)。否则,返回引用类型的值。

这里补充说明一下:[[prototype]]属性是隐藏的,不过目前大部分新浏览器实现方式是使用__proto__来表示。构造函数的prototype属性我们是可以显式访问的。

区别:

字面量创建不会调用 Object构造函数, 简洁且性能更好;

9. 数组去重的方法

数组去重的方法

猜你喜欢

转载自blog.csdn.net/weixin_45605541/article/details/127605725