js数据类型有哪些?
基本数据类型:string、boolean、number、undefined,null、symbol、bigint
引用数据类型:Object、function、Date、RegExp、Array...
详细参考: https://blog.csdn.net/jbj6568839z/article/details/107151991?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-29-107151991.pc_agg_new_rank&utm_term=Javascript%E7%9A%84%E4%B8%A4%E7%A7%8D%E5%BC%95%E7%94%A8%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B&spm=1000.2123.3001.4430
undefined与null的区别?
相同点:if判断两者都会被转换为false
不同点:
- null表示“没有对象”,即该处不应该有值。 典型用法:
(1).作为函数的参数,表示改函数的参数不是对象。
(2).作为对象原型链的终点。 - undefined表示“缺少值”,就是此处应该有一个值,但是还没有定义。典型用法:
(1).变量被声明了,但没有赋值时,就等于undefined。
(2).调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3).对象没有赋值的属性,该属性的值为undefined。
(4).函数没有返回值时或者return后面什么也没有,返回undefined。
ES6的新语法有哪些?
- symbol数据类型
- let和const
- for...of
- 解构赋值
- 模板字符串
- 扩展运算符
- Set和Map数据结构
- Promise
- Class
- 箭头函数
- 模块导入导出
const let与var的区别?
var 声明变量会挂载到 window 上,存在变量提升。
let 和 const 声明形成块级作用域,块之外的访问会报错,不能变量提升,在声明之前访问会报错,不允许在同一级中重复声明。
let 声明变量,值和类型都可以改变,无限制。
const 声明常量,只读,修改值会报错,保存的是内存地址,可以给对象或数组添加属性或元素,不能重新复写。
作用域、作用域链
作用域:就是代码的执行环境,执行环境定义了变量或者函数有权访问的其他数据,决定了它们各自的行为。其中包含全局作用域、块级作用域和函数作用域。
作用域链:当代码在一个环境中执行时,需要一些空间来存脚本所用的变量,这个存储变量空间被称为作用域对象,作用域对象可又有父级作用域对象。当执行访问一个变量时,JavaScript引擎会先从当前的作用域对象中找,如果没有就去父级找这个变量,以此类推直到该变量或者再也没有父级作用域对象为止。
原型、原型链的理解?
原型:每个对象都会在其内部初始化的一个属性,就是 prototype(原型),通俗的讲,原型就是一个模板,更准确的说是一个模板对象
原型链:当我们访问一个对象的属性的时候,如果这个对象内部不存在这个属性,那么他就会去 prototype 里找这个属性,这个 prototype 又会有自己的 prototype ,于是就这样一直找下去,这也就是我们说的原型链的概念。通俗的讲,就是利用原型让一个引用类型继承另一个引用类型的属性和方法。(大白话版本:对象的原型指向父级,而父级的原型又指向父级的父级,像这样层层指向的关系,就叫做原型链。在查找一个对象的属性的时候,javascript 会向上遍历原型链,知道找到给定义名称的属性为止,当查找到原型顶部的时候,也就是 object.prototype(),仍然没有找到指定的属性,就会但返回 undefined。)
简单叙述原型、构造函数、实例三者之间的关系?
JavaScript中的闭包是什么?闭包有什么作用?
闭包:能够读取其他函数内部变量的函数,也可以理解成“定义在一个函数内部的函数”,其本质就是将函数内部和函数外部连接起来的桥梁 特性:
- 函数嵌套函数
- 内部函数可以引用外部函数的参数或者变量
- 参数和变量不会被垃圾回收机制回收,因为内部函数还在使用
用途:
- 匿名自执行函数减少内存消耗
- 在内存中维持一个变量,可做缓存
- 保护函数内的变量安全,实现封装,防止命名冲突
注意点:
- 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
- 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
localstorage、sessionstorage与cookie的区别?
cookie:一般由服务器生成失效时间,如果是浏览器端生成,cookie默认是关闭浏览器后失效,大小4kb,每次携带请求头。
localstorage:除非主动清除否则永久保存,大小5MB,仅能存在客户端,不参与通信。
sessionstorage:仅在当前会话下有效,关闭页面或者清除浏览器后清除,大小5MB,仅能存在客户端,不参与通信。
for...in 、for...of 、forEach的区别有哪些?
for...in:适合用于遍历对象,遍历数组的索引。
for...of:是ES6的语法,只能遍历实现Symbol.interator的接口的对象,遍历数组内部的元素,不包括数组的原型属性method和索引name。
forEach是ES5的遍历数组,不能使用break和return结束并退出循环。
==和===的区别?
== 检查值相等,允许类型转换。 === 检查值和类型相等,不允许类型转换 。
拓展:[1,2,3] == [1,2,3] 比较输出什么?
答案:false
解析:js不能直接比较== 或者 ===来判断两个数组是否相等,所以返回结果为 false
如果判断两个数组是否相同,需要先将数组转换为字符串,再去作比较
[1,2,3].toString() == [1,2,3].toString()
如果两个数组所有元素都相同,但是元素的顺序不一致,就需要先对数组进行排序,再去比较就可以了
[1,2,3].sort().toString() == [1,3,2].sort().toString()