javaScript:
1、什么叫实例?
//实例:实例对象
function Persion (name,age){//构造函数,是引用类型
this.name = name;
this.age = age;
}
var p = new Persion('liu','18');
//p是根据类型创建的实例对象,即用new创建的对象
2、undefined 和null的区别?
*undefined 代表定义未赋值
*null 定义并赋值了,只是值为null
var a;
console.log(a);//undefined
a = null;
console.log(a);//null
3、什么时候使用null?
初始赋值为null,表明将要赋值为对象;
结束前赋值为null,对象未被调用,可以让对象成为垃圾对象。
var obj = null;//初始赋值为null,表明将要赋值为对象
obj = ['a',12];//确定对象就赋值
obj = null;//最后,未被调用的对象可以让obj指向的对象成为垃圾对象(被垃圾回收器回收)为了释放数组对象所占的内存空间
4、严格区分变量类型和数据类型?
a、数据类型:分为基本类型和对象类型;
b、变量类型:(变量内存值的类型)
分为基本类型:保存就是基本类型的数据;
引用类型:保存的是地址值。
5、typeof、instanceof、===的使用?
a typeof :可以判断undefined/数值/字符串/布尔值/function/symbol,不能判断b null与object,object与array;
instanceof :判断对象的具体类型(object,function,array);
=== :可以判断undefined,nulll。
6、数据类型?
number、string、boolean、null、undefined、object,
新增symbol:(无字面量、符号唯一、符号可作对象属性存在)
ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型.
Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
Symbol函数前不能使用new命令,否则会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。也就是说,由于 Symbol 值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。
参考:https://blog.csdn.net/qq_33408245/article/details/82953143
7、==、===的区别?
之前写过的https://blog.csdn.net/weixin_44019720/article/details/108966811
8、作用域及作用域链、闭包?
https://blog.csdn.net/weixin_44019720/article/details/108968096
9、this的四种绑定方法
函数中的this总指向调用它的对象。参考:https://www.jb51.net/article/121164.htm
(1) this的默认绑定:window对象
当一个函数没有明确的调用对象的时候,也就是单纯作为独立函数调用的时候,将对函数的this使用默认绑定:绑定到全局的window对象。
function fire () {
console.log(this === window)
}
fire(); // 输出true
(2)this的隐式绑定
当函数被一个对象“包含”的时候,我们称函数的this被隐式绑定到这个对象里面了,这时候,通过this可以直接访问所绑定的对象里面的其他属性。
var obj = {
a: 1,
fire: function () {
console.log(this.a)
}
}
obj.fire(); // 输出1
在隐式绑定中,如果函数调用位置是在一串对象属性链中,this绑定的是最内层的对象。
var obj = {
a: 1,
obj2: {
a: 2,
obj3: {
a:3,
getA: function () {
console.log(this.a)
}
}
}
}
obj.obj2.obj3.getA(); // 输出3
(3) this的显式绑定:(call和bind方法)
a、call的基本使用方式: fn.call(object)
fn是你调用的函数,object参数是你希望函数的this所绑定的对象。
fn.call(object)的作用:
1.即刻调用这个函数(fn);
2.调用这个函数的时候函数的this指向object对象 。
var obj = {
a: 1, // a是定义在对象obj中的属性
fire: function () {
console.log(this.a)
}
}
var a = 2; // a是定义在全局环境中的变量
var fn = obj.fire;
var fireInGrobal = function () {
fn.call(obj) //硬绑定
}
fireInGrobal(); // 输出1
b、如果使用bind的话会更加简单。
var fireInGrobal = function () {
fn.call(obj) //硬绑定
}
可以简化为
var fireInGrobal = fn.bind(obj);
call和bind的区别是:在绑定this到对象参数的同时:
1.call将立即执行该函数。
2.bind不执行函数,只返回一个可供执行的函数 。
因为this的缘故:
在隐式绑定下:函数和只是暂时住在“包含对象“的旅馆里面,可能过几天就又到另一家旅馆住了。
在显式绑定下:函数将取得在“包含对象“里的永久居住权,一直都会”住在这里“。
(4)new绑定:执行new操作的时候,将创建一个新的对象,并且将构造函数的this指向所创建的新对象
function foo (a) {
this.a = a;
}
var a1 = new foo (1);
var a2 = new foo (2);
var a3 = new foo (3);
var a4 = new foo (4);
console.log(a1.a); // 输出1
console.log(a2.a); // 输出2
console.log(a3.a); // 输出3
console.log(a4.a); // 输出4
10、new的作用
(1) 创建一个空对象;
(2) 让this指向这个新的对象;
(3) 执行构造函数里的方法,给这个新对象加属性和方法;
(4) new会返回该对象。
11、数组的Map方法
map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。
注意: map() 不会对空数组进行检测。
注意: map() 不会改变原始数组。
12、事件的循环
一个异步过程通常是这样的:主线程发起一个异步请求,异步任务接收请求并告知主线程已收到(异步函数返回);主线程可以继续执行后面的代码,同时异步操作开始执行;执行完成后通知主线程;主线程收到通知后,执行一定的动作(调用回调函数)。
因此,一个异步过程包括两个要素:注册函数和回调函数,其中注册函数用来发起异步过程,回调函数用来处理结果。
参考:https://www.cnblogs.com/xiaohuochai/p/8527618.html
13、
函数执行顺序: ①var x; //变量声明提前
②var foo; //变量声明提前
③x=foo(); //给x赋值,会报错,因为foo变量目前是undefined,不是函数类型 ④foo=function foo() {return “foobar”;}; //给foo赋值 foo变量“被提前”了,但是他的赋值(也就是函数)并没有被提前,从这一点上来说,和前面我们所讲的变量“被提前”是完全一致的,并且,由于“被提前”的变量的默认值是 undefined。 函数声明可以被提前,但函数表达式不能被提前。
更改代码后,给foo赋值后变成函数,结果就是调用函数。