摘要:引用類型和基本包裝類型的主要區(qū)別就是對象的生存期。自動(dòng)創(chuàng)建的基本包裝類型的對象只存在于一行代碼的執(zhí)行瞬間,隨后就會(huì)被銷毀。另外,構(gòu)造函數(shù)也會(huì)根據(jù)傳入值的類型返回相應(yīng)基本包裝類型的實(shí)例。
基本包裝類型
為了操作的遍歷,ECMAScript 還提供了3 個(gè)特殊的引用類型: Boolean、Number 和String。引用類型和基本包裝類型的主要區(qū)別就是對象的生存期。自動(dòng)創(chuàng)建的基本包裝類型的對象只存在于一行代碼的執(zhí)行瞬間,隨后就會(huì)被銷毀。
另外,Object 構(gòu)造函數(shù)也會(huì)根據(jù)傳入值的類型返回相應(yīng)基本包裝類型的實(shí)例。如:
var str = new Object("text"); document.write(typeof str); //object document.write(str instanceof String); //true
使用new 調(diào)用基本包裝類型的構(gòu)造函數(shù),與直接調(diào)用同名的轉(zhuǎn)型函數(shù)是不一樣的。如:
var num1 = new Number("321"); //構(gòu)造函數(shù) document.write(num1 instanceof Number); //true document.write(typeof num1); //object var str = "321"; var num2 = Number(str); //轉(zhuǎn)型函數(shù) document.write(num2 instanceof Number); //false document.write(typeof num2); //numberBoolean 引用類型
Boolean 引用類型與布爾值對應(yīng)??梢詡魅氩紶栔?,語法如下:
var booleanObject = new Boolean(true); //或 var booleanObject = new Boolean(false);
該引用類型的實(shí)例會(huì)修改valueOf()和toString()方法。前者返回基本類型值true 和false;后者返回字符串"true" 和"false"。
使用Boolean 引用類型會(huì)產(chǎn)生在布爾表達(dá)式中使用Boolean 對象。如:
var booleanObj = new Boolean(false); var booleanValue = false; document.write(booleanObj && true); //true document.write(booleanValue && true); //false
布爾表達(dá)式中的所有對象都會(huì)被轉(zhuǎn)換為true。所以建議永遠(yuǎn)不要使用Boolean 對象。
Number 引用類型可以調(diào)用Number 構(gòu)造函數(shù)向其傳入相應(yīng)的數(shù)值。如:
var num = new Number(10);
Number 類型也重寫了valueOf()、toLocaleString()和toString()方法。重寫后的valueOf()方法返回對象表示的基本類型的數(shù)值。
var num = new Number(10); document.write(typeof num.valueOf()) //number
其中,toFixed()方法會(huì)按照指定的小數(shù)位返回?cái)?shù)值的字符串表示,如:
var num = new Number(10); document.write(num.toFixed(2)); //10.00
該方法很適合處理貨幣值。但不同的瀏覽器給這個(gè)方法設(shè)定的舍入規(guī)則有所不同。IE8 以及之前的版本,在給toFixed()傳入0 的情況下,不能正確舍入范圍在{[-0.94,-0.5],[0.5,0.94]}之間的值。IE9 修復(fù)了這個(gè)問題。
var num = new Number(10); document.write(num.toFixed(21)); //RangeError: toFixed() argument must be between 0 and 20
toFixed()方法可以表示帶有0 到20 個(gè)小數(shù)位的數(shù)值。
另外,toExponential()方法可以返回以指數(shù)表示法(也稱e 表示法)表示的數(shù)值的字符串形式。如:
var num = 143210000000; document.write(num.toExponential(3)); //1.432e+11
最后,toPrecision()方法可能會(huì)返回固定大小(fixed)格式,也可能返回指數(shù)(exponential)格式;它會(huì)根據(jù)要處理的數(shù)值決定到底是調(diào)用toFixed()還是調(diào)用toExponential()。如:
var num = 123; document.write(num.toFixed(1)); //123.0 document.write(num.toExponential(2)); //1.23e+2 document.write(num.toPrecision(1)); //1e+2 document.write(num.toPrecision(3)); //123 document.write(num.toPrecision(4)); //123.0
toPrecision()方法可以表現(xiàn)1 到21 位小叔。某些瀏覽器支持的范圍更大。
仍然不建議直接實(shí)例化Number 引用類型,原因與Boolean 對象一樣。如:
var num1 = new Number(10); var num2 = 10; console.log(num1); //Number console.log(num2); //10 console.log(typeof num1); //object console.log(typeof num2); //number console.log(num1 instanceof Number); //true console.log(num2 instanceof Number); //falseString 引用類型
String 類型是字符串的對象包裝類型。創(chuàng)建方法如下:
var str = new String("Hello World");
繼承的valueOf()、toLocaleString()和toString()方法,都返回對象所表示的基本字符串值。且每個(gè)實(shí)例都有一個(gè)length 屬性。如:
var str = new String("Hello World"); document.write(str.length); //11String類型的方法
String 類型提供了很多方法,用于輔助完成對ECMAScript 中字符串的解析和操作。
字符方法主要有兩個(gè)用于訪問字符串中特定字符的方法:charAt()和charCodeAt(),和一個(gè)ECMAScript 5 中的方括號(hào)表示法。
該方法以單字符串的形式返回給定位置的那個(gè)字符(ECMAScript 沒有字符類型)。如:
var num = "Hello world"; console.log(num.charAt(6)); //w
該方法返回字符編碼。如:
var num = "Hello world"; console.log(num.charCodeAt(6)); //119
如果在IE7 及更早版本中使用這種語法,會(huì)返回undefined 值。如:
var num = "Hello world"; console.log(num[6]); //w字符串操作方法
拼接、刪除等方法
該方法用于將一個(gè)或多個(gè)字符串拼接起來。如:
var str = "hello"; var newStr = str.concat(" world","!"); document.write(str); //hello document.write(newStr); //hello world!
實(shí)踐中,這種方法復(fù)雜麻煩不如+ 加號(hào)來的方便。
1 個(gè)或2 個(gè)參數(shù),第一個(gè)參數(shù)是開始的位置,第二個(gè)參數(shù)是結(jié)束的位置。如:
var str = "hello world"; var newStr = str.slice(5,7); document.write(str + "
" + newStr); //w
1 個(gè)或2 個(gè)參數(shù),第一個(gè)參數(shù)是開始的位置,第二個(gè)參數(shù)是返回的字符的個(gè)數(shù)。如:
var str = "hello world"; var newStr = str.substr(6, 1); document.write(str + "
" + newStr); //w
1 個(gè)或2 個(gè)參數(shù),第一個(gè)參數(shù)是開始的位置,第二個(gè)參數(shù)是結(jié)束的位置。如:
var str = "hello world"; var newStr = str.substring(6, 7); document.write(str + "
" + newStr); //w
以上三個(gè)方法在被傳入負(fù)數(shù)的情況下,返回的結(jié)果就不太相同了。
slice()方法會(huì)將兩個(gè)參數(shù)與字符串長度相加;
substr()方法會(huì)將第一個(gè)參數(shù)與字符串長度相加,第二個(gè)參數(shù)轉(zhuǎn)換為0;
substring()方法會(huì)將兩個(gè)參數(shù)都轉(zhuǎn)換為0;
如下:
var str = "hello world"; var newStr = str.slice(-6, -1); document.write(str + "字符串位置方法
" + newStr); //hello world worl var str = "hello world"; var newStr = str.substr(3, -4); document.write(str + "
" + newStr); //" " var str = "hello world"; var newStr = str.substring(3,-4); //實(shí)際上這個(gè)方法會(huì)把-4 轉(zhuǎn)換成0,而該方法會(huì)從兩個(gè)參數(shù)中較小的一個(gè)作為開始位置,所以相當(dāng)于調(diào)用了str.substring(0,3) document.write(str + "
" + newStr); //hello world hel
有兩個(gè)方法:indexOf()和lastIndexOf();該兩個(gè)方法如果沒有找到該子字符串,則返回-1。
indexOf()方法從字符串的開頭向后搜索。如:
var str = "hello world"; document.write(str.indexOf("o")); //4
也可以傳入第二個(gè)參數(shù),即從何處開始。如:
var str = "hello world"; document.write(str.indexOf("o",5)); //7
lastIndexOf()方法從字符串的后面開始向前搜索。如:
var str = "hello world"; document.write(str.lastIndexOf("o")); //7
當(dāng)然也有第二個(gè)參數(shù)。如:
var str = "hello world"; document.write(str.lastIndexOf("o",5)); //4
可以循環(huán)調(diào)用上面的方法,來找到所有匹配的字符串。如:
var str = "hello world"; var pos = str.indexOf("o"); var result = []; while (pos > -1){ result.push(pos); pos = str.indexOf("o",pos + 1); } document.write(result.join(" ")); //4 7trim()方法
這個(gè)方法會(huì)創(chuàng)建一個(gè)字符串的副本,刪除前置和后綴的所有空格,然后返回結(jié)果。如:
var str = " hello world "; console.log(str); //" hello world " var newStr = str.trim(); console.log(newStr); //"hello world"字符串大小寫轉(zhuǎn)換方法
主要有四個(gè)方法:toLowerCase()、toUpperCase()、toLocaleLowerCase()、toLocaleUpperCase()。其中后面兩種方法是針對特定地區(qū)的實(shí)現(xiàn)。對有些少數(shù)語言地區(qū)會(huì)為Unicode 大小寫轉(zhuǎn)換應(yīng)用特殊的規(guī)則。所以,在不知道自己的代碼將在哪種語言環(huán)境中運(yùn)行的情況下,還是使用后兩種方法比較好。如:
var str = "Apple.Inc"; console.log(str.toUpperCase()); console.log(str.toLowerCase()); console.log(str.toLocaleUpperCase()); console.log(str.toLocaleLowerCase()); /* [Log] APPLE.INC (repetition.html, line 16) [Log] apple.inc (repetition.html, line 17) [Log] APPLE.INC (repetition.html, line 18) [Log] apple.inc (repetition.html, line 19) */字符串的模式匹配方法
有四個(gè)方法:match()、search()、replace()、split()。
本質(zhì)上與調(diào)用RegExp 的exec()方法相同。match()方法接受一個(gè)參數(shù)(正則表達(dá)式或RegExp 對象)如:
var str = "red hed bed led"; var pattern = /.ed/; var matches = str.match(pattern); //與pattern.exec(str)相同 console.log(matches); //["red"]
唯一的參數(shù)與match()方法相同。search()方法返回字符串中第一個(gè)匹配項(xiàng)的索引;如果沒有就返回-1;如:
var str = "red hed bed led"; var pattern = /ed/; var matched = str.search(pattern); console.log(matched); //1
接收兩個(gè)參數(shù):第一個(gè)是RegExp 對象或者一個(gè)字符串;第二個(gè)參數(shù)是字符串或者一個(gè)函數(shù)。
如果第一個(gè)參數(shù)是字符串,就會(huì)替換第一個(gè)子字符串。如:
var str = "red hed bed led"; var matched = str.replace("red", "aaa"); console.log(matched); //aaa hed bed led
如果第一個(gè)參數(shù)是正則表達(dá)式且指定了全局g 標(biāo)志,就會(huì)替換所有。如:
var str = "red hed bed led"; var matched = str.replace(/ed/g, "aaa,"); console.log(matched); //raaa, haaa, baaa, laaa,
如果第二個(gè)參數(shù)是字符串,那么可以使用一些特殊的字符序列:
$$ (替換成$)
$&(匹配整個(gè)模式的子字符串)
$` (匹配的子字符串之前的子字符串)
$" (匹配的子字符串之后的子字符串)
$n (匹配第n 個(gè)捕獲組的子字符串)
$nn (匹配第nn 個(gè)捕獲組的子字符串)
如:
var str = "red hed bed led"; var matched = str.replace(/ed/g, "$$-"); //r$- h$- b$- l$- matched = str.replace(/ed/g, "$&-"); //red- hed- bed- led- matched = str.replace(/.ed/g, "$`-"); //- red - red hed - red hed bed - matched = str.replace(/.ed/g, "$"-"); //hed bed led- bed led- led- - matched = str.replace(/(ed)/g, "$1ing"); //reding heding beding leding console.log(matched);
如果第二個(gè)參數(shù)是一個(gè)函數(shù),這個(gè)函數(shù)會(huì)被傳遞多個(gè)參數(shù):模式的匹配項(xiàng)、第一個(gè)捕獲組的匹配項(xiàng)、第二個(gè)...,最后兩個(gè)參數(shù)是分別是模式的匹配項(xiàng)在字符串中的位置和原始字符串。如:
function inputText(text){ return text.replace(/[lo]/g, function(match,pos,orignalText){ switch(match){ case "l": return "1"; case "o": return "0"; } }); } var output = inputText("hello"); console.log(output); //he110
這個(gè)方法可以基于指定的分隔符將一個(gè)字符串分割成多個(gè)字符串,并將結(jié)果放在一個(gè)數(shù)組中。分隔符可以是字符串,也可以是一個(gè)RegExp 對象。第二個(gè)參數(shù)是可選的,用于指定數(shù)組的大小。如:
var str = "Apple.Inc,Baidu.Inc,Alibaba.Inc"; var list = str.split(","); document.write(list.join(" & ")); //Apple.Inc & Baidu.Inc & Alibaba.Inc console.log(list); //["Apple.Inc", "Baidu.Inc", "Alibaba.Inc"]
這個(gè)方法是比較兩個(gè)字符串,并返回下列值中的一個(gè):
如果字符串在字母表中應(yīng)該排在字符串參數(shù)之前,則返回一個(gè)負(fù)數(shù)(多數(shù)情況下是-1);
如果字符串在字母表中應(yīng)該排在字符串參數(shù)之后,則返回一個(gè)正數(shù)(多數(shù)情況下是1);
如果字符串等于字符串參數(shù),則返回0;
具體如下:
var strValue = "hello"; console.log(strValue.localeCompare("world")); //-1 字符串hello 在字符串參數(shù)world 之前,返回-1 console.log(strValue.localeCompare("Alice")); //1 console.log(strValue.localeCompare("hello")); //0
因?yàn)榉祷氐臄?shù)值不一定上上面三種,所以最好用下面這個(gè)方法比較:
function compare(x,y){ var result = x.localeCompare(y); if (result > 0){ document.write(y + "," + x); }else if(result < 0){ document.write(x + "," + y); }else{ document.write("equal"); } } compare("apple","baidu"); //apple,baidu
可以嘗試把string 轉(zhuǎn)換成array 再用數(shù)組重排序的方法:
str = "blue,red,yellow,white"; function compare(str){ var strArray = str.split(","); var newStrArray = strArray.sort(arraySortFunc); function arraySortFunc(a,b){ if (a > b){ return 1; }else if(a < b){ return -1; }else{ return 0; } } console.log(newStrArray); //["blue", "red", "white", "yellow"] } compare(str);
這是一個(gè)靜態(tài)方法。目的是接收一個(gè)或多個(gè)字符編碼,然后將他們轉(zhuǎn)換成一個(gè)字符串。從本質(zhì)上來看這個(gè)方法與charCodeAt()執(zhí)行的是相反的操作。注意他的語法是String.charCodeAt()如:
function consoleStrCode(str){ var codeStr = ""; var codeArray = []; for (var i = 0; i < str.length; i ++){ var codeValue = str.charCodeAt(i); codeStr += codeValue + ","; } codeArray = codeStr.split(","); codeArray.pop(); console.log(codeArray); } consoleStrCode("hello"); //["104", "101", "108", "108", "111"] function consoleCodeStr(codeArray){ var codeStr = ""; for (var i = 0;i < codeArray.length;i ++){ var currentCode = codeArray[i]; var currentCodeValue = parseInt(currentCode); codeStr += String.fromCharCode(currentCodeValue); } console.log(codeStr); } var codeArray = ["104", "101", "108", "108", "111"]; consoleCodeStr(codeArray); //hello
以上代碼就是代碼和字符串互換的函數(shù)。
該方法的目的是簡化常見的HTML 格式化。因?yàn)樗鼈儎?chuàng)建的標(biāo)記通常無法表達(dá)語義。所以應(yīng)該避免使用。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/86219.html
摘要:你不知道的基本包裝類型聲明本文的大部分內(nèi)容參考自高級(jí)程序設(shè)計(jì)第三版中文版,中間夾雜一些自己閱讀這部分內(nèi)容時(shí)的思路。而且,上面的步驟同樣適用于類型的類型對應(yīng)的布爾值和數(shù)字值。 JavaScript 你不知道的基本包裝類型 聲明:本文的大部分內(nèi)容參考自《JavaScript 高級(jí)程序設(shè)計(jì)(第三版)》(中文版 P.118),中間夾雜一些自己閱讀這部分內(nèi)容時(shí)的思路。 JavaScript 中共...
摘要:對基本包裝類型的實(shí)例調(diào)用會(huì)返回,而且所有基本包裝類型的對象都會(huì)被轉(zhuǎn)換為布爾值。構(gòu)造函數(shù)也會(huì)像工廠方法一樣,根據(jù)傳入值的類型返回相應(yīng)基本包裝類型的實(shí)例。要注意的是,使用調(diào)用基本包裝類型的構(gòu)造函數(shù),與直接調(diào)用同名的轉(zhuǎn)型函數(shù)是不一樣的。 為了便于操作基本類型值,JavaScript 還提供了3個(gè)特殊的引用類型:Boolean、Number 和 String。實(shí)際上,每當(dāng)讀取一個(gè)基本類型值的時(shí)...
摘要:前綴規(guī)范每個(gè)局部變量都需要有一個(gè)類型前綴,按照類型可以分為表示字符串。例如,表示以上未涉及到的其他對象,例如,表示全局變量,例如,是一種區(qū)分大小寫的語言。布爾值與字符串相加將布爾值強(qiáng)制轉(zhuǎn)換為字符串。 基本概念 javascript是一門解釋型的語言,瀏覽器充當(dāng)解釋器。js執(zhí)行時(shí),在同一個(gè)作用域內(nèi)是先解釋再執(zhí)行。解釋的時(shí)候會(huì)編譯function和var這兩個(gè)關(guān)鍵詞定義的變量,編譯完成后從...
摘要:今天把接下來引用類型中的一些內(nèi)容全部記錄完畢基本包裝類型為了便于操作基本類型值,還提供了種特殊的引用類型。這三種類型具有與各自的基本類型響應(yīng)的特殊行為。重寫后的返回對象表示的數(shù)值類型,另外兩個(gè)方法則返回字符串形式的數(shù)值。 今天把接下來引用類型中的一些內(nèi)容全部記錄完畢~ 基本包裝類型 為了便于操作基本類型值,JavaScript還提供了3種特殊的引用類型:Boolean, Number,...
摘要:八進(jìn)制字面值的第一位必須是,然后是八進(jìn)制數(shù)字序列。十六進(jìn)制字面量的前兩位必須是,后跟任何十六進(jìn)制數(shù)字以及。而自動(dòng)創(chuàng)建的基本包裝類型的對象,則只存在于一行代碼的執(zhí)行瞬間,然后立即銷毀。 前言 ECMAScript 迄今為止標(biāo)準(zhǔn)定義了 7 種數(shù)據(jù)類型:6 種原始類型-- String、Number、 Boolean、 Undefined、Null 和 Symbol;1 種引用類型-- O...
閱讀 2039·2023-04-25 23:30
閱讀 1459·2021-11-24 10:18
閱讀 3098·2021-10-09 09:54
閱讀 2024·2021-10-08 10:05
閱讀 3448·2021-09-23 11:21
閱讀 3170·2019-08-30 15:52
閱讀 1569·2019-08-30 13:05
閱讀 1068·2019-08-30 13:02