首页 > 代码库 > Javascript基础知识小测试(一)

Javascript基础知识小测试(一)

这里罗列了《你不知道的js》上卷的一些知识点以及小问题,如果你想巩固一下js那么就和我一起来看看吧。

如果你能不看书就回答上80%的问题说明你js的这一部分学得还不错,再接再厉。

作用域和闭包

词法作用域
  • 变量赋值操作会执行的两个动作
  • RHS 和 LHS 查询
  • 在作用域顶层无法找到目标变量,在严格模式和非严格模式下有什么结果?
  • with的副作用
  • 匿名函数的三个缺点
  • IIFE是什么
  • JS的块作用域以及如何隐式模拟块作用域?
  • let 和 var 在变量声明有什么区别?
  • 提升(变量、函数有什么区别)
闭包
  • 闭包产生的原理
1 function foo() {  
2     function bar() {}; 
3      /*...*/
4 }
        当函数可以记住并且访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。
         bar对foo内部作用域的引用就叫做闭包
  • 闭包遇上for循环,问题、机制、解决办法(考虑let)
  • 模块的两个必要条件
  • import 和 module 的区别

this和对象原型

this
  • 胖箭头 => 的作用原理
  • this是运行时绑定还是编译时绑定?
  • this的四个绑定及其原理
  • 绑定的优先级
  • 为什么setTimeout()中的this会默认绑定到window?
  • 写一个硬绑定bind(obj, target);
  • 硬绑定的优势
  • 使用new调用函数时会发生的四个步骤?
对象
  • js中的六个基本类型、六个内置对象
  • 函数从来不会属于某一个对象
  • get和set,get的函数名和函数值分别代表什么
  • in 和 hasOwenPrototype 的区别
  • for...in 的特点?为什么说数组的遍历尽量不用 for...in?
  • 类的继承其实就是复制,js不能复制
  • 隐式混入和显式混入的区别(前者直接全部“复制”过来,后者用call、apply)
原型
  • 原型链上的隐式屏蔽
  • 使用new一个有原型的对象的时候会发生什么步骤?
  • Foo.prototype的 .constructor 属性是一直存在的吗?它的指向?
  • var b = Object.create(a);的作用机制
  • Object.create(); 的缺点
 行为委托
  • 一句话概括:函数的继承,对象的委托
  • 委托的两个原则:1、状态保存在委托者,而不是委托目标。2、避免在[prototype]链上的不同位置使用相同的命名
  • 委托的实质?
  • 根据下面函数继承写出相应的行为委托
    函数继承:
 1 function A(name) {
 2 this.name = name;
 3 }
 4 A.prototype.sayName = function() {
 5 console.log(this.name);
 6 };
 7 function B(name) {
 8 A.call(this, name);
 9 }
10 B.prototype = Object.create(A.prototype);
11 var b = new B(‘Nic‘);
12 b.sayName(); //Nic
答案:    
    行为委托:
1 var A = {
2 init: function(name) { this.name = name; },
3 sayName: function() { console.log(this.name); }
4 };
5 var B = Object.create(A);
6 B.init(‘Nic‘);
7 B.sayName() //Nic

 

怎么改变的:
  • 将函数封装对象
    • 将构造函数内部的变量定义封装成一个函数
    • 将prototype对象的函数逐一封装进该对象
  • 将两个对象关联
    • 此时没有继承的说法了,关联不是上下级的关系,而是任意的
    • 关联后可以自定义或者封装新对象的一些属性及方法
  • 注意:尽量避免暴露委托
class
  • class不能声明属性只能声明方法
 1 class A {
 2 constructor(name, age) {
 3 this.name = name;
 4 this.age = age;
 5 }
 6 sayName() {
 7 console.log(‘hello, my name is: ‘+this.name);
 8 }
 9 }
10 var a = new A(‘wind‘, 20);
11 a.sayName(); //hello, my name is: wind

API设计原则

  • 最小特权原则:最小限度的暴露必要内容,而将其他内容都“隐藏”起来(将变量声明在某个作用域内尽量不在全局作用域中)
  • 尽量避免匿名函数
  • 关联关系中尽量避免函数名重复,会引发屏蔽覆盖的副作用
  • 内部委托(在内部调用)比直接委托(直接使用)可以让API接口更加清晰
  • 委托最好在内部实现,不要轻易的暴露出去

 

(以上答案三天后公布)

Javascript基础知识小测试(一)