// 分为三大部分:js基础,node基础,electron的基础
js基础(都在nodejs下运行)
参考:入门 https://www.w3schools.com/js/
MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference
基础类型
问题1.1:js有哪些基础类型
问题1.2:Infinity,NaN,undefined是什么;如何判断一个变量是undefined 或 null 或 Function类型声明与作用域
问题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.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呢;
原型(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()呢常用的数据类型array
问题5.1:创建一个数组
问题5.2:常用操作:头部添加/移除元素,末尾添加/移除元素;合并数组;获取子数组
问题5.3:如何判断是否数组类型
问题5.4:如何遍历数组常用的数据类型object,如 { v : 1 }
问题6.1:如何json object转换为string,string转换为json object
问题6.2:obj[key]的寻找元素的时间复杂度是多少
问题6.3:如何遍历所有key和value
js的单线程
// 转到node基础的5. js的单线程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)async/await是promise的语法糖
问题9.1 async function() { xxx; return value; } 使用promise改写
问题9.2 await value 使用promise改写
- 字符串模板,下面代码的结果是什么
let value = “world”
console.log(Hello ${value}
)
10.2. 字符串操作:
10.1 判断字符串以”abc”开头
10.2 判断字符串以”abc”结尾
10.3 判断字符串含有”abc”
10.4 “123aaa4567abd”使用字母作分割成[“123”, “4567”, “”]
- 展开运算符与其余运算符
以下代码的结果是什么
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
安装node,生成Hello world项目
目的:安装node运行环境,搭建node项目
使用npm init 生成 package.json
问题1.1:修改package.json,使得 npm run show 标准输出”Hello world”module的了解
目的:nodejs模块化的了解
问题2.1 require的查找模块的路径
问题2.2 怎么导出(exports)变量,函数,对象异步读写文件
目的:nodejs的流,事件的了解
问题3.1 使用fs.readFile, fs.writeFile,拷贝一个文件创建一个sleep的addon
https://nodejs.org/api/addons.html
目的:addon的了解,n-api的了解,node-gyp的了解
问题4.1:提供一个addon.sleep(100) 同步等待100ms的函数,如果环境允许的话,同时支持Win和Mac平台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调试
- 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