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

第九天:无依赖小库 #11

Open
sofish opened this issue Apr 23, 2016 · 1 comment
Open

第九天:无依赖小库 #11

sofish opened this issue Apr 23, 2016 · 1 comment
Milestone

Comments

@sofish
Copy link
Owner

sofish commented Apr 23, 2016

对于球迷来说 NBA 是一种精神,对于 Benz 粉丝来说 AMG 是一种精神,对于黑客来说无依赖也是一种精神。前段时间因为 leftPad 在 npm unpublish 之后引发了一堆对 leftPad 的讨论,就如坐我旁边的同事,就叫我当场写个 leftPad,然后在内部分享会嘲笑我写的太差。

刚半夜看 GitHub Trending 发现了一个无依赖的对字符串操作的小库 dleitee/strman。喜欢看薄的书,看简单的代码。所以看了一波:

export const _isArray = value => {
    return (value !== null &&
           value.length >= 0 &&
           Object.prototype.toString.call(value) === '[object Array]');
};

export const _pop = array => {
    let newarray = [];
    for(let i = 0; i < array.length-1; i++){
        newarray[i] = array[i];
    }
    return newarray;
};

如果是我写的话,可能会是这样的:

export const _isArray = value =>  Object.prototype.toString.call(value) === '[object Array]';
export const _pop = array => array.slice();

所以我觉得这个库还是把东西写复杂了,随后发了一条微博轻吐槽(其实是反问),经提示,发现了一个坑(像 sort 要返回 true/false 一样的坑,以前注意过后来全忘记了):

let str = new String();
typeof str; // object
'' instanceof String; // false

真是一脸懵逼 😿 ,当然,像上面的 _isArray 还可以这样写:

export const _isArray = value =>  Array.isArray(value);

但这样写有一个不好的点 —— 不兼容老浏览器。似乎 Symbal 没这个问题?(这个留给大家)。所以总的来说 Object.prototype.toString.call 还是比较安全的办法。

var frame = document.createElement('iframe');
frame.src = window.location.href;
document.body.appendChild(frame);

var arr = new frame.contentWindow.Array();

console.log(arr instanceof Array); // false
console.log(Array.isArray(arr)); // true

这里我记错了,写一个例子来看看,多谢微博提醒的同学

要总结的话只有一句:我不喜欢看源代码,不过无依赖的看看也挺舒服;要啰嗦的是,突然想起百度 5、6 年前开源过一个叫 Tangram 的库,我就几乎全读了,后来发现当时了解的 js 技巧似乎比现在还多;要自黑的是,当隔三个月看自己的代码觉得是垃圾的时候说明一切都还好,当隔了一年了看自己的代码觉得当时自己很牛逼的话,那说明水平已经比较水 —— 说的就是我。

@sofish sofish added this to the Daily Post milestone Apr 23, 2016
@sofish
Copy link
Owner Author

sofish commented Apr 23, 2016

上次同事要求写的必须自黑的代码,目标不是代码,而是我喜欢自己写而不是 npm install leftpad --save

function leftPad(value, length, char) {
  var ret = '';
  char = String(char);
  while(length--) ret += char;
  return ret + value;
}

function padLeft(value, length, char) {
  return new Array(length).fill(char).join('') + value;
}

leftPad('ciao', 3, 'love');
padLeft('ciao', 3, 'love');

话说用 replace 也很好玩,跟 Array.fill 一样不用考虑 char 是数字还是字符串,不过兼容性更好:

function leftpad(value, length, char) {
  return new Array(length + 1).join(',').replace(/,/g, char) + value;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant