目录
一、变量类型
1、值类型和引用类型
2、判断数据类型typeof、instanceof、Object.prototype.toString.call()、constructor
1)typeof
2)instanceof
3)Object.prototype.toString.call()
4)constructor
3、深拷贝与浅拷贝
4、“==”和“===”的区别
5、truely变量和falsely变量
6、let、const和var的概念与区别、变量提升与暂时性死区
7、变量的解构赋值
8、Symbol概念及其作用、应用场景
二、原型和原型链
1、原型和原型链、prototype与__proto__的关系与区别
2、class基本语法及继承
3、new的原理
4、new和Object.create的区别
三、作用域和闭包
1、作用域和作用域链、执行上下文
2、bind、call、apply的区别
3、如何正确判断this?
4、闭包及其作用
5、JS的垃圾回收机制
四、异步
1、概念
2、EventLoop事件循环/事件轮询、宏任务与微任务
3、Promise(Promise A+规范、手撕Promise.all、Promise.race、Promise相关API和方法)
4、async/await
5、Generator及其异步方面的应用
6、几种异步方式的比较(回调、Promise、Generator、async)
7、setTimeout用作倒计时为何会产生误差?
8、Iterator和for...of(Iterator遍历器的实现)
9、循环语法比较及使用场景(for、forEach、for...in、for...of)
10、defer和async的区别
五、JS Web API
1、DOM(Document Object Model)
2、BOM(Browser Object Model)
3、事件绑定、事件冒泡、事件代理(事件委托)
4、ajax和跨域
1)Ajax的请求过程
2)跨域:同源策略及跨域实现方式和原理
5、存储Cookie、localStorage、sessionStorage
6、其他
1)JS中的String、Math和Array方法
2)类数组与数组的区别与转换
3)数组扁平化
4)数组去重
5) JavaScript中的arguments
6)箭头函数和普通函数的区别
7)函数柯里化及其通用封装
8)ES6新增特性
9)Set和Map数据结构
一、变量类型
1、值类型和引用类型
值类型(基本数据类型):Number、String、Boolean、Undefined、Null、Symbol、BigInt。直接存储在栈(stack)中,占用空间小、大小稳定。
引用类型:对象Object、数组Array、函数Function。存储在堆(heap)中,占用空间大,大小不固定。同时会在栈中存储一个该对象的堆内存地址(指针)。
Number类型:0.1+0.2!==0.3原因?Number类型取值范围?
Undefined和Null类型区别?
Null(空值)表示一个为空的对象;
Undefined(未定义)声明一个变量没有赋值
JavaScript中值类型和引用类型的区别:
1、值类型的值是不可变的;引用类型的值是可变的
2、值类型的变量是存放在栈;引用类型在栈中存放的是变量标识符以及变量所对应值的引用地址,而变量所对应的值被存放在堆中
3、值类型无法添加属性和方法;引用类型可以添加属性和方法
4、值类型拷贝变量的内容;引用类型拷贝引用地址
参考:JavaScript 原始值和引用值的各种区别
2、判断数据类型typeof、instanceof、Object.prototype.toString.call()、constructor
1)typeof
typeof 对于值类型来说,除了 null 都可以显示正确的类型;对于引用数据类型,除了函数之外,都会显示"object"
| 描述 | 结果 |
|---|---|
Undefined |
"undefined" |
Null |
"object" |
Boolean |
"boolean" |
Number |
"number" |
String |
"string" |
Symbol |
"symbol" |
BigInt |
"bigint" |
Function |
"function" |
Array |
"object" |
Object |
"object" |
参考:MDN
2)instanceof
instanceof用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性,其意思就是判断对象是否是某一数据类型(如Array)的实例。
js实现instanceof:
function myInstanceof(left,right){ var protoType=right.prototype var proto=left.__proto__ while(true){ if(proto===null){ return false } if(proto===protoType){ return true } proto=proto.__proto__ } }
讯享网
3)Object.prototype.toString.call()
4)constructor
constructor可以检测原始值类型,但是只会基于原型链上的直属类检测。
参考:typeof,instanceof,constructor,Object.prototype.toString.call()
3、深拷贝与浅拷贝
深拷贝和浅拷贝只针对 Object, Array 这样的引用类型。浅拷贝只复制一层对象的属性,而深拷贝则递归复制了所有层级。
深拷贝实现方式:
1、递归
讯享网function deepClone(obj={}){ if(obj==null || typeof obj!=='object'){ return obj } let result if(obj instanceof Array){ result=[] }else{ result={} } for(let key in obj){ //保证key不是原型的属性 if(obj.hasOwnProperty(key)){ //递归调用 result[key]=deepClone(obj[key]); } } return result }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/116082.html