首页 > 网站 > WEB开发 > 正文

第四章:语言模块

2024-04-27 14:08:27
字体:
来源:转载
供稿:网友

第四章:语言模块

1.字符串的扩展与修复

语言脚本都对字符串特别关注,有关的方法特别多,这些方法有三大类:

第一类:与标签无关的实现:charAt,charCodeAt,concat,lastIndexOf,localeCompare,match,replace,slice,split,substr,substring,toLocaleLowerCase,toLocalUpperCase,toLowerCase,toUpperCase以及从Object继承来的方法。如,toString,valueOf

第二类:与标签有关的实现,都是对原字符串添加的一对标签:anchor,big,blink,blod,fixed,fontcolor,italics,link,small,strike,sub,sup

第三类是后来添加或未标准化的浏览器方法,如trim,quote,toSource,trimLeft,trimRight.其中,trim已经标准化,后四个是FF的私有实现。

先看看PRototypejs添加的扩展,

gsub,sub,scan,truncate,strip,stripTags,stripScript,extractScripts,evalScripts,escapeHYML,unescapeHTML,parseQuery,toArray,succ,times,camelize,capitalize,underscore,dasherize,inspect,unfliterJSON,isJSON,evalJSON,include,starsWith,endsWith, empty,blank,interpolate。

其中,gsub,sub,scan与正则相关,直接取ruby的命名

truncate是字符串截取,非常有用

strip即trim,已标准化

stripTags去掉字符串的标签对,非常有用。

stripScript是单单把script标签去掉,露出script.text

escapeHTML与unescapeHTML是用户输入输出的操作定义,非常有用。

parseQuery基本是对url的search部分的操作。

inspect就是在两端加双引号,用于构建json。

empty和blank是对空白进行判定,很简单的方法。

prototype.js这些框架经常被其它框架抄去,看抄去的功能,我们就知道哪些方法有价值。

rightJs的字符串扩展:include , black , camelize , capitalize , dasherize , empty, endsWith,evalScripts , extarctScripts, includes, on , startsWidth , stripScripts, stripTags, toFlaot, toInt, trim , underscored

Mootools的字符扩展(原型扩展) test, contains , trim , clean , camelCase, hyphenate , capitalize , escapeRegExp , toInt , toFloat , hexToRgb, rgbToHex , substitute , stripScripts

dojo的字符串扩展, rep , pad , substitute , trim , rep就是repeat方法

Ext字符串扩展,capitalize , ellipsis , escape , escapeRegex format htmlDecode, htmlEncode leftPad, parseQueryString , trim , urlAppend

百度七巧板的字符扩展有:decodeHTML ,encodeHTML , escapeReg , filterFormat , format, formatColor , stripTags , toCamelCase, toHalfWidth , trim , wbr

下面举例实现方法:

contains方法:判定一个字符串是否包含另一个字符串。常规思维,使用正则,但每次都要用new RegExp来构造,太麻烦,性能太差。转而使用原生字符串方法。如indexOf , lastIdexOf , search

    function contains (target, it) {        return target.lastIndexOf(it) != -1; //indexOf改成search, lastIndexOf也可以    }

在mootools版中,我们看到它支持更多的参数,目的是判定一个元素的className是否包含某个特定的class。众所周知,元素可以添加多个class,中间以空格隔开,使用mootoos的contains就很方便检测包含关系了。

    function contains (target, str, separator) {        return separator ? ( separator + target + separator).indexOf(separator + str +separator) > -1 : target.indexOf(str) > -1;    }

repeat方法: 将一个字符串重复n次,如repeat("ruby",2)得到rubyruby

版本1:利用空数组的join方法

    function repeat (target, n) {        return (new Array(n + 1)).join(target);    }

版本2.....6...

版本7,递归在浏览器下做了优化 ,包括ie6,属于最好的实现方式之一

    function repeat (target, n) {        if (n == 1){            return target        }        var s = repeat(target, Math.floor(n/2));        s += s;        if (n % 2) {            s += target;        }        return s;    }

byteLen方法:取得一个字符串所有字节的长度。这是一个后端转过来的方法。在前端,我们要用户填写文本,需要字节有限制。

版本1:假设字符每个字符Unicode编码小于等于255,byteLength为字符串长度。再遍历字符串,遇到unicode编码大于255时,为byteLength加1

function byteLen (target) {        var byteLength = target.length,             i = 0;        for ( ; i < target.length ; i++) {            if (target.charCodeAt(i) > 255) {                byteLength++;            }        }        return byteLength;    }

truncate方法,用于对字符串进行截断处理,当超过限定长度,默认添加三个点号等

    function truncate (target, length , truncation) {        length = length || 30;        truncation = truncation === void(0) ? '...' : truncation;        return target.length > length ? target.slice(0, length - truncation.length) + truncation : String(target);    }

camelize方法,转换为驼峰命名风格

    function camelize (target) {        if (target.indexOf('_') < 0 && target.indexOf('_') < 0) {            return target; //提前判断,提高响应效率        }        return target.replace(/[-_][^-_]/g , function(match){            return match.charCodeAt(1).toUpperCase();        })    }

underscored方法。转换为下划线风格

function underscored(target){        return target.replace(/([a-z/d])([A-Z])/g , '$1_$2').replace(//-/g , '_').toLowerCase();    }

dasherize方法,转换为连字符风格,亦指CSS变量风格(承上面的方法)

    function dasherize(target){        return underscored(target).replace(/_/g, '-');    }

capitalize方法,首字母大写

    function capitalize(target) {        return target.charAt(0).toUpperCase() + target.substring(1).toLowerCase();    }

stripTags方法,移除字符中的html标签。但有一个缺陷,如果其中有script标签,会把不该显示的脚本也显示出来。

    function stripTags(target){        return String(target || "") .replace(/<[^>]+>/g, '');    }

escapeHTML和unescapeHTML略

escapeRegExp方法:将字符串安全格式转换为正则表达式的源码

    function escapeRegExp(target){        return target.replace(/([-.*+?^${}()|[/]////])/g, '//$1');    }

pad方法,与trim方法相反,pad可以为字符串的某一端添加字符串。常见的是在日历的月份前面加补0,因此,被称为fillZero

    function pad(target,n){        var zero = new Array(n).join('0');        var str = zero + target;        var resulet = str.substr(-n);        return resulet;    }

高级方法,也是mass Framework使用的版本,支持更多的参数。允许从左边或从右填充。以及使用什么内容进行填充。

    function pad (target, n, filling, right, radix){        var num = target.toString(radix || 10);        filling = filling || "0";        while (num.length < n){            if(!right){                num = filling + num;            } else {                num += filling;            }            return num;        }    }

wbr方法,为目标字符串添加wbr换行。不过需要注意的是,它不是为每个字符串都插入<wbr>字样,而是相当于在组成文本节点的报语法中的每个字符后插入<wbr>字样。如果是aa<span>bb</span>cc,返回a<wbr>a<span>b<wbr>b</span>c<wbr>c<wbr>,在opear浏览器上,默认的css不会添加上wbr样式,需要在css上添加,wbr:after{content:"/00200B"}解决此问题

    function wbr (target){        return String(target).replace(/(?:<[^>]+>) | (?:&#?[0-9a-z]{2,6};) | (.{1})/gi,'$&<wbr>').replace(/><wbr>/g,'>');    }

format方法,在c语言中,有一个printf方法,我们可以在后面添加不同的类型的参数嵌入到将要输出的字符串中。这是非常有用的方法,因为在javascript中涉及到大量这样字符串拼接的工作 ,如果涉及逻辑,我们可以用模板,如果轻量点,我们可以用这个方法。

在不同的框架中名字不同,prototype.js 叫interpolate,Base2叫format,mootools叫substitute

    function format (str, object){        var array = Array.prototype.slice.call(arguments, 1);        return str.replace(///?/#{([^{}]+)/}/gm,function(match, name) {            if(match.charAt(0) == '//')                return match.slice(1);            var index = Number(name)            if(index >= 0)                return array[index];            if (object && object[name] !== void 0)                return object[name];            return '';        });    }    var a = format("resulet is #{0}, #{1}",22,33)    console.log(a) // resulet is 22, 33    var b = format ( "#{name} is a #{sex} #{am}" ,{        name:"wangjie",        sex:"man",        am:"111"    });    console.log(b) // wangjie is a man 111

它支持两种传参方法,如果字符串的占位符为0,1,2这样的非零整数,要求传入两个或以上的参数,否则就传入一个对象,键名为占位符。

quote方法,在字符串的两端加上双引号。然后内部需要转义的地方都要转义。用于接装JSON的键名或模析系统中

    //code.google.com/jQuery-json    var escapeable = /["///x00-/x1f/x7f-/x9f]/g,                    meta = {                        '/b':'//b',                        '/t':'//t',                        '/n':'//n',                        '/f':'//f',                        '/r':'//r',                        '"':'//"',                        '//':'////'                    };    function quote(target){        if (target.match(escapeable)){            return '"' + target.replace(escapeable,function(a) {                var c = meta[a];                if(typeof c === 'string') {
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表