string.js中有一段源码,截取字符串的,中文有点问题,看了源码,有一段不是很明白,求教:
var tmpl = function(c){ return c.toUpperCase() !== c.toLowerCase() ? 'A' : ' '; },
template = str.slice(0, length+1).replace(/.(?=\W*\w*$)/g, tmpl); // 'Hello, world' -> 'HellAA AAAAA'
ps : str就是普通字符串 这段的目的是什么?
应小伙伴要求贴出方法全部:
truncate: function(length, pruneStr) { //from underscore.string, author: github.com/rwz
var str = this.s;
length = ~~length;
pruneStr = pruneStr || '...';
if (str.length <= length) return new this.constructor(str);
var tmpl = function(c){ return c.toUpperCase() !== c.toLowerCase() ? 'A' : ' '; },
template = str.slice(0, length+1).replace(/.(?=\W*\w*$)/g, tmpl); // 'Hello, world' -> 'HellAA AAAAA'
if (template.slice(template.length-2).match(/\w\w/))
template = template.replace(/\s*\S+$/, '');
else
template = new S(template.slice(0, template.length-1)).trimRight().s;
return (template+pruneStr).length > str.length ? new S(str) : new S(str.slice(0, template.length)+pruneStr);
}
7 回复
我猜测你的代码来自:https://github.com/epeli/underscore.string 可以看到truncate函数现在的功能已经和原本不一样了,即楼主这里的代码实现是旧版本,现在被改为prune。 文档中如下写道:
truncate(string, length, truncateString) => string
truncate('Hello world', 5)
// => 'Hello...'
truncate('Hello', 10)
// => 'Hello'
prune(string, length, pruneString) => string Elegant version of truncate. Makes sure the pruned string does not exceed the original length. Avoid half-chopped words when truncating.
prune('Hello, world', 5)
// => 'Hello...'
prune('Hello, world', 8)
// => 'Hello...'
prune('Hello, world', 5, ' (read a lot more)')
// => 'Hello, world' (as adding "(read a lot more)" would be longer than the original string)
prune('Hello, cruel world', 15)
// => 'Hello, cruel...'
prune('Hello', 10)
// => 'Hello'
搞清楚这两个函数的功能,具体深入到代码里,我建议你在源码里加一句代码:
var tmpl = function(c){ return c.toUpperCase() !== c.toLowerCase() ? 'A' : ' '; },
template = str.slice(0, length+1).replace(/.(?=\W*\w*$)/g, tmpl); // 'Hello, world' -> 'HellAA AAAAA'
console.log(template); // <--这里加一句输出
然后再测一下这个函数,你应该就可以搞清楚上面这段代码在干嘛了