1 js数据类型划分?
javaScript属于弱语言类型,当前数据类型是由值决定的。
- 基本数据类型
- Number 数字类
- String 字符串类
- Boolean 布尔类
- null 空,没有,访问一个不存在的对象,返回值就是null
- undefined 未定义,没有进行赋值
- symbol(es6新增)独一无二的数据类型
- 复杂数据类型(引用数据类型)
- Object 对象类
- Array 数组类
- function 函数
2 基本数据类型与引用数据类型有什么区别?
(1)两者作为函数的参数进行传递时:
基本数据类型传入的是数据的副本,原数据的更改不会影响传入后的数据。
引用数据类型传入的是数据的引用地址,原数据的更改会影响传入后的数据。
(2)两者在内存中的存储位置:
基本数据类型存储在栈中。
引用数据类型在栈中存储了指针,该指针指向的数据实体存储在堆中。
3 逻辑运算符用过吗?
&& 与 || 或 !非
&&: 表示且 的关系,都为真才为真,一假即假
|| :表示或的关系,都为假才为假,一真即真
!: 取反 先将当前数据转为布尔值再进行取反
4 你都知道那些判断数据类型的方法?
(1)利用 typeof 可以判断数据的类型;
(2)A instanceof B 可以用来判断 A 是否为 B 的实例,但它不能检测 null 和 undefined;
(3)B.constructor == A 可以判断 A 是否为 B 的原型,但 constructor 检测 Object 与 instanceof 不一样,还可以处理基本数据类型的检测。
(4)Object.prototype.toString.call() 是最准确最常用的方式。
5 深浅拷贝有什么区别?通过的什么方法?
浅拷贝只复制指向某个对象的指针,而不复制对象本身。
浅拷贝的实现方式有:
(1)Object.assign():需注意的是目标对象只有一层的时候,是深拷贝;
(2)扩展运算符;
深拷贝就是在拷贝数据的时候,将数据的所有引用结构都拷贝一份。
深拷贝的实现方式有:
(1)手写遍历递归赋值;
(2)结合使用JSON.parse()和JSON.stringify()方法。
6 let const var 有什么区别?
9 什么是执行上下文与执行栈?区别是什么?
变量或函数的执行上下文,决定了它们的行为以及可以访问哪些数据。每个上下文都有一个关联的变量对象, 而这个上下文中定义的所有变量和函数都存在于这个对象上(如DOM中全局上下文关联的便是window对象)。
每个函数调用都有自己的上下文。当代码执行流进入函数时,函数的上下文被推到一个执行栈中。在函数执行 完之后,执行栈会弹出该函数上下文,在其上的所有变量和函数都会被销毁,并将控制权返还给之前的执行上 下文。 JS的执行流就是通过这个执行栈进行控制的。
区别:
(1)函数的执行上下文只在函数被调用时生成,而其作用域在创建时已经生成;
(2)函数的作用域会包含若干个执行上下文(有可能是零个,当函数未被调用时)。
10 什么是作用域以及作用域链?
作用域可以理解为一个独立的地盘,可以理解为标识符所能生效的范围。作用域最大的用处就是隔离变 量,不同作用域下同名变量不会有冲突。ES6中有全局作用域、函数作用域和块级作用域三层概念。
当一个变量在当前块级作用域中未被定义时,会向父级作用域(创建该函数的那个父级作用域)寻找。
如果父级仍未找到,就会再一层一层向上寻找,直到找到全局作用域为止。这种一层一层的关系,就是作用域链 。
11 分析下this的指向情况?
在对象内部的方法中使用对象内部的属性是一个非常普遍的需求。但是 JavaScript 的作用域机制并不支持这一点,基于这个需求,JavaScript 又搞出来另外一套 this 机制。 this存在的场景有三种全局执行上下文和函数执行上下文和eval执行上下文,eval这种不讨论。在全局执行环境中无论是否在严格模式下,(在任何函数体外部)`this` 都指向全局对象。在函数执行上下文中访问this,函数的调用方式决定了 `this` 的值。在全局环境中调用一个函数,函数内部的 th