十五、如何判断一个变量是对象还是数组(prototype.toString.call())。
千万不要使用typeof来判断对象和数组,因为这种类型都会返回object。
typeOf()是判断基本类型的Boolean,Number,symbol, undefined, String。
对于引用类型:除function,都返回object null返回object。
installOf() 用来判断A是否是B的实例,installof检查的是原型。(arr instanceof Array)
toString() 是Object的原型方法,对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。
hasOwnProperty()方法返回一个布尔值,指示对象自身属性中是否具有指定的属性,该方法会忽略掉那些从原型链上继承到的属性。
isProperty()方法测试一个对象是否存在另一个对象的原型链上。
十六、setTimeout 和 setInterval的机制
因为js是单线程的。浏览器遇到etTimeout 和 setInterval会先执行完当前的代码块,在此之前会把定时器推入浏览器的
待执行时间队列里面,等到浏览器执行完当前代码之后会看下事件队列里有没有任务,有的话才执行定时器里的代码
十七、var let const
const:定义的变量不可修改,必须初始化 ,
var:定义的变量可以修改,如果不初始化输出undefined,不会报错
let:块级作用域,函数内部使用let定义后,会函数外部无影响
let const 不会造成变量的提升
十八、js垃圾回收机制
1.JS具有自动垃圾收集的机制
2.JS的内存生命周期(变量的生命)
1.分配你所需要的空间 var a = 20
2.使用分配带的内存(读写) alert(a + 10)
3.不适用的时候,释放内存空间 a = null
3.JS的垃圾收集器每隔固定的时间就执行一次释放操作,通用的是通过标记清除的算法
4.在局部作用域中,垃圾回收器很容易做出判断并回收,全局比较难,因此应避免全局变量
标记清除算法:js最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将他标记为'进入环境',
当变量离开(函数执行完后),就其标记为'离开环境'。垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,
然后去掉环境中的变量以及被环境中该变量所引用的变量(闭包)。在这些完成之后仍存在标记的就是要删除的变量了
十九、渐进增强和优雅降级
1.渐进增强就是针对低版本浏览器进行构建页面,保证最基本的功能,然后对高级浏览器进行效果、交互等改进和最佳功能达到更好的用户体验
2.优雅降级:一开始构建完整的功能,然后对低版本的进行兼容
二十、undefined 和 null
1.undefined类型只要一个,即undefined,当声明变量还未被初始化时就是undefined
2.null类型也只有一个值,即null。null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象
3.NaN 与任何值都是相比较的结果都是false
二十一、valueof和tostring
valueof:所有对象都有valueof,如果存在任意原始值,他就默认将对象转化为表示它的原始值。
如果对象是复合值,而却大部分对象无法真正表示一个原始值,因此默认的valueof()方法简单的返回对象本身,而不是返回原始值。
数组、函数和正则表达式简单的继承了这个more方法,返回对象本身
二十二、输入框的change和input事件
onchange事件:要在input失去焦点的时候才触发
oninput事件:要在用户输入的时触发,他是元素值发生变化时立即触发
二十三、同步和异步
同步:由于js单线程,同步任务都在主线程上排队执行,前面任务没有执行完成,后面的任务会一直等待
异步:不进入主线程,进入任务队列,等待主线程任务执行完成,开始执行。最基本的异步操作SetTimemot和SetInterval,等待主线程任务执行完,在开始执行里面的函数
二十四、函数的柯里化
概念:一个函数接受函数A作为参数,运行后返回return function一个新的函数,并且可以处理A中的参数(只接受单一参数的函数)
意义:将函数完全变成了接受一个参数,返回一个参数的固定形式,便于讨论和优化
二十五、while
while循环会在指定条件为真时循环执行代码
二十六、TypeScript的优点:
1、编译时的强类型,变成了强类型语言,还是编译成js 编译的时候就可以检验
2、更好的模块化
3、更好的是实现面向对象的编程,类、接口、模块