Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ARTS 第三周(2019.4.15~2019.4.21) #3

Open
catcuts opened this issue Apr 19, 2019 · 0 comments
Open

ARTS 第三周(2019.4.15~2019.4.21) #3

catcuts opened this issue Apr 19, 2019 · 0 comments
Labels

Comments

@catcuts
Copy link
Owner

catcuts commented Apr 19, 2019

第三周(2019.4.15~2019.4.21)

Algorithm 旋转数组

题目:

旋转数组

代码:

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function(nums, k) {
    let len = nums.length;
    nums.splice(0, 0, ...nums.splice(len - k % len));
};

思路:
刚开始的思路是从最后一个元素开始,一个个地移到数组的首位来实现。
后来再一想,既然都知道要移动几个了(k),不如一次性移动这些元素到首位来实现。

nums.splice(nums.length - k) 就是取出 num 的最后 k 个元素,
然后 nums.splice(0, 0, ...nums.splice(nums.length - k)) 加到 num 的首位之前,
从而实现了需求。

对比:
与最高分对比:
本代码运行 34 个测试用例花费约 108ms,平均一个测试用例约 3ms
最高分代码运行 34 个测试用例花费约 108ms,平均一个测试用例约 3ms
注:两份代码都在本机上运行(不同机器性能不同)

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function(nums, k) {
    k %= nums.length
    nums.splice(0, 0, ...nums.splice(nums.length - k))
};

思路一致。

Tip

Tip#1 JS 判断一个对象是否是一个 ES6 类

需求:
如果某个对象是一个类,则实例化它,否则...

方法:

  1. typeof func === 'function' && /^class\s/.test(func + '')
  2. return typeof thing === 'function' && thing.hasOwnProperty('prototype') && !thing.hasOwnProperty('arguments')
  3. 其他参考中提到的方法

参考:
How do you check the difference between an ECMAScript 6 class and function?

在实际开发中应充分测试后选取最适合实际需求的。

Tip#2 JS 类型判断工具库 check-type.js

check-types.js - A little JavaScript library for asserting types and values

功能包括检查 JS 中的某个对象是否为某种数据类型、值的比较等。

Tip#3 nodejs 安装 serialport 时报错 user "root" does not have permission to access the dev dir "/root/.node-gyp/10.9.0" 的解决方法与原理

方法:
使用 --unsafe-perm 选项

原理:
这个报错通常出现在以某个非 root 用户运行 sudo npm install

通过查看 npm 的源码可以发现,当 --unsafe-perm === false 时,npm 会获取 UID 或 GID 然后再以获取到的 UID 或 GID 再继续安装。也就是说,就算 sudo 了,如果没有 --unsafe-perm,那么 npm 还是会以当前用户(可能是非 root)来执行安装,所以就可能出现没有权限的问题。因此在 sudo 并且使用了 --unsafe-perm 才是真正提了权,否则 npm 内部会自动忽视提权。

参考:

Review JS 错误处理指南

阅读:
Handling Errors in JavaScript: The Definitive Guide

点评:

这篇文章首先对 JS 错误处理涉及到的基本概念进行详细阐述,
然后分别在服务端和客户端各展示了一个错误处理的示例。
其阐述有助于理解基本概念,同时代码也可作为开发过程中的模板使用。
相关代码地址:gisderdube/graceful-error-handling

文章内容结构:

  1. JS 错误处理基本概念
    • 错误实例构造器:Error
    • 错误触发:throw new Error(message)
    • 通用错误捕捉:try {} cache (e) {} finall {}
    • 异步错误捕捉:callbackpromise.catch(e => {})
  2. 服务端处理错误示例(以 express 为例)
    核心在于 自定义错误类型 和 在一个地方(比如中间件)来处理请求过程中的错误(比如返回错误信息等)
  3. 客户端处理错误示例(以 reactjs 为例)
    核心在于 把错误对象保存为状态 并 绑定到页面元素内容 来处理请求过程中的错误(比如在页面上提示错误信息)

补充一个 redux-saga 中的错误处理注意事项:
一个 effect 如果内部包含 fork 任务,那么不能在这个 effect 内部捕捉到这个 fork 任务的错误,而只能在这个 effect 的外部来捕捉到这个 fork 任务的错误。
如:(参考:redux-saga 的 fork model - Error 传播

//... imports

function* fetchAll() {
    try {        
        const task1 = yield fork(fetchResource, 'users')
        const task2 = yield fork(fetchResource, 'comments')
    } catch (e) {
        // 什么也捕捉不到
    }
    yield call(delay, 1000)
}

function* fetchResource(resource) {
    const {data} = yield call(api.fetch, resource)
    yield put(receiveData(data))
}

function* main() {
    try {
        yield call(fetchAll)
    } catch (e) {
        // 要在这里捕捉
    }
}

Share Orange Pi GPIO 串口通讯 —— 安装并使用 Linux 原生工具测试 与 Nodejs SerialPort 开发的过程

分享原创一篇:
Orange Pi GPIO 串口通讯 —— 安装并使用 Linux 原生工具测试 与 Nodejs SerialPort 开发的过程

@catcuts catcuts added the ARTS label Apr 19, 2019
@catcuts catcuts changed the title 第三周(2019.4.15~2019.4.21) ARTS 第三周(2019.4.15~2019.4.21) Apr 19, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant