// 分为三大部分:js基础,node基础,electron的基础

    js基础(都在nodejs下运行)

    参考:入门 https://www.w3schools.com/js/
    MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference

    1. 基础类型
      问题1.1:js有哪些基础类型
      问题1.2:Infinity,NaN,undefined是什么;如何判断一个变量是undefined 或 null 或 Function类型

    2. 声明与作用域
      问题2.1:下面代码的结果是什么,为什么呢
      for (var i = 0; i < 3; i++) {
      setTimeout(() => { console.log(i); }, 10 i);
      }
      问题2.2:下面代码的结果是什么,为什么呢
      for (let i = 0; i < 3; i++) {
      setTimeout(() => { console.log(i); }, 10
      i);
      }
      问题2.3:下面代码的结果是什么,为什么呢(声明前置,有时阅读旧代码需了解这点,平时不建议这么做,都要求先声明后使用)
      console.log(a)
      console.log(b)
      console.log(c)
      console.log(d)
      function a() { return 1 }
      var b = () => 2
      let c = () => 3
      const d = () => 4

    3. 闭包
      问题3.1 下面代码的结果是什么,为什么呢
      function F() {
      let i = 0;
      return function(v) { return ++i + v }
      }
      let f = F()
      console.log(f(0))
      console.log(f(10))
      let f2 = F()
      console.log(f2(100))

    3.2 闭包引起的内存泄露问题
    function F() {
    let i = 0;
    let i2 = 0;
    return function(v) { return ++i + v }
    }
    如果f2一直不设null,i会泄露吗,i2呢;

    1. 原型(prototype)
      function Base() {
      this.value = 0
      }
      Base.prototype.inc = function() {
      this.value++
      }
      问题4.1:let b = new Base; b.inc(); b为什么会调用inc函数呢
      问题4.2:下面代码的结果是什么,this究竟是什么
      let o={value:1};
      // o.inc() // 可以这么写吗
      Base.prototype.inc.call(o)
      console.log(o.value)
      问题4.3:执行Base(),里面的this是什么,而new Base()呢

    2. 常用的数据类型array
      问题5.1:创建一个数组
      问题5.2:常用操作:头部添加/移除元素,末尾添加/移除元素;合并数组;获取子数组
      问题5.3:如何判断是否数组类型
      问题5.4:如何遍历数组

    3. 常用的数据类型object,如 { v : 1 }
      问题6.1:如何json object转换为string,string转换为json object
      问题6.2:obj[key]的寻找元素的时间复杂度是多少
      问题6.3:如何遍历所有key和value

    1. js的单线程
      // 转到node基础的5. js的单线程

    2. proimse的了解
      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
      问题8.1:下面代码的结果是什么,为什么
      console.log(“step1”)
      const promise = new Promise((resolve, reject) => {
      console.log(“step2”)
      resolve(1)
      console.log(“step3”)
      });
      console.log(“step4”)
      promise.then(content => {
      console.log(“step6”)
      })
      console.log(“step5”)
      问题8.2:reject但没有catch有什么危害
      promise.reject(1)

    3. async/await是promise的语法糖
      问题9.1 async function() { xxx; return value; } 使用promise改写
      问题9.2 await value 使用promise改写

    1. 字符串模板,下面代码的结果是什么
      let value = “world”
      console.log(Hello ${value})

    10.2. 字符串操作:
    10.1 判断字符串以”abc”开头
    10.2 判断字符串以”abc”结尾
    10.3 判断字符串含有”abc”
    10.4 “123aaa4567abd”使用字母作分割成[“123”, “4567”, “”]

    1. 展开运算符与其余运算符
      以下代码的结果是什么
      let [a, …b] = [1, 2, 3]
      console.log(a)
      console.log(b)

    // 对象, 给新的变量名赋值
    let o = {p: 42, q: true}
    let {p, q} = o
    console.log(p)
    console.log(q)
    let {p: foo, q: bar} = o
    console.log(foo)
    console.log(bar)

    node基础

    https://nodejs.org/api/documentation.html

    1. 安装node,生成Hello world项目
      目的:安装node运行环境,搭建node项目
      使用npm init 生成 package.json
      问题1.1:修改package.json,使得 npm run show 标准输出”Hello world”

    2. module的了解
      目的:nodejs模块化的了解
      问题2.1 require的查找模块的路径
      问题2.2 怎么导出(exports)变量,函数,对象

    3. 异步读写文件
      目的:nodejs的流,事件的了解
      问题3.1 使用fs.readFile, fs.writeFile,拷贝一个文件

    4. 创建一个sleep的addon
      https://nodejs.org/api/addons.html
      目的:addon的了解,n-api的了解,node-gyp的了解
      问题4.1:提供一个addon.sleep(100) 同步等待100ms的函数,如果环境允许的话,同时支持Win和Mac平台

    5. js的单线程
      问题5.1 下面代码的结果是什么
      const mark1 = Date.now()
      console.log(‘step1’)
      setTimeout(() => {
      const mark3 = Date.now()
      console.log(step3: ${mark3-mark1})
      }, 1000)
      const mark2 = Date.now()
      console.log(step2: ${mark2-mark1})

    问题5.2 下面代码的结果是什么,为什么阻塞住mark2的执行,会影响mark3的执行呢
    const mark1 = Date.now()
    console.log(‘step1’)
    setTimeout(() => {
    const mark3 = Date.now()
    console.log(step3: ${mark3-mark1})
    }, 1000)
    addon.sleep(1000)
    const mark2 = Date.now()
    console.log(step2: ${mark2-mark1})

    问题5.3 任务队列,下面代码的结果是什么
    setTimeout(function() {
    console.log(1)
    }, 0);
    new Promise(function(resolve, reject) {
    console.log(2)
    for (var i = 0; i < 10000; i++) {
    if(i === 10) {console.log(10)}
    i == 9999 && resolve();
    }
    console.log(3)
    }).then(function() {
    console.log(4)
    })
    console.log(5);

    electron的基础
    1. 搭建“Hello World”,要求使用electron7.1.2
    安装electron7.1.2,在公司内网,需配proxy
    export http_proxy=http://dev-proxy.oa.com:8080
    export https_proxy=http://dev-proxy.oa.com:8080
    export no_proxy=localhost,9.0.0.0,10.0.0.0,.oa.com;
    export ELECTRON_GET_USE_PROXY=1
    export GLOBAL_AGENT_HTTP_PROXY=$http_proxy
    export GLOBAL_AGENT_HTTPS_PROXY=$https_proxy
    export GLOBAL_AGENT_NO_PROXY=$no_proxy
    对于win的batch,把export改为set,对于win的powershell,把export改为$Env:

    问题1.1:命令行运行:electron .
    问题1.2:使用electron-builder打包
    问题1.3:electron运行过程中,有多少个进程,分别是什么
    问题1.4:使用chrome dev tool调试

    1. main与renderer进程的rpc通信
      问题2.1 remote方式,阅读下面代码,renderer进程如何使用inc函数
      // Interface.js的内容
      const electron = require(“electron”)
      let instance = null;
      function getInstance() {
      if (electron.remote) {
      // 问题:这是什么进程
      return electron.remote.require(__dirname + ‘/Interface’).getInstance()
      } else {
      // 问题:这是什么进程
      return instance || (instance = require(‘./Implement.js’))
      }
      }
      exports.getInstance = getInstance

    // Implement.js
    function inc(value) {
    return value + 1
    }
    exports. inc = inc

    问题2.2 ipcMain,ipcRenderer方式,请实现:renderer传递数据给main,main传递数据给renderer