事件冒泡和事件捕获到底有何区别?
事件冒泡:一个由里到外,冒泡,向上层延申。
事件捕获:一个由外到里,前往捕获,形成向下趋势。
什么是typescript
TypeScript是JavaScript类型的超类,它可以编译成纯JavaScript。TypeScript可以在任何浏览器、任何计算机和任何操作系统上运行,并且是开源的。
- TypeScript是Microsoft推出的开源语言,使用Apache授权协议
- TypeScript增加了静态类型、类、模块、接口和类型注解
- TypeScript可用于开发大型的应用
- TypeScript易学易于理解
什么是模块化编程?
模块化程序设计是指在进行程序设计时将一个大程序按照功能划分为若干小程序模块,每个小程序模块完成一个确定的功能,并在这些模块之间建立必要的联系,通过模块的互相协作完成整个功能的程序设计方法
简述javascript原型、原型链?有什么特点
原型是构造函数一个属性 是一个对象 是在我们创建构造函数的时候 系统自动分配的,可以通过构造函数.prototype 得到
原型链是多个对象之间的一种关系,通过__proto__链接在一起的关系
JavaScript 对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型是,与之相关的对象也会继承这一改变。当我们需要一个属性时,JavaScript 引擎会先看当前对象中是否有这个属性,如果没有的话,就会查找它的 prototype 对象是否有这个属性,如此递推下去,一直检索到有 object 内建对象。
解释javascript中的作用域和变量声明提升
作用域是指声明的变量可以使用的范围,在函数内声明的变量为局部变量,只能在函数内部使用,在函数外声明的变量为全局变量,可以在全局任意位置调用.
变量声明提升是指声明了一个变量 但是在声明之前使用了这个变量 代码自上而下执行时会把变量声明提前但赋值不会提前 所以提前使用不会报错只会显示为undefined
谈谈this对象的理解,call()和apply()的区别
this是会指向使用this的对象的本身,
call()和apply()都能够编写用于不同对象的方法.
call和apply实际上功能一样 只是传入的参数列表形式不同.apply只能有两个参数 新的this指向和一个数组 数据都写入数组里
call可以接受多个参数,但是第一个参数和apply一样是新的this指向,剩下的参数写入数据;
什么是闭包?为什么要用它?
闭包就是能够读取其他函数内部变量的函数。
在全局环境中访问函数内部变量,闭包有两个最大的用处,一个是可以在全局作用域中读取内部函数的的变量,另一个就是可以让闭包中引用的变量始终保存在内存中。
简述js继承的方式
简述js继承的方式 —杨旸
父类
// 定义一个动物类
function Animal (name) {
// 属性
this.name = name || 'Animal';
// 实例方法
this.sleep = function(){
console.log(this.name + '正在睡觉!');
}
}
// 原型方法
Animal.prototype.eat = function(food) {
console.log(this.name + '正在吃:' + food);
};
1、原型链继承
核心: 将父类的实例作为子类的原型
function Cat(){
}
Cat.prototype = new Animal();
Cat.prototype.name = 'cat';
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.eat('fish'));
console.log(cat.sleep());
console.log(cat instanceof Animal); //true
console.log(cat instanceof Cat); //true
2、构造继承
**核心:**使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型)
function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // false
console.log(cat instanceof Cat); // true
3、实例继承
**核心:**为父类实例添加新特性,作为子类实例返回
function Cat(name){
var instance = new Animal();
instance.name = name || 'Tom';
return instance;
}
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); // false
4、拷贝继承
子类不影响父类,子类可以继承父类的一些功能 ( 代码复用 )
function Cat(name){
var animal = new Animal();
for(var p in animal){
Cat.prototype[p] = animal[p];
}
// Cat.prototype.name = name || 'Tom'; 错误的语句,下一句为正确的实现
this.name = name || 'Tom';
}
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // false
console.log(cat instanceof Cat); // true
5、组合继承
**核心:**通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类实例作为子类原型,实现函数复用
function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); // true
6、寄生组合继承
**核心:**通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属性,避免的组合继承的缺点
function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
(function(){
// 创建一个没有实例方法的类
var Super = function(){};
Super.prototype = Animal.prototype;
//将实例作为子类的原型
Cat.prototype = new Super();
})();
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); //true
Cat.prototype.constructor = Cat; // 需要修复下构造函数
javascript 的垃圾回收机制讲一下
举个例子:当我们在使用闭包的时候 函数里面的数据 在函数执行完毕之后会回收 如果是在闭包产生的情况下 函数内部的数据就无法正常回收 闭包会导致数据 活跃在内存里面 无法被回收 闭包越多 内存就会越来越少 对程序的执行很不友好 闭包不要滥用 在确实需要的时候才使用
垃圾回收机制之一:引用计数 当引用计数为0的时候 就会把垃圾回收 将闭包的函数设置为null
介绍下 promise 的特性、优缺点
1.Promise 基本特性
Promise 有三种状态:pending (进行中),fulfilled (已成功),rejected (已失败)
Promise 对象接受一个回调函数作为参数,该回调函数接受两个参数,分别是成功时的回调 resolve 和 失败时的回调 reject;另外 resolve 的参数除了正常值以外,还可能是一个 Promise 对象的实例;reject 的参数通常是一个 Error 对象的实例
2.Promise 的优点
它将逐渐被用作浏览器的异步 API ,统一现在各种各样的 API
Promise 更适合处理一次性的结果,在结果计算出来之前或之后注册回调函数都是可以的,都可以拿到正确的值
3.Promise 的缺点
无法取消 Promise,一旦新建它就会立即执行,无法中途取消。
如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部