JS基础知识(一)JS中的原始类型(一)原始值有六种类型:boolean,null,undefined,number,string,symbol(二)原始类型存储值,有没有函数调用,函数可以调用,因为强制类型转换,转换成对象类型(3)数字类型是浮点类型eg:0.1+0.2!=0.3字符串类型是不可变的。调用string类型的任何方法都不会改变它的值(2)JS对象类型的原始类型和object类型有什么区别?原始类型存储值,对象类型存储地址(指针)(1)当函数参数为对象时?传递函数参数就是传递对象指针的副本(2)typeofvsinstanceoftypeof能否正确判断类型?instanceof正确判断对象的原理?typeof可以判断除null之外的原始类型的类型。除功能外,对象类型可以完整显示。typeof是一元运算符。function本质上是一个对象,但是和普通对象相比,function对象内部多了一个[[Call]]。该方法用于指示该对象是可调用的。typeof运算符判断Object时,如果内部实现了[[Call]]方法,则返回function。instanceof是一个双目算子。内部实现机制是通过原型链判断Symbol.hasInstance。可以自定义instanceof行为的东西(3)类型转换(1)转换为Boolean除了undefinednullfalseNaN''0-0其他所有值都转为true包括所有对象(2)对象转基本类型时转换对象,将调用内置的[[ToPrimitive]]函数。此方法在转换为原始类型时具有最高的调用优先级。leta={valueOf(){return0},toString(){return'1'},[Symbol.toPrimitive](){return2}}1+a//=>3(3)四个算术运算符的加法运算字符的特点:其中一个操作是字符串,那么另一个也会转为字符串(先转为字符串)如果一个不是字符串或者数字,那么也会转为数字或者astring(BooleanValuesareconvertedtonumbersandotherprioritystrings)除了加法运算符,其他运算符只要有一个是数字,另一个都会转为数值比较运算符,如果是对象,会通过toPrimitive转为对象如果是字符串,就用unicode字符索引来比较(4)这个怎么正确判断呢?箭头函数的this是什么?this指向where的优先级规则:new>bind>obj.foo()>foo()箭头函数一旦绑定,就不会再有任何改变(五)==vs=====vs===有什么区别?==:如果类型不同,则进行类型转换,判断是否为boolean,将其转换为数字,然后可以继续比较。一个是object,一个是string,number,symbol会判断类型转换,对象会转换成原来的类型再做判断(6)闭包什么是闭包?内部函数可以访问外部函数的变量。在循环中使用闭包来解决'var'定义函数的问题for(vari=1;i<=5;i++){setTimeout(functiontimer(){console.log(i)},i*1000)}setTimeout是一个异步函数,将执行所有循环,i是6个解决方案之一for(vari=1;i<=5;i++){(function(j){setTimeout(functiontimer(){console.log(j)},j*1000)})(i)}使用立即执行函数将i传入函数。此时,该值固定在参数j上,不会改变。当下次执行时关闭定时器,可以使用外部函数的变量j(执行up和down文本范围链首先寻找最近的解决方案二for(vari=1;i<=5;i++){setTimeout(functiontimer(j){console.log(j)},i*1000,i)}使用setTimeout的第三个参数,将其作为定时器函数的参数传递解决方案3for(leti=1;i<=5;i++){setTimeout(functiontimer(){console.log(i)},i*1000)}用let定义i来解决问题(7)深拷贝和浅拷贝什么是浅拷贝?如何实现浅拷贝?什么是深拷贝?如何实现深拷贝?Object.assign浅拷贝只会将所有属性值复制到新对象中。如果属性值是一个对象,则通过扩展运算符复制地址。。。同样的浅拷贝浅拷贝只解决了第一层的问题。深拷贝:通过JSON.parse(JSON.stringify(object))局限性:undefined,symbol会被忽略,函数不能序列化,不能解析循环引用的对象lodash实现深拷贝(8)Prototype如何理解原型?如何理解原型链?
