内容简介:本周算法题 Maximum Subarray,看了一篇介绍 ES6 展开操作符和解构技巧的文章,分享了 JavaScript 中获取文件后缀名的小坑与解法,分享了对于产品给用户做选择的一点看法。这个解法来自非常精妙的一个解法,每个数和前一个比,大的保存下来留着和下一个比,短短几行就是一个非常简洁的动态规划算法。
本周算法题 Maximum Subarray,看了一篇介绍 ES6 展开操作符和解构技巧的文章,分享了 JavaScript 中获取文件后缀名的小坑与解法,分享了对于产品给用户做选择的一点看法。
Algorithm
/** * Maximum Subarray * https://leetcode.com/problems/maximum-subarray/ * * @param {number[]} nums * @return {number} */ var maxSubArray = function (nums) { for (let i = 1; i < nums.length; i++) { nums[i] = Math.max(nums[i], nums[i] + nums[i - 1]); } return Math.max(...nums); }; console.log(maxSubArray([-2, 1, -3, 4, -1, 2, 1, -5, 4])) // 6
非常精妙的一个解法,每个数和前一个比,大的保存下来留着和下一个比,短短几行就是一个非常简洁的动态规划算法。
Review
JavaScript hacks for ES6 hipsters
https://hackernoon.com/javascript-hacks-for-es6-hipsters-67d633ce8ace
文章中介绍了几个 ES6 的有趣用法。
比如用解构去做交换:
let a = 'world', b = 'hello' [a, b] = [b, a] console.log(a) // -> hello console.log(b) // -> world // Yes, it's magic
解构结合 async/await:
const [user, account] = await Promise.all([ fetch('/user'), fetch('/account') ])
展开操作符用在数组连接上:
const one = ['a', 'b', 'c'] const two = ['d', 'e', 'f'] const three = ['g', 'h', 'i'] // Old way #1 const result = one.concat(two, three) // Old way #2 const result = [].concat(one, two, three) // New const result = [...one, ...two, ...three]
展开操作符用在浅拷贝上:
const obj = { ...oldObj } const arr = [ ...oldArr ]
解构用在让函数参数更具有可读性上:
const getStuffNotBad = (id, force, verbose) => { ...do stuff } const getStuffAwesome = ({ id, name, force, verbose }) => { ...do stuff } // Somewhere else in the codebase... WTF is true, true? getStuffNotBad(150, true, true) // Somewhere else in the codebase... I ❤ JS!!! getStuffAwesome({ id: 150, force: true, verbose: true })
总体来说是篇不错的文章,合理运用这些小技巧,可以让你的代码更简洁易懂。
Tip
介绍下 JavaScript 中获取文件后缀名。
一般情况下我们通常可以用正则表达式或者 String 的 split
方法来做。
比如:
function getFileExtension2(filename) { return filename.split('.').pop(); }
这种方法通常情况下都能得到正确的后缀名,但是在一些特别情况下会有问题,比如 "abc", ".abc" 这里后缀名都会被认为是 abc。
一种更好的方法是:
function getFileExtension3(filename) { return filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); } console.log(getFileExtension3('')); // '' console.log(getFileExtension3('filename')); // '' console.log(getFileExtension3('filename.txt')); // 'txt' console.log(getFileExtension3('.hiddenfile')); // '' console.log(getFileExtension3('filename.with.many.dots.ext')); // 'ext'
先用 lastIndexOf
找到 .
最后出现的位置,如果是 "abc" 会返回 -1,如果是 ".abc" 会返回 0,减1之后变为 -2 和 -1,然后做一个无符号右移操作,分别为 4294967294, 4294967295,在这里其实就是去除符号,就算后面 +2 也无济于事,所以最后返回的是 ''
。
而正常 case 下,-1 之后也是大于等于0的,右移没产生什么作用,之后的 +2 把前面减的 1 给补回来,顺便移到下一位,开始截取。
Share
这周讨论到公司产品在小程序上的一些问题。这里的小程序不单单指微信小程序,甚至包括支付宝小程序,百度小程序等。
一般情况下,说到小程序,大多指微信小程序,不单单是因为微信小程序名气最大,覆盖面最广,还因为微信的使用频率最高,见过手机没装支付宝的,但基本没见过手机没装微信的。
有时候我们在考虑一个产品的时候,会想我们不单提供微信小程序,还提供支付宝小程序,让用户可以选择。
个人觉得,这是一个比较大的误区。让用户做选择不一定是个好主意,好钢用在刀刃上,首先可以算下投入产出比,同样投入做微信小程序和支付宝小程序,如果微信的使用率是 50%,支付宝的使用率是 5%,那在产品形态上自然优先微信小程序,那 5% 的支付宝小程序一般也可以轻易的被微信小程序给取代。
说回给用户选择这个问题上来。往往我们觉得给用户选择是对用户最大的尊重,而实际上却不然。乔布斯没给用户选择,而是告诉用户你用的这个就是最好的,你不需要做选择。就像吃火锅一样,五花八门挑花了眼,浪费太多精力,我最喜欢的就是告诉我先吃啥后吃啥,涮几分钟,吃就得了。
碎碎念
记录一些所思所想,写写科技与人文,写写生活状态,写写读书心得,主要是扯淡和感悟。 欢迎关注,交流。
微信公众号:程序员的诗和远方
公众号ID : MonkeyCoder-Life
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。