1 变量类型和计算
1.1 值类型和引用类型的区别?
- 值类型:每个变量都会存储各自的值。不会相互影响
- 引用类型:不同变量的指针执行了同一个对象(数组,对象,函数)
1.2 typeof可以及检测的数据类型有哪些?
Note
- 基本数据类型:Undefined null bool string number
- 关键点:typeof只能区分值类型,不能区分引用类型
- JS中的基本数据类型:null, undefined, bool, string, number(typeof可以区分除了null以外的四种值类型)
- typeof 6种类型:Object({},[],null), Undefined, Boolean, Number, Function, String
- typeof可以区分值类型,typeof null = Object
1.3 JS中===和==的区别?
1.3.1 区别?
== 会进行强制类型转换之后再比较,=== 不会进行强制类型转换的
1.3.2 应用场景?
- (用于判断对象属性是否存在):if (obj == null) ===>>> 等价于if (obj == null || obj == undefined),可以简化代码,其他情形都使用===进行比较
- 用于判断函数的参数是否存在: function(a, b){ if(a == null) { // ... }}
- 对于函数内部或者是一个对象的参数进行判断只会出现undefined, 而不会报错(慎用)
1.3.3 其他?
js中类型转换为false的有哪些(6种):null, undefined, NaN, '', false, 0
1.4 JS中的内置函数有哪些?
Note
- 内置函数: Object Array Boolean Number String Function Date RegExp Error
- 内置对象:Math, JSON
2 原型和原型链
2.1 原型链的5条规则
- 所有的引用类型(数组,对象,函数),都是具有对象特性的,即可以自由扩展属性(除了null以外)
- 所有的引用类型(数组、对象、函数),都有一个proto 属性(隐式原型),这个属性的值是一个普通对象
- 所有的函数,都有一个prototype属性(显式原型),这个属性值是一个普通的对象
- 所有的引用类型(数组、对象、函数),proto的属性值指向(完全相等)它的构造函数的“prototype”的属性值
- 当试图得到一个对象的某一个属性的时候,如果一个对象本身没有这个属性的话,就会去它的proto( 也就是它的构造函数中去寻找这个属性)
2.2 JS中寻找对象属性的过程
- 当一个对象没有这个toString()这个属性的时候,就回去自己的隐式原型proto中去寻找这个属性,也就是去自己额构造函数的显示原型prototype中寻找这个属性(对象自身的隐式原型就是他的构造函数的显式原型)
- 发现FOO.prototype中也没有这个toString属性,这也是一个对象,name就去这个对象{}的proto中寻找toString()这个属性
2.3 instanceof的作用?
是用于判断【引用类型】属于哪个【构造函数】的方法
Note
总结:f.proto 一层一层向上寻找,能否找到FOO.prototype,找到为true,否则为false
3 作用域和闭包
3.1 函数表达式和函数声明的区别?
- 函数声明中函数名是必须的,函数表达式中则是可选的。
- 用函数声明定义的函数,函数可以在函数声明之前调用,而用函数表达式定义的函数则只能在声明之后调用。Note
总结:( 根本原因在于解析器对于这两种定义方式读取的顺序不同:解析器会实现读取函数声明,即函数声明放在任意位置都可以被调用;而对于函数表达式,解析器只有在读到函数表达式所在那一行时才会开始执行)
3.2 对执行上下文的理解?
Note
执行上下文可以理解为当前代码的执行环境,它会形成一个作用域。JavaScript中的运行环境大概包括三种情况。
- a. 全局环境:JavaScript代码运行起来会首先进入的环境
- b. 函数环境:当函数被调用执行时,会进入被调用的函数中执行代码
- c. eval(不推荐使用会对JS的执行效率产生影响)
因此在一个JavaScript程序中,必定会产生多个执行上下文,JavaScript引擎会以栈的方式来处理它们,这个栈,我们称其为函数调用栈(call stack)。栈底永远都是全局上下文,而栈顶就是当前正在执行的上下文。当代码在执行过程中,遇到以上三种情况,都会生成一个执行上下文,放入栈中,而处于栈顶的上下文执行完毕之后,就会自动出栈。