js去除空格12種方法

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

註:本文非本人原著;原文作者: 黃卉 《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

 


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

更多相關文章
  • 在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了。 具體代碼如 ...
一周排行
  • " 返回《C 併發編程》" "1. 概念介紹" "2. 非同步編程" "2.1. async運行過程" "2.2. async運行中同步上下文簡介" "2.3. 創建Task實例" "2.4. 捕獲非同步異常類型" "3. 並行編程" "3.1. Parallel" "3.2. 異常處理" "3.3. ...
  • 我們先看看兩個特效,感受一下,有沒有學習的動力? 核心API:Texture2D.SetPixel(int x, int y, Color color),Texture2D.Apply() 實現原理:對象池 思路: 第一幀繪製前:遍歷瓦片上所有活著的粒子對象並且進行數據操作(或運動,死亡),發生運動 ...
  • 原來的導出方式比較適用於比較簡單的導出,每一條數據在一行,數據列雖然自定義程度比較高,如果要一條數據對應多行就做不到了,於是就想支持根據模板導出,在 1.8.0 版本中引入了根據模板導出的功能 ...
  • 創建一個bat腳本, 裡面寫上: reg delete HKEY_CURRENT_USER\Software\JetBrains\dotMemory /freg delete HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Ex ...
  • Linux下有vsyscall來優化一些例如time(NULL), gettimeofday這種調用的消耗; 但是Windows下, 沒有類似的東西, 但是思路還是有的 1. 程式啟動的時候, 獲取一下準確的時間戳 2. 然後每次需要獲取時間的時候, 獲取一下流逝的時間, 可以通過獲取CPU的tic ...
  • 當用戶按下鍵盤上的一個鍵時,就會發生一系列事件。下表根據他們的發生順序列出了這些事件: 表 所有元素的鍵盤事件(按順序) 鍵盤處理永遠不會像上面看到的這麼簡單。一些控制項可能會掛起這些事件中的某些事件,從而可執行自己更特殊的鍵盤處理。最明顯的例子是TextBox控制項,它掛起了TextInput事件。對 ...
  • static void LocalMethod() { Cube(100); void Cube(int x) => Console.WriteLine($"The cube of {x} is {x * x * x}"); } static void GoToDemo() { int i = 1; ...
  • 滑鼠事件執行幾個關聯的任務。當滑鼠移到某個元素上時,可通過最基本的滑鼠事件進行響應。這些事件是MouseEnter(當滑鼠指針移到元素上時引發該事件)和MouseLeave(當滑鼠指針離開元素時引發該事件)。這兩個事件都是直接事件,這意味著他們不使用冒泡和隧道過程,而是源自一個元素並且只被該元素引發 ...
  • 反射這個詞聽起來就很牛逼是吧? 嗯的確,反射是比較高級的特性,只有語言基礎很扎實的Dev們才應該使用它。 搞點反射,可以提高程式的靈活性、可擴展性、耦合度。 反射這東西,是為了動態地運行時載入,相比於靜態代碼。編譯的時候就是板上釘釘了。 就是說,如果你的程式需要在運行時搞一些晚綁定,動態載入或檢查對 ...
  • 眾所周知,微服務架構是由一眾微服務組成,項目中調用其他微服務介面更是常見的操作。為了便於調用外部介面,我們的常用思路一般都是封裝一個外部介面的客戶端,使用時候直接調用相應的方法。webservice或WCF的做法就是引用服務,自動生成客戶端。在webapi2.0里,我們都會手動封裝一個靜態類。那麼在 ...
x