Algorithm:

No.7 整数翻转

  1. /**
  2. * Given num = 123, -123, 120
  3. * return 321, -321, 21
  4. * @author kanelogger
  5. * @result runtime 84 ms ; memory 36.2 MB
  6. */
  7. var reverse = function(num=0) {
  8. let a = Math.pow(2,31);
  9. let b = num.toString().replace( /\d+/g , e => +(e.split('').reverse().join('')));
  10. if(+b>=a-1 || +b<=-a)return 0
  11. return +b
  12. };
  1. // 64 ms 36 MB,
  2. var reverse = function(x) {
  3. const reversed = parseInt(Math.abs(x).toString().split('').reverse().join('')) * Math.sign(x);
  4. return (reversed <= 0x7fffffff && reversed >= -0x80000000) ? reversed : 0;
  5. }

这一道题很简单,但是在处理负数的问题上,没有用到 Math.sign() ,造成了方法比较复杂。

No.10 回文数

  1. /**
  2. * @param {number} x
  3. * Input: 121 -121 10
  4. * Output: true false false
  5. * @return {boolean}
  6. * 212 ms 45.8 MB
  7. */
  8. var isPalindrome = function(x) {
  9. let a = x.toString(),b = a.length-1;
  10. if(x<0)return false
  11. let c = b/2;
  12. for(let i=0;i<c;i++){
  13. if(a[i]!=a[b-i])return false
  14. }
  15. return true
  16. };
  17. // 最佳实践
  18. // 212 ms 44.8 MB
  19. var isPalindrome = function(x) {
  20. let w = x,
  21. y = 0;
  22. while(w > 0) {
  23. let z = w % 10;
  24. y *= 10;
  25. y += z;
  26. w -= z;
  27. w /= 10;
  28. }
  29. return x === y;
  30. };

No.13 罗马数转整数

  1. // 136 ms 40.1 MB
  2. var romanToInt = function(s) {
  3. const m = {
  4. I:1,V:5,X:10,L:50,C:100,D:500,M:1000
  5. }
  6. let ans = 0
  7. for(let i=0,l=s.length;i<l;i++){
  8. if( i<l-1 && m[s[i]]<m[s[i+1]] ){
  9. ans-=m[s[i]]
  10. }
  11. else{
  12. ans+=m[s[i]]
  13. }
  14. }
  15. return ans
  16. };
  17. // 最佳实践: 132ms/40MB
  18. let map = {
  19. 'M' : 1000,
  20. 'D' : 500,
  21. 'C' : 100,
  22. 'L' : 50,
  23. 'X' : 10,
  24. 'V' : 5,
  25. 'I' : 1,
  26. }
  27. var romanToInt = function(s) {
  28. let result = 0
  29. for (i=0;i<s.length-1;i++){
  30. if(map[s[i]] < map[s[i+1]]){
  31. result -= map[s[i]]
  32. } else{
  33. result += map[s[i]]
  34. }
  35. }
  36. result += map[s[s.length-1]]
  37. return result
  38. };

Review: 阅读并点评一篇英文技术文章

JavaScript的核心是一种同步的、阻塞的单线程语言。为什么我们需要异步呢?
week02 - 图1

有了异步,就可以对可能发生在后台的事情使用异步方法。
异步的演变:回调, promises, async/await
回调函数

  1. a( resultA=>{
  2. b( resultA,resultB => {
  3. c( resultB,resultC => {
  4. console.log(resultC)
  5. } ) )
  6. } )
  7. } )

promise

  1. const doSteps = new Promise((res,rej)=>{
  2. // pending
  3. if(){
  4. res()
  5. }else{
  6. rej()
  7. }
  8. })
  9. doSteps()
  10. .then( res => console.log(res))
  11. .catch( err => console.log(err))

async/await 封装在 promise 顶部的语法糖

对比promise和async/await

  1. function getJSON(ms){
  2. const a = true;// control
  3. return new Promise((res,rej)=>{
  4. console.log("pending")
  5. if(a){
  6. return setTimeout(res, ms, 'resolve');
  7. }else{
  8. return setTimeout(rej, ms, 'reject');
  9. }
  10. })
  11. }
  12. // promise
  13. getJSON(100)
  14. .then(res=>console.log(res));
  15. // pending
  16. // Promise {<pending>}
  17. // resolve
  18. // async/await
  19. const res = await getJSON(100);
  20. console.log(res)
  21. // pending
  22. // resolve

一个then,一个await,区别显而易见。

注意: await 只能在异步函数内部调用。

  1. Promise.resolve("hi");//Promise {<resolved>: "hi"}
  2. (async ()=> 'hi')() //Promise {<resolved>: "hi"}

使用async,即使您没有明确返回promise,它也将确保您的代码通过promise传递。

错误处理

  1. const A = () => {
  2. B()
  3. .then(res=>C(res))
  4. .catch(err=>console.log(err))
  5. }
  6. const A = async ()=> {
  7. try {
  8. const res = await B()
  9. C(result)
  10. }catch(err)
  11. console.log(err)
  12. }

Tips: 学习一个技术技巧

  • [].flat(depth) 数组扁平化
  1. let arr = [1,2,3,4,5,[6,7]]
  2. arr.flat(1) || arr.flat() // [1,2,3,4,5,6,7]
  3. let arr1= [1,2,3,[4,[5,6]]]
  4. arr1.flat()//[1,2,3,4,[5,6]]
  5. arr1.flat(Infinity) //[1,2,3,4,5,6] 传入 Infinity无论多深都可以展开
  6. let arr2 = [1, 2, , 4, 5];
  7. arr2.flat();// [1,2,4,5] 移除数组中的空项:
  • [].flatMap() 串联两个函数map().flat(1)
  1. const arr = [1, 2, 3, 4];
  2. console.log(arr.flatMap(x => [x, x + 10])) // [1,11,2,12,3,13,4,14]
  3. console.log(arr.map(x => [x, x + 10]).flat()) // [1,11,2,12,3,13,4,14]

Share: 分享一篇有观点和思考的技术文章

  1. 12张图带你理解异步JS
  2. 拆解 JavaScript 中的异步模式