原始类型有,
number,string,boolean,null,undefined,symbol
对象类型:
不是原始类型的,就都是对象类型,对象类型的赋值是内存地址,原始类型赋值
判断类型:
typeof主要用来判断原始类型,除了null,都可以显示正确类型,对于对象而言,他的结果是object,
instanceof用来判断对象类型
类型转换:
只会转换为布尔,数字和字符串,需要记住,
数字和字符串转为布尔时,除了,0,-0,nan,和空字符串,剩下的都是true
undefined和null都是false,任何引用类型都是true
剩下的转字符串时,是什么就会转换为带双引号的东西,数组也是,外面的大括号换成引号,中间间隔为,对象是数组形式的两个obj,
字符串转为数字则是非数字的都是nan
null转数字为0,而symbol会报错
对象转为原始类型
会逐步调用,valueOf和toString方法,
this
函数中的this判断,先看是不是箭头函数,返回包裹箭头函数第一个普通函数的this,如果是bind,call,apply,this是第一个
如果是new的形式,this绑定固化到实例,如果是直接调用就是window,不是就是谁调用就是谁
==和===
==会进行类型转换,再比较,===直接类型和数值进行比较
闭包
闭包的意义就是让我们可以间接访问函数变量,一般加上return会把变量传递出来,闭包主要是防止变量被污染
深浅拷贝
Object.assign来解决问题,或者let b = { …a }解决
深拷贝一般使用JSON.parse(JSON.stringify(object))
原型,var,let,const
var会存在变量提升的情况,你在下面使用var但是最顶层可以使用,一般函数会出现提升的情况,而let和const因为暂时性死区不会出现这种情况,const赋值之后不能再次赋值
原型继承和class继承
原型有组合继承,继承者需要用继承者的call方法,Parent.call(this, value),Child.prototype = new Parent(),但是会多出来一些继承者不想要的属性
而寄生组合继承,优化掉了这种情况,通过create方法
Child.prototype = Object.create(Parent.prototype, {
constructor: {
value: Child,
enumerable: false,
writable: true,
configurable: true
}
})
class继承
直接
class Child extends Parent {
constructor(value) {
super(value)
this.val = value
}
}
模块化
解决命名冲突,提高复用性,可维护性
通过立即函数来实现模块化,通过函数作用域解决命名冲突,污染全局作用域的问题,用到commonjs的语法,如export和require,是同步导入,而es module是异步导入,直接import
proxy
用来实现数据响应式
可以用来自定义对象的操作
let p = new Proxy(target, handler)第一个表示需要代理的对象,第二个表示自定义的操作,下面的例子
let onWatch =(obj,setBind,getLogger)=>{
let handler = {
get(target,property,receiver){
getLogger(target,property)
return Reflect.get(target,property,receiver)},
set(target,property,value,receiver){
setBind(value,prolerty)
return Reflect.set(target,property,value)}
}
return new Proxy(obj,handler)
}
let obj ={a:1}
let p = onWatch(obj,(v,property)=>{console.log('listening${property}change${v}'},(target,property)=>{console.log(`'${property}' = ${target[property]}`)}
而在vue中要实现数据的响应式需要在get中收集依赖,在set中派发更新。
map,reduce,filter
map接受,当前元素,索引,原数组,返回一个处理过的新数组,
filter相同参数,用来过滤
reduce接受回调函数和初始值,返回经过处理的值
回调函数也可以作为一个数组,
并发和并行,宏观的并发表示同一段时间a和b都进行切换,完成两个任务,
微观的并行是指两个线程同时进行a和b工作
回调函数
在函数里面调用另一个函数
generator