ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 一、 ```js 执行结果:10 说明:i是全局变量,a[i]在定义时没有立即执行,当循环体结束时,i的值为10,所以当a[6]执行时,函数中打印的i已经变成了10,打印输出了10 ``` ## 二 ```js 执行结果:报错,提示tmp变量找不到 说明:var定义的变量存在变量提升,会先进行变量的声明,然后执行变量的赋值及使用。但是使用let定义的变量不存在变量提升,{}之间形成块级作用域,因为在当前块级作用域中声明了tmp变量,所以块级作用域中的tmp变量锁定了作用域,在未声明之前使用变量导致报错。 ``` ## 三 ```js var arr = [12,34,32,89,4]; return arr.sort((a,b) => { return a-b; })[0] ``` ## 四 ```html var:变量声明,存在变量提升,定义的变量可后期发生改变; let:变量声明,不存在变量声明,锁定作用域,在未声明之前不能使用该变量; const:声明常量,不存在变量提升,在声明时必须赋值,赋值后不允许修改。 ``` ## 五 ``` 输出结果:10; 说明:setTimeout属于宏任务,会在主线程执行结束后调用,在主线程执行结束后定义的回调函数其实是在window下声明的,this指向window,获取到的值为10; ``` ## 六 ``` 1.防止变量名起冲突 2.可以使用symbol避免魔术字符串 3.定义不重复的常量 4.symbol作为键名时,不被常规方法遍历出来,因此可以给对象定义非私有,但只用于内部使用的方法和属性 ``` ## 七 js中的数据类型包括基本数据类型和引用类型。基本数据类型因为使用比较频繁且内存占用较低,所以存放在内存中,但是引用类型以为占用内存比较大,存放在堆内存中。 浅拷贝指的是:在复制基本数据类型时,直接形成一个副本,在复制引用类型时,只是复制变量的引用指针,当修改其中一个对象的属性值时,另外一个对象的属性值也会发生改变。 常见的浅拷贝的方式: - Object.assign() - ES6的展开运算符... - 数组的concat splice slice方法等 深拷贝:和浅拷贝相对的,深拷贝就是在数据中有引用类型的时候,无论改变原数据还是改变新数据都不会造成数据共享。 常用的深拷贝的方式: JSON.parse(JSON.stringify()) ## 八 ts是js的超集,新增了ES6的语法及类型判断 ## 九 优点: - TypeScript 增加了代码的可读性和可维护性 - TypeScript 非常包容 - TypeScript 拥有活跃的社区 缺点: - 有一定的学习成本,需要理解接口(Interfaces)、泛型(Generics)、类(Classes)、枚举类型(Enums)等前端工程师可能不是很熟悉的概念 - 短期可能会增加一些开发成本,毕竟要多写一些类型的定义,不过对于一个需要长期维护的项目,TypeScript 能够减少其维护成本 - 集成到构建流程需要一些工作量 - 可能和一些库结合的不是很完美