本周算法题 Maximum Subarray,看了一篇介绍 ES6 展开操作符和解构技巧的文章,分享了 JavaScript 中获取文件后缀名的小坑与解法,分享了对于产品给用户做选择的一点看法。
/**
* 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
非常精妙的一个解法,每个数和前一个比,大的保存下来留着和下一个比,短短几行就是一个非常简洁的动态规划算法。
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 })
总体来说是篇不错的文章,合理运用这些小技巧,可以让你的代码更简洁易懂。
介绍下 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 给补回来,顺便移到下一位,开始截取。
这周讨论到公司产品在小程序上的一些问题。这里的小程序不单单指微信小程序,甚至包括支付宝小程序,百度小程序等。
一般情况下,说到小程序,大多指微信小程序,不单单是因为微信小程序名气最大,覆盖面最广,还因为微信的使用频率最高,见过手机没装支付宝的,但基本没见过手机没装微信的。
有时候我们在考虑一个产品的时候,会想我们不单提供微信小程序,还提供支付宝小程序,让用户可以选择。
个人觉得,这是一个比较大的误区。让用户做选择不一定是个好主意,好钢用在刀刃上,首先可以算下投入产出比,同样投入做微信小程序和支付宝小程序,如果微信的使用率是 50%,支付宝的使用率是 5%,那在产品形态上自然优先微信小程序,那 5% 的支付宝小程序一般也可以轻易的被微信小程序给取代。
说回给用户选择这个问题上来。往往我们觉得给用户选择是对用户最大的尊重,而实际上却不然。乔布斯没给用户选择,而是告诉用户你用的这个就是最好的,你不需要做选择。就像吃火锅一样,五花八门挑花了眼,浪费太多精力,我最喜欢的就是告诉我先吃啥后吃啥,涮几分钟,吃就得了。