文章目录
1. 介绍一下类型转换
当遇到加法运算时:
- 任何内容与字符串相连接,另一端都会转化成字符串
- 除字符串以外的任何内容,与数值相加,都将优先转化成数值来运算
- 当使用数值和引用类型相加时,引用类型自动转化成字符串
当遇到减法运算时:
- 不论遇到什么数值类型,两端都会隐式转化为数值进行运算
- 引用类型在隐式转换数值时,都会转换为NaN
- 但是数组是一个特殊的引用类型,当隐式转换时,优先转换成字符串,然后再转换成数值
知道数组的特殊性,数组在任何运算中都优先转化为字符串,再转化成对应的类型。
但是对象不是,对象在相加运算时先转化为字符串,非相加(减法)运算时转化为数值。
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
5. 构造函数、实例对象、原型对象三者的关系是什么?
每创建一个函数,该函数都会自动带有一个prototype属性。该属性是一个指针,指向一个对象,该对象称之为原型对象(后期我们可以使用这个原型对象帮助我们在js中实现继承)
原型对象上默认有一个属性constructor,该属性也是一个指针,指向其相关联的构造函数。通过调用构造函数产生的实例对象,都拥有一个内部属性,指向了原型对象。其实例对象能够访问原型对象上的所有属性和方法。
总结:三者的关系是,每个构造函数都有一个原型对象,原型对象上包含着一个指向构造函数的指针,而实例都包含着一个指向原型对象的内部指针。通俗的说,实例可以通过内部指针访问到原型对象,原型对象可以通过constructor找到构造函数。
6. ja同源策略?cors跨域方案?
同源策略(Sameoriginpolicy),是一种约定,它是浏览器最核心也最基本的安全功能
所谓同源(即指在同一个域)具有以下三个相同点
- 协议相同(protocol)
- 主机相同(host)
- 端口相同(port)
反之非同源请求,也就是协议、端口、主机其中一项不相同的时候,这时候就会产生跨域
项目中用到的cors方案:
在封装的axios中使用请求拦截器,在请求头中加入请求的地址,这时候由于浏览器的同源策略会出现跨域访问,这时候就通过在服务端引入cors包,来解决跨域问题。
7. 介绍下事件代理,主要解决什么问题
8. new 的原理是什么?通过 new 的方式创建对象和通过字面量创建有什么区别?
new关键字进行了如下的操作(为了便于描述,obj用来表示创建的空对象、用constrc来表示构造函数):
-
创建一个空对象obj({});
-
将obj的[[prototype]]属性指向构造函数constrc的原型(即obj.[[prototype]] = constrc.prototype)。
-
将构造函数constrc内部的this绑定到新建的对象obj,执行constrc(也就是跟调用普通函数一样,只是此时函数的this为新创建的对象obj而已,就好像执行obj.constrc()一样);
-
若构造函数没有返回非原始值(即不是引用类型的值),则返回该新建的对象obj(默认会添加return this)。否则,返回引用类型的值。
这里补充说明一下:[[prototype]]属性是隐藏的,不过目前大部分新浏览器实现方式是使用__proto__来表示。构造函数的prototype属性我们是可以显式访问的。
区别:
字面量创建不会调用 Object构造函数, 简洁且性能更好;