跟着月影学JavaScript(2) | 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第5天
写代码最应该关注什么?
- 风格?
- 效率?
- 约定?
- 使用场景?
- 设计?
总结来说,对于一些代码来说,要根据使用场景,进行性能优化,相比较代码可读性更为重要
例如之前的Leftpad事件
-
版本一
- 在
NPM模块粒度 - 在代码风格
- 在代码质量/效率 时间复杂度o(n)
- 在
function leftpad(str, len, ch) {
str = String(str);
var i = -1;
if (!ch && ch !== 0) ch = ' ';
len = len - str.length;
while (++i < len) {
str = ch + str;
}
return str;
}
-
版本二
- 代码更简洁
- 效率提升 时间复杂度o(m)n
function leftpad(str, len, ch) {
str = "" + str;
const padLen = len - str.length;
if(padLen <= 0) {
return str;
}
return (""+ch).repeat(padLen)+str;
}
-
版本三
- 性能更好 时间复杂度 o(log n)
/*! https://mths.be/repeat v1.0.0 by @mathias */
'use strict';
var RequireObjectCoercible = require('es-abstract/2019/RequireObjectCoercible');
var ToString = require('es-abstract/2019/ToString');
var ToInteger = require('es-abstract/2019/ToInteger');
module.exports = function repeat(count) {
var O = RequireObjectCoercible(this);
var string = ToString(O);
var n = ToInteger(count);
// Account for out-of-bounds indices
if (n < 0 || n == Infinity) {
throw RangeError('String.prototype.repeat argument must be greater than or equal to 0 and not be Infinity');
}
var result = '';
while (n) {
if (n % 2 == 1) {
result += string;
}
if (n > 1) {
string += string;
}
n >>= 1;
}
return result;
};
-
版本四
- 性能更好
/**
* String.prototype.repeat() polyfill
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat#Polyfill
*/
if (!String.prototype.repeat) {
String.prototype.repeat = function(count) {
'use strict';
if (this == null)
throw new TypeError('can't convert ' + this + ' to object');
var str = '' + this;
// To convert string to integer.
count = +count;
// Check NaN
if (count != count)
count = 0;
if (count < 0)
throw new RangeError('repeat count must be non-negative');
if (count == Infinity)
throw new RangeError('repeat count must be less than infinity');
count = Math.floor(count);
if (str.length == 0 || count == 0)
return '';
// Ensuring count is a 31-bit integer allows us to heavily optimize the
// main part. But anyway, most current (August 2014) browsers can't handle
// strings 1 << 28 chars or longer, so:
if (str.length * count >= 1 << 28)
throw new RangeError('repeat count must not overflow maximum string size');
var maxCount = str.length * count;
count = Math.floor(Math.log(count) / Math.log(2));
while (count) {
str += str;
count--;
}
str += str.substring(0, maxCount - str.length);
return str;
}
}
优化代码的几种方式
-
数据抽象
-
抽象使代码分离成接口和实现。所以在设计组件的时候,必须保持接口独立于实现,因此,你才能做到在改变底层实现时,界面将保持不变。
在这种情况下,无论任何程序使用这些接口,它们不会受到影响,只需要重新编译最新的实现。
-
-
过程抽象
- 忽略任务具体完成的过程,只精确描述该任务所要完成的功能
-
异步+函数式
总结
要想深入计算机领域,要培养工程师意识
要打好数学基础,要培养好算法意识,
要根据不同的场景,选对方法才能更好的解决问题
\