精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

《JavaScript 闖關記》之基本包裝類型

開發 前端
為了便于操作基本類型值,JavaScript 還提供了3個特殊的引用類型:Boolean、Number 和 String。實際上,每當讀取一個基本類型值的時候,后臺就會創建一個對應的基本包裝類型的對象,從而讓我們能夠調用一些方法來操作這些數據。

[[174787]]

為了便于操作基本類型值,JavaScript 還提供了3個特殊的引用類型:Boolean、Number 和 String。實際上,每當讀取一個基本類型值的時候,后臺就會創建一個對應的基本包裝類型的對象,從而讓我們能夠調用一些方法來操作這些數據。來看下面的例子。

  1. var s1 = "some text"
  2.  
  3. var s2 = s1.substring(2);  

這個例子中的變量 s1 包含一個字符串,字符串當然是基本類型值。而下一行調用了 s1 的 substring() 方法,并將返回的結果保存在了 s2 中。我們知道,基本類型值不是對象,因而從邏輯上講它們不應該有方法(盡管如我們所愿,它們確實有方法)。其實,為了讓我們實現這種直觀的操作,后臺已經自動完成了一系列的處理。當第二行代碼訪問 s1 時,訪問過程處于一種讀取模式,也就是要從內存中讀取這個字符串的值。而在讀取模式中訪問字符串時,后臺都會自動完成下列處理。

  1. 創建 String 類型的一個實例;
  2. 在實例上調用指定的方法;
  3. 銷毀這個實例。

可以將以上三個步驟想象成是執行了下列 JavaScript 代碼。

  1. var s1 = new String("some text"); 
  2.  
  3. var s2 = s1.substring(2); 
  4.  
  5. s1 = null 

經過此番處理,基本的字符串值就變得跟對象一樣了。而且,上面這三個步驟也分別適用于 Boolean 和 Number 類型對應的布爾值和數字值。

引用類型與基本包裝類型的主要區別就是對象的生存期。使用 new 操作符創建的引用類型的實例,在執行流離開當前作用域之前都一直保存在內存中。而自動創建的基本包裝類型的對象,則只存在于一行代碼的執行瞬間,然后立即被銷毀。這意味著我們不能在運行時為基本類型值添加屬性和方法。來看下面的例子:

  1. var s1 = "some text"
  2.  
  3. s1.color = "red"
  4.  
  5. console.log(s1.color); // undefined  

當然,可以顯式地調用 Boolean、Number 和 String 來創建基本包裝類型的對象。不過,應該在絕對必要的情況下再這樣做,因為這種做法很容易讓人分不清自己是在處理「基本類型」還是「引用類型」的值。對基本包裝類型的實例調用 typeof 會返回"object",而且所有基本包裝類型的對象都會被轉換為布爾值 true。

Object 構造函數也會像工廠方法一樣,根據傳入值的類型返回相應基本包裝類型的實例。例如:

  1. var obj = new Object("some text"); 
  2.  
  3. console.log(obj instanceof String); // true  

把字符串傳給 Object 構造函數,就會創建 String 的實例;而傳入數值參數會得到 Number 的實例,傳入布爾值參數就會得到Boolean 的實例。

要注意的是,使用 new 調用基本包裝類型的構造函數,與直接調用同名的轉型函數是不一樣的。 例如:

  1. var value = "25"
  2.  
  3. var number = Number(value); // 轉型函數 
  4.  
  5. console.log(typeof number); // "number" 
  6.  
  7. var obj = new Number(value); // 構造函數 
  8.  
  9. console.log(typeof obj); // "object"  

盡管我們不建議顯式地創建基本包裝類型的對象,但它們操作基本類型值的能力還是相當重要的。而每個基本包裝類型都提供了操作相應值的便捷方法。

Boolean 類型

Boolean 類型是與布爾值對應的引用類型。要創建 Boolean 對象,可以像下面這樣調用 Boolean 構造函數并傳入 true 或 false值。

  1. var booleanObject = new Boolean(true); 

Boolean 類型的實例重寫了 valueOf() 方法,返回基本類型值 true 或 false;重寫了 toString() 方法,返回字符串 "true" 和"false"。可是,Boolean 對象在 JavaScript 中的用處不大,因為它經常會造成人們的誤解。其中最常見的問題就是在布爾表達式中使用 Boolean 對象,例如:

  1. var falseObject = new Boolean(false); 
  2.  
  3. var result = falseObject && true
  4.  
  5. console.log(result); // true 
  6.  
  7. var falseValue = false
  8.  
  9. result = falseValue && true
  10.  
  11. console.log(result); // false  

在這個例子中,我們使用 false 值創建了一個 Boolean 對象。然后,將這個對象與基本類型值 true 構成了邏輯與表達式。在布爾運算中,false && true 等于 false。可是,示例中的這行代碼是對 falseObject 而不是對它的值 false 進行求值。布爾表達式中的所有對象都會被轉換為 true,因此 falseObject 對象在布爾表達式中代表的是 true。結果,true && true 當然就等于true 了。

基本類型與引用類型的布爾值還有兩個區別。首先,typeof 操作符對基本類型返回 "boolean",而對引用類型返回 "object"。其次,由于 Boolean 對象是 Boolean 類型的實例,所以使用 instanceof 操作符測試 Boolean 對象會返回 true,而測試基本類型的布爾值則返回 false。例如:

  1. console.log(typeof falseObject); // object 
  2.  
  3. console.log(typeof falseValue); // boolean 
  4.  
  5. console.log(falseObject instanceof Boolean); // true 
  6.  
  7. console.log(falseValue instanceof Boolean); // false  

理解基本類型的布爾值與 Boolean 對象之間的區別非常重要,我們的建議是永遠不要使用 Boolean 對象。

Number 類型

Number 是與數字值對應的引用類型。要創建 Number 對象,可以在調用 Number 構造函數時向其中傳遞相應的數值。下面是一個例子。

  1. var numberObject = new Number(10); 

與 Boolean 類型一樣,Number 類型也重寫了 valueOf()、toLocaleString() 和 toString() 方法。重寫后的 valueOf() 方法返回對象表示的基本類型的數值,另外兩個方法則返回字符串形式的數值。可以為 toString() 方法傳遞一個表示基數的參數,告訴它返回幾進制數值的字符串形式,如下面的例子所示。

  1. var num = 10; 
  2.  
  3. console.log(num.toString()); // "10" 
  4.  
  5. console.log(num.toString(2)); // "1010" 
  6.  
  7. console.log(num.toString(8)); // "12" 
  8.  
  9. console.log(num.toString(10)); // "10" 
  10.  
  11. console.log(num.toString(16)); // "a"  

除了繼承的方法之外,Number 類型還提供了一些用于將數值格式化為字符串的方法。其中,toFixed() 方法會按照指定的小數位返回數值的字符串表示,例如:

  1. var num = 10; 
  2.  
  3. console.log(num.toFixed(2)); // "10.00"  

這里給 toFixed() 方法傳入了數值 2,意思是顯示幾位小數。于是,這個方法返回了 "10.00",即以 0 填補了必要的小數位。如果數值本身包含的小數位比指定的還多,那么接近指定的***小數位的值就會舍入,如下面的例子所示。

  1. var num = 10.005; 
  2.  
  3. console.log(num.toFixed(2)); // "10.01"  

能夠自動舍入的特性,使得 toFixed() 方法很適合處理貨幣值。

但需要注意的是,不同瀏覽器給這個方法設定的舍入規則可能會有所不同。

在給 toFixed() 傳入0的情況下,IE8 及之前版本不能正確舍入范圍在{(-0.94,-0.5],[0.5,0.94)}之間的值。對于這個范圍內的值,IE8 會返回0,而不是-1或1;其他瀏覽器都能返回正確的值。IE9 修復了這個問題。

toFixed() 方法可以表示帶有0到20個小數位的數值。但這只是標準實現的范圍,有些瀏覽器也可能支持更多位數。

另外可用于格式化數值的方法是 toExponential(),該方法返回以指數表示法(也稱 e 表示法)表示的數值的字符串形式。與toFixed() 一樣,toExponential() 也接收一個參數,而且該參數同樣也是指定輸出結果中的小數位數。看下面的例子。

  1. var num = 10; 
  2.  
  3. console.log(num.toExponential(1)); // "1.0e+1"  

以上代碼輸出了 "1.0e+1";不過,這么小的數值一般不必使用 e 表示法。如果你想得到表示某個數值的最合適的格式,就應該使用toPrecision() 方法。

對于一個數值來說,toPrecision() 方法可能會返回固定大小(fixed)格式,也可能返回指數(exponential)格式;具體規則是看哪種格式最合適。這個方法接收一個參數,即表示數值的所有數字的位數(不包括指數部分)。請看下面的例子。

  1. var num = 99; 
  2.  
  3. console.log(num.toPrecision(1)); // "1e+2" 
  4.  
  5. console.log(num.toPrecision(2)); // "99" 
  6.  
  7. console.log(num.toPrecision(3)); // "99.0"  

以上代碼首先完成的任務是以一位數來表示 99,結果是 "1e+2",即 100。因為一位數無法準確地表示 99,因此 toPrecision()就將它向上舍入為 100,這樣就可以使用一位數來表示它了。而接下來的用兩位數表示 99,當然還是 "99"。***,在想以三位數表示 99 時,toPrecision() 方法返回了 "99.0"。實際上,toPrecision() 會根據要處理的數值決定到底是調用 toFixed() 還是調用 toExponential()。而這三個方法都可以通過向上或向下舍入,做到以最準確的形式來表示帶有正確小數位的值。

toPrecision() 方法可以表現1到21位小數。但這只是標準實現的范圍,有些瀏覽器也可能支持更多位數。

與 Boolean 對象類似,Number 對象也以后臺方式為數值提供了重要的功能。但與此同時,我們仍然不建議直接實例化 Number 類型,而原因與顯式創建 Boolean 對象一樣。具體來講,就是在使用 typeof 和 instanceof 操作符測試基本類型數值與引用類型數值時,得到的結果完全不同,如下面的例子所示。

  1. var numberObject = new Number(10); 
  2.  
  3. var numberValue = 10; 
  4.  
  5. console.log(typeof numberObject); // "object" 
  6.  
  7. console.log(typeof numberValue); // "number" 
  8.  
  9. console.log(numberObject instanceof Number); // true 
  10.  
  11. console.log(numberValue instanceof Number); // false  

String 類型

String 類型是字符串的對象包裝類型,可以像下面這樣使用 String 構造函數來創建。

  1. var stringObject = new String("hello world"); 

String 對象的方法也可以在所有基本的字符串值中訪問到。其中,繼承的 valueOf()、toLocaleString() 和 toString() 方法,都返回對象所表示的基本字符串值。

String 類型的每個實例都有一個 length 屬性,表示字符串中包含多個字符。來看下面的例子。

  1. var stringValue = "hello world"
  2.  
  3. console.log(stringValue.length); // 11  

應該注意的是,即使字符串中包含雙字節字符(不是占一個字節的 ASCII 字符),每個字符也仍然算一個字符。例如:

  1. var stringValue = "大家好"
  2.  
  3. console.log(stringValue.length); // 3  

String 類型提供了很多方法,用于輔助完成對 JavaScript 中字符串的解析和操作。

字符方法

兩個用于訪問字符串中特定字符的方法是:charAt() 和 charCodeAt()。這兩個方法都接收一個參數,即基于0的字符位置。其中,charAt() 方法以單字符字符串的形式返回給定位置的那個字符(JavaScript 中沒有字符類型)。例如:

  1. var stringValue = "hello world"
  2.  
  3. console.log(stringValue.charAt(1)); // "e"  

如果你想得到的不是字符而是字符編碼,那么就要像下面這樣使用 charCodeAt() 了。例如:

  1. var stringValue = "hello world"
  2.  
  3. console.log(stringValue.charCodeAt(1)); // 101,101是小寫字母"e"的字符編碼  

ECMAScript 5 還定義了另一個訪問個別字符的方法。在支持瀏覽器中,可以使用方括號加數字索引來訪問字符串中的特定字符,如下面的例子所示。

  1. var stringValue = "hello world"
  2.  
  3. console.log(stringValue[1]); // "e"  

字符串操作方法

下面介紹與操作字符串有關的幾個方法。***個就是 concat(),用于將一或多個字符串拼接起來,返回拼接得到的新字符串。先來看一個例子。

  1. var stringValue = "hello "
  2.  
  3. var result = stringValue.concat("world"); 
  4.  
  5. console.log(result); // "hello world" 
  6.  
  7. console.log(stringValue); // "hello"  

實際上,concat() 方法可以接受任意多個參數,也就是說可以通過它拼接任意多個字符串。再看一個例子:

  1. var stringValue = "hello "
  2.  
  3. var result = stringValue.concat("world""!"); 
  4.  
  5. console.log(result); // "hello world!" 
  6.  
  7. console.log(stringValue); // "hello"  

雖然 concat() 是專門用來拼接字符串的方法,但實踐中使用更多的還是加號操作符 + 。而且,使用加號操作符 + 在大多數情況下都比使用 concat()方法要簡便易行(特別是在拼接多個字符串的情況下)。

JavaScript 還提供了三個基于子字符串創建新字符串的方法:slice()、substr() 和 substring()。這三個方法都會返回被操作字符串的一個子字符串,而且也都接受一或兩個參數。***個參數指定子字符串的開始位置,第二個參數(在指定的情況下)表示子字符串到哪里結束。具體來說,slice() 和 substring() 的第二個參數指定的是子字符串***一個字符后面的位置。而 substr() 的第二個參數指定的則是返回的字符個數。如果沒有給這些方法傳遞第二個參數,則將字符串的長度作為結束位置。與 concat() 方法一樣,slice()、substr() 和 substring()也不會修改字符串本身的值,它們只是返回一個基本類型的字符串值,對原始字符串沒有任何影響。請看下面的例子。

  1. var stringValue = "hello world"
  2.  
  3. console.log(stringValue.slice(3)); // "lo world" 
  4.  
  5. console.log(stringValue.substring(3)); // "lo world" 
  6.  
  7. console.log(stringValue.substr(3)); // "lo world" 
  8.  
  9. console.log(stringValue.slice(3, 7)); // "lo w" 
  10.  
  11. console.log(stringValue.substring(3,7)); // "lo w" 
  12.  
  13. console.log(stringValue.substr(3, 7)); // "lo worl"  

在傳遞給這些方法的參數是負值的情況下,它們的行為就不盡相同了。其中,slice() 方法會將傳入的負值與字符串的長度相加,substr() 方法將負的***個參數加上字符串的長度,而將負的第二個參數轉換為0。***,substring() 方法會把所有負值參數都轉換為0。下面來看例子。

  1. var stringValue = "hello world"
  2.  
  3. console.log(stringValue.slice(-3)); // "rld" 
  4.  
  5. console.log(stringValue.substring(-3)); // "hello world" 
  6.  
  7. console.log(stringValue.substr(-3)); // "rld" 
  8.  
  9. console.log(stringValue.slice(3, -4)); // "lo w" 
  10.  
  11. console.log(stringValue.substring(3, -4)); // "hel" 
  12.  
  13. console.log(stringValue.substr(3, -4)); //""(空字符串)  

字符串位置方法

有兩個可以從字符串中查找子字符串的方法:indexOf() 和 lastIndexOf()。這兩個方法都是從一個字符串中搜索給定的子字符串,然后返子字符串的位置(如果沒有找到該子字符串,則返回-1)。這兩個方法的區別在于:indexOf() 方法從字符串的開頭向后搜索子字符串,而 lastIndexOf() 方法是從字符串的末尾向前搜索子字符串。還是來看一個例子吧。

  1. var stringValue = "hello world"
  2.  
  3. console.log(stringValue.indexOf("o")); // 4 
  4.  
  5. console.log(stringValue.lastIndexOf("o")); // 7  

這兩個方法都可以接收可選的第二個參數,表示從字符串中的哪個位置開始搜索。換句話說,indexOf()會從該參數指定的位置向后搜索,忽略該位置之前的所有字符;而lastIndexOf()則會從指定的位置向前搜索,忽略該位置之后的所有字符。看下面的例子。

  1. var stringValue = "hello world"
  2.  
  3. console.log(stringValue.indexOf("o", 6)); // 7 
  4.  
  5. console.log(stringValue.lastIndexOf("o", 6)); // 4  

在使用第二個參數的情況下,可以通過循環調用 indexOf() 或 lastIndexOf() 來找到所有匹配的子字符串,如下面的例子所示:

  1. var stringValue = "Lorem ipsum dolor sit amet, consectetur adipisicing elit"
  2. var positions = new Array(); 
  3. var pos = stringValue.indexOf("e"); 
  4.  
  5. while(pos > -1){ 
  6.     positions.push(pos); 
  7.     pos = stringValue.indexOf("e", pos + 1); 
  8. console.log(positions);    // "3,24,32,35,52"  

trim() 方法

ECMAScript 5 為所有字符串定義了 trim() 方法。這個方法會創建一個字符串的副本,刪除前置及后綴的所有空格,然后返回結果。例如:

  1. var stringValue = "   hello world   "
  2. var trimmedStringValue = stringValue.trim(); 
  3. console.log(stringValue);            // "   hello world   " 
  4. console.log(trimmedStringValue);     // "hello world"   

字符串大小寫轉換方法

JavaScript 中涉及字符串大小寫轉換的方法有4個:toLowerCase()、toLocaleLowerCase()、toUpperCase() 和toLocaleUpperCase()。其中,toLowerCase() 和 toUpperCase() 是兩個經典的方法,借鑒自 java.lang.String 中的同名方法。而 toLocaleLowerCase() 和 toLocaleUpperCase() 方法則是針對特定地區的實現。對有些地區來說,針對地區的方法與其通用方法得到的結果相同,但少數語言(如土耳其語)會為 Unicode 大小寫轉換應用特殊的規則,這時候就必須使用針對地區的方法來保證實現正確的轉換。以下是幾個例子。

  1. var stringValue = "hello world"
  2. console.log(stringValue.toLocaleUpperCase());  // "HELLO WORLD" 
  3. console.log(stringValue.toUpperCase());        // "HELLO WORLD" 
  4. console.log(stringValue.toLocaleLowerCase());  // "hello world" 
  5. console.log(stringValue.toLowerCase());        // "hello world"  

一般來說,在不知道自己的代碼將在哪種語言環境中運行的情況下,還是使用針對地區的方法更穩妥一些。

字符串的模式匹配方法

String 類型定義了幾個用于在字符串中匹配模式的方法。***個方法就是 match(),在字符串上調用這個方法,本質上與調用RegExp 的 exec() 方法相同。match() 方法只接受一個參數,要么是一個正則表達式,要么是一個 RegExp 對象。來看下面的例子。

  1. var text = "cat, bat, sat, fat";  
  2. var pattern = /.at/; 
  3.  
  4. // 與pattern.exec(text)相同 
  5. var matches = text.match(pattern); 
  6. console.log(matches.index);               // 0 
  7. console.log(matches[0]);                  // "cat" 
  8. console.log(pattern.lastIndex);           // 0  

另一個用于查找模式的方法是 search()。這個方法的唯一參數與 match() 方法的參數相同:由字符串或 RegExp 對象指定的一個正則表達式。search() 方法返回字符串中***個匹配項的索引;如果沒有找到匹配項,則返回-1。而且,search() 方法始終是從字符串開頭向后查找模式。看下面的例子。

  1. var text = "cat, bat, sat, fat"
  2.  
  3. var pos = text.search(/at/); 
  4.  
  5. console.log(pos); // 1,即"at"***次出現的位置  

為了簡化替換子字符串的操作,JavaScript 提供了 replace() 方法。這個方法接受兩個參數:***個參數可以是一個 RegExp 對象或者一個字符串(這個字符串不會被轉換成正則表達式),第二個參數可以是一個字符串或者一個函數。如果***個參數是字符串,那么只會替換***個子字符串。要想替換所有子字符串,唯一的辦法就是提供一個正則表達式,而且要指定全局 g 標志,如下所示。

  1. var text = "cat, bat, sat, fat"
  2.  
  3. var result = text.replace("at""ond"); 
  4.  
  5. console.log(result); // "cond, bat, sat, fat" 
  6.  
  7. result = text.replace(/at/g, "ond"); 
  8.  
  9. console.log(result); // "cond, bond, sond, fond"  

***一個與模式匹配有關的方法是 split(),這個方法可以基于指定的分隔符將一個字符串分割成多個子字符串,并將結果放在一個數組中。分隔符可以是字符串,也可以是一個 RegExp 對象(這個方法不會將字符串看成正則表達式)。split() 方法可以接受可選的第二個參數,用于指定數組的大小,以便確保返回的數組不會超過既定大小。請看下面的例子。

  1. var colorText = "red,blue,green,yellow"
  2.  
  3. var colors1 = colorText.split(","); // ["red""blue""green""yellow"
  4.  
  5. var colors2 = colorText.split(",", 2); // ["red""blue"
  6.  
  7. localeCompare() 方法  

這個方法比較兩個字符串,并返回下列值中的一個:

如果字符串在字母表中應該排在字符串參數之前,則返回一個負數(大多數情況下是-1,具體的值要視實現而定);

如果字符串等于字符串參數,則返回0;

如果字符串在字母表中應該排在字符串參數之后,則返回一個正數(大多數情況下是1,具體的值同樣要視實現而定)。

下面是幾個例子。

  1. var stringValue = "yellow"
  2.  
  3. console.log(stringValue.localeCompare("brick")); // 1 
  4.  
  5. console.log(stringValue.localeCompare("yellow")); // 0 
  6.  
  7. console.log(stringValue.localeCompare("zoo")); // -1  

這個例子比較了字符串 "yellow" 和另外幾個值:"brick"、"yellow" 和 "zoo"。因為 "brick" 在字母表中排在 "yellow" 之前,所以 localeCompare() 返回了1;而 "yellow" 等于 "yellow",所以 localeCompare() 返回了0;***,"zoo" 在字母表中排在 "yellow" 后面,所以 localeCompare() 返回了-1。再強調一次,因為 localeCompare() 返回的數值取決于實現,所以***是像下面例子所示的這樣使用這個方法。

  1. function determineOrder(value) { 
  2.     var result = stringValue.localeCompare(value); 
  3.     if (result < 0){ 
  4.         console.log("The string 'yellow' comes before the string '" + value + "'."); 
  5.     } else if (result > 0) { 
  6.         console.log("The string 'yellow' comes after the string '" + value + "'."); 
  7.     } else { 
  8.         console.log("The string 'yellow' is equal to the string '" + value + "'."); 
  9.     } 
  10.  
  11. determineOrder("brick"); 
  12. determineOrder("yellow"); 
  13. determineOrder("zoo");  

使用這種結構,就可以確保自己的代碼在任何實現中都可以正確地運行了。

localeCompare() 方法比較與眾不同的地方,就是實現所支持的地區(國家和語言)決定了這個方法的行為。比如,美國以英語作為 JavaScript 實現的標準語言,因此 localeCompare() 就是區分大小寫的,于是大寫字母在字母表中排在小寫字母前頭就成為了一項決定性的比較規則。不過,在其他地區恐怕就不是這種情況了。

fromCharCode() 方法

另外,String 構造函數本身還有一個靜態方法:fromCharCode()。這個方法的任務是接收一或多個字符編碼,然后將它們轉換成一個字符串。從本質上來看,這個方法與實例方法 charCodeAt() 執行的是相反的操作。來看一個例子:

  1. console.log(String.fromCharCode(104, 101, 108, 108, 111)); // "hello" 
  2.  
  3. var s = 'hello'
  4. for(let i=0;i<s.length;i++){ 
  5.   console.log(`${s[i]}----${s[i].charCodeAt()}`); 
  6. /* 
  7. "h----104" 
  8. "e----101" 
  9. "l----108" 
  10. "l----108" 
  11. "o----111" 
  12. */  

在這里,我們給 fromCharCode() 傳遞的是字符串 "hello" 中每個字母的字符編碼。

關卡

  1. // 挑戰一 
  2. var falseObject = new Object(false); 
  3. console.log(typeof falseObject);             // ??? 
  4. console.log(falseObject instanceof Object);  // ??? 
  5. console.log(falseObject instanceof Boolean); // ??? 
  6. // 挑戰二 
  7. var numberObject = new Object(100); 
  8. console.log(typeof numberObject);             // ??? 
  9. console.log(numberObject instanceof Object);  // ??? 
  10. console.log(numberObject instanceof Number);  // ??? 
  11. // 挑戰三 
  12. var stringObject = new Object("abcde"); 
  13. console.log(typeof stringObject);             // ??? 
  14. console.log(stringObject instanceof Object);  // ??? 
  15. console.log(stringObject instanceof String);  // ??? 
  16. // 挑戰四,翻轉一個字符串 
  17. // 提示:可以使用數組的 reverse() 方法 
  18. var reverse = function(str) { 
  19.     // 待實現方法體 
  20. console.log(reverse("hello"));  // "olleh"  
責任編輯:龐桂玉 來源: segmentfault
相關推薦

2016-10-13 19:11:27

JavaScript函數Web

2016-11-07 15:43:38

JavaScript

2011-07-21 10:07:58

JavaScript

2021-05-16 19:23:11

引用類型包裝

2010-10-08 15:11:28

JavaScript數

2011-07-19 13:44:39

JavaScript

2010-10-08 09:02:03

JavaScript基

2016-08-18 14:13:55

JavaScript基本數據引用數據

2021-05-11 10:36:16

JavaScript原始值對象

2017-02-27 08:34:09

JavaScript數據引用

2024-11-12 13:01:46

2020-07-08 07:56:08

Java工具類包裝類

2021-04-28 18:16:24

Rust數據類型

2020-10-12 10:22:38

JavaScript腳本語言

2018-11-08 15:50:18

前端Javascript重用性

2019-09-18 18:56:34

JavascriptOOP前端

2018-12-12 22:51:24

Java包裝語言

2011-05-05 11:03:34

jQueryjavascript

2024-02-19 10:24:32

Chainable工具類型類型體操

2024-03-04 06:40:49

工具類型TypeScripDeepPick
點贊
收藏

51CTO技術棧公眾號

欧美一区第一页| 欧美另类一区二区三区| 欧美日韩高清在线一区| 国产精品无码粉嫩小泬| 亚洲一区 二区 三区| 精品久久一区二区| jizz欧美激情18| 欧洲在线视频| 国产亚洲成av人在线观看导航| 国产主播精品在线| 97人人澡人人爽人人模亚洲| 日韩av自拍| 精品国产一区久久| 性生活免费在线观看| free性欧美| 亚洲欧美在线观看| 欧美日韩免费高清| 成人毛片在线免费观看| 美美哒免费高清在线观看视频一区二区| 九九视频这里只有精品| 精品无码在线观看| 精品欠久久久中文字幕加勒比| 在线观看一区二区视频| 日韩xxxx视频| a级片国产精品自在拍在线播放| 久久久久久久电影| 91精品国产高清久久久久久91裸体| 日本熟女毛茸茸| 在线精品一区| 欧美成人午夜激情| а天堂中文在线资源| 亚洲小说图片视频| 精品电影一区二区三区| 久久久精品视频国产| 成人午夜毛片| 日本韩国欧美一区二区三区| 国产精品入口芒果| 污视频网站在线免费| 中文字幕在线一区二区三区| 色999日韩自偷自拍美女| 日本黄色三级视频| 高清日韩电视剧大全免费| 91九色视频在线| 国产又粗又大又爽| 日本中文字幕一区| 国产激情999| 亚洲影院在线播放| 亚洲免费综合| 欧美一级片久久久久久久| 免费在线观看黄网站| 在线观看视频免费一区二区三区| 欧美激情精品久久久久久大尺度 | 免费午夜视频在线观看| wwwwxxxx在线观看| 亚洲3atv精品一区二区三区| 欧美图片激情小说| 91超碰在线| 亚洲永久免费视频| 国产精品专区在线| 水蜜桃在线视频| 黑人极品videos精品欧美裸| 免费成人在线视频网站| 一个人看的www视频在线免费观看 一个人www视频在线免费观看 | 麻豆传媒在线免费| 国产精品久久久久一区| 免费观看黄色大片| 日本一本在线免费福利| 午夜精品免费在线| 国产精品无码av在线播放| 在线天堂中文资源最新版| 91久久线看在观草草青青| 中文字幕有码av| 在线免费观看亚洲| 欧美xxxxxxxxx| 人妻丰满熟妇aⅴ无码| 国产欧美日韩精品一区二区三区| 中文字幕国产精品| 男人在线观看视频| 在线观看日韩av电影| 日本国产高清不卡| 亚洲综合五月天婷婷丁香| 国产精品自拍三区| 国产丝袜不卡| 国产福利片在线| 亚洲精品老司机| 北条麻妃在线观看| 另类一区二区| 精品国产网站在线观看| caopeng视频| 亚洲欧洲美洲一区二区三区| 久久久久久成人精品| 精品国产xxx| 国产精品一区二区你懂的| 精品视频在线观看| 国产精品久久久久久福利| 性做久久久久久久免费看| 中文字幕一区二区三区四区在线视频| 嫩呦国产一区二区三区av| 日韩精品视频在线免费观看| 91狠狠综合久久久| 欧美亚洲三区| 91精品网站| 91女主播在线观看| 图片区小说区国产精品视频| 中文字幕第100页| 青青一区二区| 久久99精品久久久久久噜噜 | 欧美日韩国产中文| 成年人小视频在线观看| 久久视频在线| 日本精品视频在线观看| www.日韩高清| 国产精品另类一区| av动漫免费看| 国产精品丝袜在线播放| 久久精品99久久久久久久久 | 91豆花视频在线播放| 欧美日韩一区二区三区四区 | 亚洲美女屁股眼交| 婷婷激情四射五月天| 卡通动漫国产精品| 欧美精品videosex极品1| 一级特黄aa大片| 国产日韩三级在线| 男人揉女人奶房视频60分| 欧美黄色一级| 久久亚洲精品成人| 亚洲一区二区人妻| 国产午夜精品久久| 成年人免费在线播放| 国产精品1luya在线播放| 欧美精品免费看| 一区二区三区黄| 国产精品丝袜一区| 少妇网站在线观看| 狠狠操综合网| 国产精品免费看久久久香蕉| 欧美另类自拍| 一本一道综合狠狠老| 中文字幕影片免费在线观看| 影音先锋中文字幕一区| 国产免费一区二区| 18video性欧美19sex高清| 精品少妇一区二区三区视频免付费| 国产又色又爽又高潮免费| 人人爽香蕉精品| 亚洲国产精品www| 成人黄色毛片| 精品国内亚洲在观看18黄| 91福利在线观看视频| 国产精品久久久久婷婷 | 懂色av噜噜一区二区三区av| 免费cad大片在线观看| 蜜桃在线一区| 久久免费视频在线| 亚洲 另类 春色 国产| 粉嫩老牛aⅴ一区二区三区| www.色多多| 视频一区二区三区中文字幕| 日韩欧美一区二区三区四区| 成人国产综合| 欧美大片免费观看在线观看网站推荐| 性生交生活影碟片| 偷拍与自拍一区| 国产亚洲精品熟女国产成人| 蜜臀av性久久久久av蜜臀妖精 | 1024成人| 欧美日韩在线高清| 久久久久毛片| 久久99久久亚洲国产| 神马一区二区三区| 日本韩国一区二区三区视频| 亚洲天堂网av在线| caoporn国产一区二区| aa免费在线观看| 日韩精品免费| 国产精品12| 日本综合久久| 美女扒开尿口让男人操亚洲视频网站| 亚洲大尺度视频| 日韩欧美aaa| 日韩av手机在线免费观看| 豆国产96在线|亚洲| 国产淫片av片久久久久久| 天天做天天爱天天综合网| 国产v亚洲v天堂无码| 日韩脚交footjobhdboots| 中日韩午夜理伦电影免费| 精品人妻少妇AV无码专区| 欧美性猛xxx| 国产一区二区精彩视频| 91婷婷韩国欧美一区二区| 日韩av片专区| 午夜亚洲激情| 青青视频免费在线| 国产欧美日韩免费观看| 99久久精品免费看国产四区 | 欧美大波大乳巨大乳| 国产一区二区三区高清播放| 欧美日韩精品在线一区二区| 91欧美国产| 欧美精彩一区二区三区| 亚洲午夜免费| 国产精品夜色7777狼人| 中文字幕人成乱码在线观看| 欧美老女人性生活| 国产高清一级毛片在线不卡| 欧美精品一区二区三区很污很色的 | 国产一区二区三区成人欧美日韩在线观看| 亚洲欧美日产图| 日韩超碰人人爽人人做人人添| 91久久久久久久久| 国产麻豆久久| 欧美中文字幕在线| 精精国产xxxx视频在线中文版| 少妇激情综合网| 欧美xxx.com| 亚洲福利精品在线| 999精品国产| 欧美日韩免费观看一区二区三区| 欧美bbbbbbbbbbbb精品| 亚洲一区免费在线观看| 97精品在线播放| 国产午夜亚洲精品不卡| 国精产品一区一区三区免费视频| 成人免费电影视频| 在线观看免费看片| 国模娜娜一区二区三区| 性欧美videossex精品| 久久久久久久欧美精品| 大陆极品少妇内射aaaaa| 欧美午夜一区| 99国产精品白浆在线观看免费| 97精品国产| 亚洲永久一区二区三区在线| 精品国产乱码久久久久久果冻传媒| 国产综合精品一区二区三区| 99亚洲乱人伦aⅴ精品| **亚洲第一综合导航网站| 99精品美女视频在线观看热舞| 国产精品久久久久久久久久久久久 | 日韩专区在线| 久久精品91久久香蕉加勒比| 国产在线激情| 色综合男人天堂| 男女视频在线| 国产69精品久久久| 9999精品成人免费毛片在线看| 国内精品久久久久伊人av| caoprom在线| 国产91成人video| 日韩欧美看国产| 国产精品三级网站| 日韩免费大片| 99视频国产精品免费观看| 中文字幕日韩在线| 黄色99视频| 国产成人精品999在线观看| 亚洲国产精品日韩| 91精品婷婷色在线观看| 韩国无码av片在线观看网站| 亚洲国产精品一区| 亚洲欧洲日产国码无码久久99| 久久久久99| 五月激情婷婷在线| 岛国精品一区二区| 免费污网站在线观看| 国产精品成人免费精品自在线观看| 91香蕉一区二区三区在线观看| 亚洲在线观看免费视频| wwwwww国产| 欧美日韩综合不卡| 亚洲va天堂va欧美ⅴa在线| 亚洲国产精品字幕| 福利片在线观看| 欧美另类交人妖| 蜜桃视频在线观看免费视频| 国产精品看片资源| 国内不卡的一区二区三区中文字幕 | 国产精品理伦片| 久久一二三四区| 在线一区二区三区做爰视频网站| 国产精品国产精品国产专区| 亚洲成人激情在线观看| 国产在线你懂得| 欧美成在线视频| 都市激情亚洲综合| 成人羞羞国产免费| 五月国产精品| 在线观看18视频网站| 亚洲一区久久| 国产精品久久久久久久99| 91美女精品福利| 久久精品黄色片| 在线免费不卡视频| 亚洲第一页综合| 中文字幕在线看视频国产欧美| 后进极品白嫩翘臀在线播放| 国产精品老女人精品视频| 国产精品45p| 青青草综合视频| 蜜桃免费网站一区二区三区| 亚洲 欧美 日韩在线| 最新久久zyz资源站| 亚洲欧美精品一区二区三区| 欧美一区二区三区成人| av免费观看一区二区| 69视频在线播放| 综合视频一区| 亚洲欧美国产不卡| 美女诱惑一区| 国产69视频在线观看| 日韩毛片一二三区| 超碰在线观看91| 日韩精品一二三四区| 久久电影网站| 成人免费网视频| 欧美中文一区二区| 欧美 日韩精品| 成人激情视频网站| 免费网站观看www在线观| 欧美日韩国产大片| 国产精品一区二区三区四区色| 91成人天堂久久成人| 成人性生交大片免费看96| 久久久久久久久网| 国产一区 二区 三区一级| 成人免费视频入口| 在线观看日韩一区| 韩日视频在线| 日韩免费在线播放| 婷婷激情久久| 国产男女在线观看| 91免费视频大全| 国偷自拍第113页| 日韩av影视在线| xxxx视频在线| 国产一区二区自拍| 99视频+国产日韩欧美| 伦理片一区二区| 五月激情六月综合| 日本一区视频| 欧美在线不卡区| 亚洲人成网77777色在线播放 | 欧美精品一区二区蜜桃| 欧美一级日韩一级| 性xxxfreexxxx性欧美| 99国产超薄丝袜足j在线观看| 欧美色一级片| 女同性恋一区二区三区| 激情久久av一区av二区av三区| 手机在线不卡av| 热久久免费视频精品| 欧美精品一区二区三区精品| 国产三级日本三级在线播放| 欧美韩日一区二区三区四区| 91麻豆国产在线| 久久69精品久久久久久久电影好 | 国产精品一区二区免费不卡| 免费中文字幕在线观看| 亚洲成人精品视频| 欧美电影网站| 手机福利在线视频| 成人国产精品免费| 成人午夜淫片100集| 日韩中文字幕久久| 欧美a级大片在线| 国产中文字幕在线免费观看| 国产欧美日韩在线| av在线亚洲天堂| 97福利一区二区| 精品国产一区二区三区噜噜噜 | 不卡一区视频| 国产成人一区二区三区别| 久久久噜噜噜久久中文字幕色伊伊| 在线免费一区二区| 欧美成人第一页| 亚欧日韩另类中文欧美| 另类小说色综合| 亚洲国产精品久久久久婷婷884 | 欧美精品福利视频| 欧美精品乱码| 韩国三级丰满少妇高潮| 欧美性jizz18性欧美| 看黄网站在线观看| 久久久久无码国产精品一区| 久久99国内精品| 国产成人亚洲欧洲在线| 中文字幕日韩电影| 久久草在线视频| 亚洲精品综合在线观看| 调教+趴+乳夹+国产+精品| 91大神在线网站| 久久亚洲高清| 国产乱码字幕精品高清av| 精品视频一二三区| 久久久久久久一区二区| 四虎8848精品成人免费网站| 一级特级黄色片| 欧美一级视频精品观看|