js去除空格12種方法

来源:https://www.cnblogs.com/jiangdd/archive/2019/12/10/12017523.html
-Advertisement-
Play Games

註:本文非本人原著;原文作者: 黃卉 《js去除空格12種方法》 ...


註:本文非本人原著;原文作者: 黃卉  《js去除空格12種方法

//JS去除空格的方法目前共有12種:
//實現1
 String.prototype.trim = function() {
   return this.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
 }
//看起來不怎麼樣, 動用了兩次正則替換,實際速度非常驚人,主要得益於瀏覽器的內部優化。一個著名的例子字元串拼接,直接相加比用Array做成的StringBuffer 還快。base2類庫使用這種實現。
// 實現2
 String.prototype.trim = function() {
   return this.replace(/^\s+/, '').replace(/\s+$/, '');
 }
//和實現1 很相似,但稍慢一點,主要原因是它最先是假設至少存在一個空白符。Prototype.js使用這種實現,過其名字為strip,因為 Prototype的方法都是力求與Ruby同名。
 實現3
 String.prototype.trim = function() {
   return  this.substring(Math.max(this.search(/\S/), 0),this.search(/\S\s*$/) + 1);
 }
//以截取方式取得空白部分(當然允許中間存在空白符),總共 調用了四個原生方法。設計得非常巧妙,substring以兩個數字作為參數。Math.max以兩個數字作參數,search則返回一個數字。速度比上 面兩個慢一點,但比下麵大多數都快。
// 實現4
 String.prototype.trim = function() {
   return  this.replace(/^\s+|\s+$/g, '');
 }
//這個可以稱得上實現2的簡化版,就是 利用候選操作符連接兩個正則。但這樣做就失去了瀏覽器優化的機會,比不上實現3。由於看來很優雅,許多類庫都使用它,如JQuery與mootools
//實現5
 String.prototype.trim = function() {
   var str = this;
   str = str.match(/\S+(?:\s+\S+)*/);
   return str ? str[0] : '';
 }
// match 是返回一個數組,因此原字元串符合要求的部分就成為它的元素。為了防止字元串中間的空白符被排除,我們需要動用到非捕獲性分組(?:exp)。由於數組可 能為空,我們在後面還要做進一步的判定。好像瀏覽器在處理分組上比較無力,一個字慢。所以不要迷信正則,雖然它基本上是萬能的。
// 實現6
 String.prototype.trim = function() {
   return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, '$1');
 }
//把符合要求的部分提供出來,放到一個空字元串中。不過效率很差,尤其是在IE6中。
// 實現7
 String.prototype.trim = function() {
   return this.replace(/^\s*(\S*(?:\s+\S+)*)\s*$/, '$1');
 }
//和實現6很相似,但用了非捕獲分組進行了優點,性能效之有一點點提升。

//實現8
 String.prototype.trim = function() {
   return this.replace(/^\s*((?:[\S\s]*\S)?)\s*$/, '$1');
 }
//沿著上面兩個的思路進行改進,動用了非捕獲分組與字元集合,用?頂替了*,效果非常驚人。尤其在IE6中,可 以用瘋狂來形容這次性能的提升,直接秒殺火狐。
// 實現9
 String.prototype.trim = function() {
   return this.replace(/^\s*([\S\s]*?)\s*$/, '$1');
 }
//這次是用懶惰匹配 頂替非捕獲分組,在火狐中得到改善,IE沒有上次那麼瘋狂。
 實現10
 String.prototype.trim = function() {
   var str = this,
   whitespace = ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000';
   for (var i = 0,len = str.length; i < len; i++) {
     if (whitespace.indexOf(str.charAt(i)) === -1) {
       str = str.substring(i);
       break;
     }
   }
   for (i = str.length - 1; i >= 0; i--) {
     if (whitespace.indexOf(str.charAt(i)) === -1) {
       str = str.substring(0, i + 1);
       break;
     }
   }
  return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
 }
//我 只想說,搞出這個的人已經不是用牛來形容,已是神一樣的級別。它先是把可能的空白符全部列出來,在第一次遍歷中砍掉前面的空白,第二次砍掉後面的空白。全 過程只用了indexOf與substring這個專門為處理字元串而生的原生方法,沒有使用到正則。速度快得驚人,估計直逼上內部的二進位實現,並且在 IE與火狐(其他瀏覽器當然也毫無疑問)都有良好的表現。速度都是零毫秒級別的。
// 實現11
String.prototype.trim = function() {
   var str = this,
   str = str.replace(/^\s+/, '');
   for (var i = str.length - 1; i >= 0; i--) {
     if (/\S/.test(str.charAt(i))) {
       str = str.substring(0, i + 1);
       break;
     }
   }
   return str;
 }
//實現10已經告訴我們普通的原生字元串截取方法是遠勝於正則替換,雖然是複雜一點。但只要正則 不過於複雜,我們就可以利用瀏覽器對正則的優化,改善程式執行效率,如實現8在IE的表現。我想通常不會有人在項目中應用實現10,因為那個 whitespace 實現太長太難記了(當然如果你在打造一個類庫,它絕對是首先)。實現11可謂其改進版,前面部分的空白由正則替換負責砍掉,後面用原生方法處理,效果不遜 於原版,但速度都是非常逆天。
// 實現12
 String.prototype.trim = function() {
   var str = this,
   str = str.replace(/^\s\s*/, ''),
   ws = /\s/,
   i = str.length;
   while (ws.test(str.charAt(--i)));
   return str.slice(0, i + 1);
 }
//實現10與實現11在寫法上更好的改進版,註意說的不是性能速 度,而是易記與使用上。和它的兩個前輩都是零毫秒級別的,以後就用這個來工作與嚇人。

  

//1:去字元串前後空格:changeThing.replace(/(^\s*)|(\s*$)/g,'')
//2:
function  trm(e){
      return e.replace( /^\s+/, "" ).replace( /\s+$/, "" ); //js去掉全換空格
     }
//  調用:
 var  causeCheckNopass=trm(mini.get("m_zjhms").getValue());


==================================================================================================

//1、  去掉字元串前後所有空格:
//代碼如下:
         function Trim(str)
         {   16              return str.replace(/(^\s*)|(\s*$)/g, "");   17      }
//    說明:
//    如果使用jQuery直接使用$.trim(str)方法即可,str表示要去掉前後所有空格的字元串。
   21 //2、 去掉字元串中所有空格(包括中間空格,需要設置第2個參數為:g)
//代碼如下:
        function Trim(str,is_global)
        {
            var result;
            result = str.replace(/(^\s+)|(\s+$)/g,"");
            if(is_global.toLowerCase()=="g")
            {
                result = result.replace(/\s/g,"");
             }
            return result;
}

==================================================================================================

//js去掉字元串前後空格的五種方法2012-04-02 

[javascript]
//供使用者調用  
function trim(s){    41 return trimRight(trimLeft(s));    42 }    43 //去掉左邊的空白  
function trimLeft(s){    45 if(s == null) {    46 return "";    47 }    48 var whitespace = new String(" \t\n\r");    49 var str = new String(s);    50 if (whitespace.indexOf(str.charAt(0)) != -1) {    51 var j=0, i = str.length;    52 while (j < i && whitespace.indexOf(str.charAt(j)) != -1){    53 j++;    54 }    55 str = str.substring(j, i);    56 }    57 return str;    58 }    59 //去掉右邊的空白 www.2cto.com   
function trimRight(s){    61 if(s == null) return "";    62 var whitespace = new String(" \t\n\r");    63 var str = new String(s);    64 if (whitespace.indexOf(str.charAt(str.length-1)) != -1){    65 var i = str.length - 1;    66 while (i >= 0 && whitespace.indexOf(str.charAt(i)) != -1){    67 i--;    68 }    69 str = str.substring(0, i+1);    70 }    71 return str;    72 }   73 第二種:正則替換
[javascript]
<SCRIPT LANGUAGE="JavaScript">    76 <!--    77 String.prototype.Trim = function()    78 {    79 return this.replace(/(^\s*)|(\s*$)/g, "");    80 }    81 String.prototype.LTrim = function()    82 {    83 return this.replace(/(^\s*)/g, "");    84 }    85 String.prototype.RTrim = function()    86 {    87 return this.replace(/(\s*$)/g, "");    88 }    89 //-->  
</SCRIPT>   91 第三種:使用jquery
[javascript]
$.trim(str)   94 jquery內部實現為:
[javascript]
function trim(str){     97     return str.replace(/^(\s|\u00A0)+/,'').replace(/(\s|\u00A0)+$/,'');     98 }     99 第四種:使用motools
[javascript]
function trim(str){    102     return str.replace(/^(\s|\xA0)+|(\s|\xA0)+$/g, '');    103 }   104 第五種:裁剪字元串方式
[javascript]
function trim(str){    107     str = str.replace(/^(\s|\u00A0)+/,'');    108     for(var i=str.length-1; i>=0; i--){    109         if(/\S/.test(str.charAt(i))){    110             str = str.substring(0, i+1);    111             break;    112         }    113     }    114     return str;    115 }  116 }

==================================================================================================

判斷空:
 Object.prototype.toString。對於不同類型的數據,這個方法可以返回 '[object Object]'、'[object Array]'、'[object String]' 這樣的字元串,非常方便判斷。需要註意的是,在 IE8 及其以下瀏覽器中,這個方法對於null、undefined、window 等都會返回 '[object Object]',不過還好,這並不影響我們使用它判斷空對象

var isEmptyValue = function(value) {
            var type;
            if(value == null) { // 等同於 value === undefined || value === null
                return true;
            }
            type = Object.prototype.toString.call(value).slice(8, -1);
            switch(type) {
            case 'String':
                return !$.trim(value);
            case 'Array':
                return !value.length;
            case 'Object':
                return $.isEmptyObject(value); // 普通對象使用 for...in 判斷,有 key 即為 false
            default:
                return false; // 其他對象均視作非空
            }
        };

為何不用其他方法,因為下麵的寫法考慮了各種相容性。
判斷是否為數組
isArray = function (source) {
    return '[object Array]' == Object.prototype.toString.call(source);
};
判斷是否為日期對象
isDate = function(o) {
    // return o instanceof Date;
    return {}.toString.call(o) === "[object Date]" && o.toString() !== 'Invalid Date' && !isNaN(o);
};
判斷是否為Element對象
isElement = function (source) {
    return !!(source && source.nodeName && source.nodeType == 1);
};
判斷目標參數是否為function或Function實例
isFunction = function (source) {
    // chrome下,'function' == typeof /a/ 為true.
    return '[object Function]' == Object.prototype.toString.call(source);
};
判斷目標參數是否number類型或Number對象
isNumber = function (source) {
    return '[object Number]' == Object.prototype.toString.call(source) && isFinite(source);
};
 判斷目標參數是否為Object對象
isObject = function (source) {
    return 'function' == typeof source || !!(source && 'object' == typeof source);
};
判斷目標參數是否string類型或String對象
isString = function (source) {
    return '[object String]' == Object.prototype.toString.call(source);
};
判斷目標參數是否Boolean對象
isBoolean = function(o) {
    return typeof o === 'boolean';
};


1、  去掉字元串前後所有空格:
代碼如下:
         function Trim(str)
         {  182              return str.replace(/(^\s*)|(\s*$)/g, "");  183      }
    說明:
    如果使用jQuery直接使用$.trim(str)方法即可,str表示要去掉前後所有空格的字元串。
  187 2、 去掉字元串中所有空格(包括中間空格,需要設置第2個參數為:g)
代碼如下:
        function Trim(str,is_global)
        {
            var result;
            result = str.replace(/(^\s+)|(\s+$)/g,"");
            if(is_global.toLowerCase()=="g")
            {
                result = result.replace(/\s/g,"");
             }
            return result;
}

==================================================================================================
js去除輸入框中所有的空格和禁止輸入空格的方法
<span style="font-family: Arial, Helvetica, sans-serif;">
      <input type="password" name="password" id="password" onkeydown="return banInputSapce(event);" onKeyup="return inputSapceTrim(event,this);" />
</span>  205 
/**  207 * 是否去除所有空格  208 * @param str  209 * @param is_global 如果為g或者G去除所有的  210 * @returns  211 */  212 function Trim(str,is_global)  213 {  214 var result;  215 result = str.replace(/(^\s+)|(\s+$)/g,"");  216 if(is_global.toLowerCase()=="g")  217 {  218 result = result.replace(/\s/g,"");  219 }  220 return result;  221 }  222 
/**  224 * 空格輸入去除  225 * @param e  226 * @returns {Boolean}  227 */  228 function inputSapceTrim(e,this_temp)  229 {  230 this_temp.value = Trim(this_temp.value,"g");  231 var keynum;  232 if(window.event) // IE 
{  234 keynum = e.keyCode  235 }  236 else if(e.which) // Netscape/Firefox/Opera 
{  238 keynum = e.which  239 }  240 if(keynum == 32){  241 return false;  242 }  243 return true;  244 }  245 /**  246 * 禁止空格輸入  247 * @param e  248 * @returns {Boolean}  249 */  250 function banInputSapce(e)  251 {  252 var keynum;  253 if(window.event) // IE 
{  255 keynum = e.keyCode  256 }  257 else if(e.which) // Netscape/Firefox/Opera 
{  259 keynum = e.which  260 }  261 if(keynum == 32){  262 return false;  263 }  264 return true;  265 }  266

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在Vue開發中,模板內的表達式非常便利,但是設計它們的初衷是用於簡單運算的。在模板中放入太多的邏輯會讓模板過重且難以維護。當你想要在模板中多次引用相同表達式時,就會更加難以處理。所以,對於任何複雜邏輯,你都應當使用計算屬性。本文主要講解Vue中的計算屬性和偵聽器,僅供學習分享使用,如有不足之前,還請... ...
  • 一、今天完成了網易郵箱註冊界面的全部編寫,編寫一個小小的網頁就需要這麼多時間來進行設計、測量、排版、編寫、測試,才能進行使用,同時編寫這個網頁複習了幾乎前面的所有內容,最後來一個彙總就可以了。 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
  • 如果是li浮動導致ul沒有寬度,給ul手動設置一個寬度或者給div一個overflow:hidden; ...
  • ``` Practice 請註冊 立即登錄> 請登錄 立即註冊> 七天內自動登錄 忘記密碼? ``` ![](https://img2018.cnblogs.com/blog/821307/201912/821307-20191210153842909-1130015050.png) ...
  • 解決z-index上層元素遮擋下層元素點擊事件問題 by:授客 QQ:1033553122 開發環境 Win 10 element-ui "2.8.2" Vue 2.9.6 需求描述 如下,有以下界面,其中右側邊時一個ElementUI Dialog模態對話框,希望在對話框上執行點擊操作時,不會點擊 ...
  • 基於HTML5 canvas 獲取文本占用的像素寬度 by:授客 QQ:1033553122 直接上代碼 // 獲取單行文本的像素寬度 getTextPixelWith(text, fontStyle) { var canvas = document.createElement("canvas"); ...
  • 引言 在開發中台過程中 我們的原型中有很多表單,antd有表單組件,但是粒度比較細,就單純組件而言,無可厚非,但是在開發過程中,可能會造成代碼不夠聚合,有些表單公共邏輯無法提取,copy paste比較多,所以可以加以封裝,搞一個相容性和擴展性都契合項目本身的組件。 主要思路 我簡單查閱了一番資料, ...
  • 1:利用DOM獲取該 div 的 ID,然後清空該DIV的內容(如果你需要接著裡面的內容添加可不要清空);需要註意點是清空最好用“ empty() ”; 2: 把 async設成true ,否則又一條警告的錯誤,這條錯誤導致你的內容顯示不出來;下麵就是警告的錯誤 3:就是添加HTML了。 具體代碼如 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...