第 1 卷
方法论
- 自己动手总结,定期复习,强化记忆。
Javascript
Javascript 有多少种数据类型,如何判断?
按大的类型来说。
primitive types(基本类型,栈内存):Number String Boolean Null Undefined Symbol object types(对象类型,堆内存): Object Array Date
RegExp Map Set 等等
结合 typeof 和 instanceof 可以判断,但是比较繁琐
的法是来判断。
1 function getType(val) { 2
return Object.prototype.toString.call(val).replace(/\[object\s(\w+)\]/ 3 .toLowerCase();
4 }
为什么说 Symbol 是基本数据类型?
Symbol 是没有构造函数 constructor 的,不能通过 new Symbol() 获得实例。
基本类型为什么也可以调方法,比如.toFixed()?
基本类型都有对应的包装类,可以调方法是因为进行了自动装箱。
如何理解原型链?
思路:首先要说什么是原型,为什么要设计原型(共享属性和方法),然后说属性和方法查找的顺序,自然而然就谈到了原型链。原型链可以引申到继承,
继承要结合构造函数和原型。
每个对象都有原型,对象的原型可以通过其构造函数的 prototype 属性访问。查找㇐个对象的属性或方法时,如果在对象本身上没有,就会去其原型上查找;
而原型本身也是㇐个对象,如果在
也找不到,就会继续原型链的终点是。
如何理解闭包?
内部函数 inner 如果引用了外部函数 outer 的变量 a,会形成闭包。如果这个内部函数作为外部函数的返回值,就会形成词法环境的引用闭环(循环引用),对
“”
应变量 a 就会常驻在内存中,形成大家所说的闭包内存泄漏。虽然闭包有内存上的问题,但是却突破了函数作用域的限制,使函数内外搭起了沟通的桥
“”
梁。闭包也是实现私有方法或属性,暴露部分公共方法的渠道。还可以引申出柯里化,bind 等概念,面试官说可以啊,小伙子!变量提升问题
JS 分为词法分析阶段和代码执行阶段。在词法分析阶段,变量和函数会被提升(Hoist),注意 let 和 const 不会提升。而赋值操作以及函数表达式是不会被提
升的。
出现变量声明和函数声明重名的情况时,函数声明优先级高,会覆盖掉同名的变量声明!为了降低出错的风险,尽量避免使用hoist!
注意混杂了函数参数时的坑,主要还是考虑按两个阶段分析,包括函数参数也是有声明和赋值的阶段:
1 var obj = { 2
val: 5 3 }
4 function test(obj) { 5
obj.val = 10;
6 console.log(obj.val);
7 var obj = { val: 20 };
8 console.log(obj.val)
9 }
10test(obj);
11console.log(obj.val)
12 13//10 20 10
1 function test(obj) { 2
console.log(typeof obj)
3 function obj() {} 4
} 5 test({})
6 7
//function
暂时性死区
这个其实在 ES6 规范就有提到了:The variables are created when their containing Lexical
Environment <https://262.ecma-international.org/6.0/#sec-lexical-environments> is instantiated but may not be accessed in any way until
’ the variables LexicalBinding is evaluated.
通过 let 或 const 声明的变量是在包围它的词法环境实例化时被创建,但是在变量的词法绑定执行前,该变量不能被访问。
1 2typeof a; //报Uncaught ReferenceError: a is not defined
let a;
var 是没有这个问题的,var 声明变量有变量提升,并且变量的初始值是 undefined。
警告:养成先声明再使用的好习惯,别花里胡哨的!
诡异的块级函数声明
a = 2 4 function a() {}
5 a = 1 6
} 7 console.log(a)
8 //2
严格模式要注意的地方
- Module code is always strict mode code.
- All parts of a ClassDeclaration or a ClassExpression are strict mode code.
- 禁止意外创建全局变量,直接抛出错误
- this 问题
- arguments 和参数列表的独立性,并且 arguments 不可修改
- 给 NaN 赋值会抛出错误
- 对象操作:给不可写属性赋值(writable: false);给只读属性赋值(只有 get,没有 set);给不可扩展对象新增属性
- 严格模式要求参数名唯㇐,属性名唯㇐
- 禁止八进制数字
- 禁止对 primitive type 的变量加属性或方法
- 禁止使用with
- eval 不再为 surrounding scope 添加新的变量
- 禁止delete 声明的变量,禁止delete 不可删除的属性或方法
LHS 和 RHS 是什么?会造成什么影响?
LHS 是 Left Hand Side 的意思,左值查询㇐个变量,如果变量不存在,且在非严格模式下,就会创建㇐个全局变量。RHS查询㇐个变量,如果变量不存在,
就会报错 ReferenceError。
常见的 JS 语法错误类型有哪些?举几个例子。
ReferenceError:引用了不存在的变量
TypeError:类型错误,比如对数值类型调用了方法。
SyntaxError:语法错误,词法分析阶段报错。
RangeError:数值越界。
URIError,EvalError
在 try-catch 或 with 中定义变量有什么影响?
catch子句和 with 语句中有自己的词法作用域,但是如果通过 var 定义变量,会直接影响 try-catch 或 with 语句所在词法作用域。
本卷图片
本页图片




















































































本页图片
































本页图片









