JS编程建议——35:获取字节长度

建议35:获取字节长度
String对象的length属性能够返回字符串的长度,不管字符是单字节,还是双字节,都作为一个来计算。因此,要获取字符串的字节长度,必须通过手工计算获取,这里介绍两种方法。
1)第一种方法是利用循环结构枚举每个字符,并根据字符的字符编码,判断当前字符是单字节还是双字节,然后递加字符串的字节数。

  1. String.prototype.lengthB = function( ){
  2. var b = 0, l = this.length;
  3. if( l ){
  4. for( var i = 0; i < l; i ++ ){
  5. if(this.charCodeAt( i ) > 255 ){
  6. b += 2;
  7. }else{
  8. b ++ ;
  9. }
  10. }
  11. return b;
  12. }else{
  13. return 0;
  14. }
  15. }
  16. var s = "String对象长度";
  17. alert(s.lengthB()); // 14
    在检测字符是否为双字节或单字节时,方法也有多种,这里提供两种思路(代码如下):
  18. for( var i = 0; i < l; i ++ ){
  19. var c = this.charAt( i );
  20. if ( escape( c ).length > 4 ) {
  21. b += 2;
  22. }else if( c != "r" ) {
  23. b ++ ;
  24. }
  25. }
    或者使用正则表达式进行字符编码验证:
  26. for( var i = 0; i < l; i ++ ){
  27. var c = this.charAt( i );
  28. if ( /^[u0000-u00ff]$/.test(c) ) {
  29. b ++ ;
  30. }else {
  31. b += 2;
  32. }
  33. }
    2)第二种方法是利用正则表达式把字符串中双字节字符临时替换为两个字符,然后调用length属性获取临时字符串的长度。
  34. String.prototype.lengthB = function(){
  35. var s = this.replace( /1/g, "**" );
  36. return s.length;
  37. }
    这种方法比较简洁,但执行速度相对较慢,因为需要两次遍历字符串,即调用replace()方法时一次,使用length属性时一次。而第一种方法只进行一次字符串遍历。

提示:String对象的length属性是只读属性,这与Array的length属性不同。不过,与数组相同,字符串可以使用下标来定位单个字符在字符串中的位置,其中第一个字符的下标值为0,最后一个字符的下标值为length–1。字符串中的字符是不能够被for in循环枚举的。运算符delete也不能删除字符串中指定位置的字符。


  1. x00-xff
时间: 2024-10-13 10:36:29

JS编程建议——35:获取字节长度的相关文章

js substring从右边获取指定长度字符串

 本篇文章主要是对js substring从右边获取指定长度字符串的示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 如下所示: 代码如下:  /*       Get the rightmost substring, of the specified length,       from a String object.    */     String.prototype.right = function (length_)     {             var _fr

JS编程建议——51:理解数组长度的有限性和无限性

建议51:理解数组长度的有限性和无限性每个数组都有一个length属性.和大多数其他语言不同,JavaScript数组的length是没有上限的.如果用大于或等于当前length的数字作为下标来保存一个元素,那么length将增大以容纳新元素,不会发生数组边界错误.length属性的值是这个数组的最大整数属性名加上1.它不一定等于数组中属性的个数.例如,下面数组myArray最后长度为10001,但它仅包含一个元素:var myArray = [];myArray.length // 0myAr

JS编程建议——36:警惕字符串连接操作(2)

建议36:警惕字符串连接操作(2)先将两个小字符串合并起来,然后将结果返回给大字符串.创建中间字符串s1 + s2与两次复制大字符串相比,对性能的"冲击"要轻得多.(2)编译期合并在赋值表达式中所有字符串连接都属于编译期常量,Firefox自动地在编译过程中合并它们.在以下这个方法中可看到这一过程: function foldingDemo() { var str = "compile" + "time" + "folding"

JS编程建议——55:不要拘泥于数字下标

建议55:不要拘泥于数字下标数组下标默认为大于或等于0的整数,不过JavaScript允许数组下标可以为任意表达式,甚至为任意类型数据.(1)文本下标为数组下标指定负值:var a = []; // 定义空数组直接量a[-1] = 1; // 为下标为-1的元素赋值很显然,上面的用法是非法的,因为这不符合语法规范.使用length属性检测,返回值为0,说明数组并没有增加长度,这是正确的,也很正常.但是,使用下面的方法可以读取该元素的值:alert(a.length); // 0,说明数组长度没有

JS编程建议——48:慎用正则表达式修剪字符串

建议48:慎用正则表达式修剪字符串(1)使用两个子表达式修剪字符串去除字符串首尾的空格是一个简单而常见的任务,但到目前为止JavaScript 还没有实现它.正则表达式允许用很少的代码实现一个修剪函数,最好的全面解决方案可能是使用两个子表达式:一个用于去除头部空格,另一个用于去除尾部空格.这样处理简单而快速,特别是处理长字符串时.if(!String.prototype.trim) { String.prototype.trim = function() { return this.replac

JS编程建议——1:警惕Unicode乱码

建议1:警惕Unicode乱码ECMA标准规定JavaScript语言基于Unicode标准进行开发,JavaScript内核完全采用UCS字符集进行编写,因此在JavaScript代码中每个字符都使用两个字节来表示,这意味着可以使用中文来命名变量或函数名.虽然ECMAScript v3标准允许Unicode字符出现在JavaScript程序的任何地方,但是在v1和v2中,ECMA标准只允许Unicode字符出现在注释或引号包含的字符串直接量中,在其他地方必须使用ASCII字符集,在ECMASc

JS编程建议——3:减少全局变量污染

建议3:减少全局变量污染定义全局变量有3种方式:在任何函数外面直接执行var语句. var f = 'value'; 直接添加一个属性到全局对象上.全局对象是所有全局变量的容器.在Web浏览器中,全局对象名为window. window.f = 'value'; 直接使用未经声明的变量,以这种方式定义的全局变量被称为隐式的全局变量. f = 'value'; 为方便初学者在使用前无须声明变量而有意设计了隐式的全局变量,然而不幸的是忘记声明变量成了一个非常普遍的现象.JavaScript的策略是让

JS编程建议——4:注意JavaScript数据类型的特殊性(3)

建议4:注意JavaScript数据类型的特殊性(3)其中,object表示对象的通用类型,class表示对象的内部类型,内部类型的名称与该对象的构造函数名对应.例如,Array对象的class为"Array",Function对象的class为"Function",Date对象的class为"Date",内部Math对象的class为"Math",所有Error对象(包括各种Error子类的实例)的class为"E

JS编程建议——6:正确处理JavaScript特殊值(1)

建议6:正确处理JavaScript特殊值(1)1.正确使用NaN和InfinityNaN是IEEE 754中定义的一个特殊的数量值.它不表示一个数字,尽管下面的表达式返回的是true. typeof NaN === 'number' // true 该值可能会在试图将非数字形式的字符串转换为数字时产生,例如: '0' // 0 'oops' // NaN 如果NaN是数学运算中的一个运算数,那么它与其他运算数的运算结果就会是NaN.如果有一个表达式产生出NaN的结果,那么至少其中一个运算数是N