1.
比较运算符 |
> |
< |
== |
<= |
>= |
== |
=== |
!= |
!== |
逻辑运算符 |
&& |
|| |
! |
条件语句 |
if (...) {} |
if (...) {} else {} |
if (...) else if (...) {} else {} |
switch(...) { case :xxx;break; default:break; } |
循环语句 |
for (;;) {} |
for (xx in xxx) {} |
2.①JavaScript基本数据类型按值传递,对象类型按共享传递,也叫按对象传递、按对象共享传递。
该策略重点:调用函数传参时,函数接收对象实参引用的副本(既不是按值传递,也不是按引用传递),它和引用传递最大的区别在于:在共享传递的过程中,对实参赋值不会影响实参的值。
经典面试题:
function func(o) {
o.name = "yimao"
o = 100
}
let obj = new Object();
func(obj);
console.log(obj); // obj
为什么会打印【object,object】?
在函数接收对象的实参和形参一个地址,但是当实参被赋值的时候,他的指向就被改变。他和引用传递最大的区别就是,在共享传递中对形参的赋值,不会影响到实参的值。
②typeof操作符返回一个字符串
类型 |
undefined |
null |
boolean |
number |
bigint(ECMAScript 2020新增) |
string |
symbol(ECMAScript 2015新增) |
宿主对象 |
function |
object |
tips:BigInt提供一种方法来表示大于-1的整数,这原本是JavaScript中可以用Number表示的最大的数字。BigInt可以表示任意大的整数。
3.函数表达式跟函数类似,他们有相同的语法。一个函数表达式可能是一个更大表达式的一部分。函数表达式不会提升,所以不能在定义之前调用。
var myFunction = function name([param[, param[, ... param]]]) { statements }
4.作用域是代码在运行时某些特性部分中变量函数的可访问性。换句话说,作用域决定了变量和其他资源的可见性。作用域作用就是隔离变量,防止变量污染。
ES6之前没有块级作用域,只有全局作用域和函数作用域。ES6的块级作用域可用新增命令 let和const来体现。
作用域链:当一个变量在当前作用域没有找到的时候,会从当前作用域定义的父级作用域去寻找。这一层一层的关系,就是作用域链。
注意:要到创建这个函数的域。作用域中取值,这里强调的是创建,而不是调用!
5.执行上下文和作用域:
许多开发人员混淆执行上下文和作用域的关系,误以为是相同概念,实际上不是。
执行上下文是可执行代码解析之前的必要准备工作。
JavaScript是解释型语言,JavaScript执行分为两个阶段:
①解释阶段:
Ⅰ词法分析
Ⅱ语法分析
Ⅲ作用域规则确定
②执行阶段:
Ⅰ创建执行上下文
Ⅱ执行函数代码
Ⅲ垃圾回收
执行上下文是一个抽象概念,我们可以把它当作一个对象,里面包含一些内容:
变量对象
每个执行环境文都有一个变量对象,全局环境的变量对象一直存在,函数的变量对象只有函数执行的时候才会存在。在函数调用执行之前,JS会将用当前函数的参数初始化变量对象,并将当前执行上下文进行相关联,函数代码块声明的变量和函数也会添加到变量对象上面。
活动对象
函数执行之后产生的变量对象就是活动对象,他们是同一个概念,只不过状态不同而已。
作用链域
如上。由多个执行上下文的变量对象构成的链表叫做作用链域。
调用者信息
如果当前函数被当作对象方法或者bind,call等API委托调用,则将当前代码快的调用者信息存入执行上下文,否则,将作为全局对象调用。
6.立即执行函数,就是声明之后立马执行,所以没有必要给这类函数命名,可以使用匿名函数,作用就是做一些封装,防止变量全局污染,以及保证内部变量的安全。
7.闭包就是有权访问另一个函数作用域的函数。