本章內(nèi)容
- 語法
- 數(shù)據(jù)類型
- 流控制語句
- 理解函數(shù)
1 語法
1.1 區(qū)分大小寫
ECMAScript中的一切(變量 、函數(shù)和操作符)都區(qū)分大小寫。
1.2 標(biāo)識(shí)符
標(biāo)識(shí)符,就是指變量、函數(shù)、屬性的名字,或者函數(shù)的參數(shù)。
標(biāo)識(shí)符的格式
- 第一個(gè)字符必須是字母、下劃線(_)或者一個(gè)美元的符號(hào)($)
- 其他字符可以是字母、下劃線、美元符號(hào)或數(shù)字
標(biāo)識(shí)符的格式采用駝峰大小寫格式,也就是說第一個(gè)字母小寫,剩下的每個(gè)有意義的單詞的首字母大寫,例如:
firstSecond
myCar
doSomethingImportant
注意,不能把關(guān)鍵字、保留字、true、false和null用作標(biāo)識(shí)符
1.3 注釋
ECMAScript使用C風(fēng)格的注釋,包括單行注釋和塊級(jí)注釋。
單行注釋
// 單行注釋
塊級(jí)注釋
/*
* 這是一行
* [塊級(jí)]注釋
*/
當(dāng)然,目前IDE注釋都很方便,了解即可。
1.4 嚴(yán)格模式
JavaScript 嚴(yán)格模式(strict mode)即在嚴(yán)格的條件下運(yùn)行
"use strict" 的目的是指定代碼在嚴(yán)格條件下執(zhí)行
"use strict";
x = 3.14; // 報(bào)錯(cuò) (x 未定義)
"use strict";
myFunction();
function myFunction() {
y = 3.14; // 報(bào)錯(cuò) (y 未定義)
}
x = 3.14; // 不報(bào)錯(cuò)
myFunction();
function myFunction() {
"use strict";
y = 3.14; // 報(bào)錯(cuò) (y 未定義)
}
為什么使用嚴(yán)格模式:
- 消除Javascript語法的一些不合理、不嚴(yán)謹(jǐn)之處,減少一些怪異行為;
- 消除代碼運(yùn)行的一些不安全之處,保證代碼運(yùn)行的安全;
- 提高編譯器效率,增加運(yùn)行速度;
- 為未來新版本的Javascript做好鋪墊。
1.5 語句
ECMAScript中的語句以一個(gè)分號(hào)結(jié)尾;如果省略分號(hào),則由解析器確定語句的結(jié)尾,如下圖所示
var sum = a + b //即使沒有分號(hào),也是有效的語句
var diff = a - b; //有效語句
這本書上說,建議任何時(shí)候都不要省略分號(hào)。因?yàn)榧由线@個(gè)分號(hào)可以避免很多錯(cuò)誤,開發(fā)人員也可以放心地來壓縮代碼。
另外,用分號(hào)一定程度上可以提高性能,因?yàn)榻馕銎骶筒恍枰倩〞r(shí)間推測該在哪里插入分號(hào)了。
還有,使用{}來將多條語句組合到一個(gè)代碼塊中。
在控制語句中,使用代碼塊可以讓編碼意圖更加清晰,而且也能降低修改代碼時(shí)出錯(cuò)的幾率。
2 關(guān)鍵字和保留字
abstract
arguments
boolean
break
byte
case
catch
char
class*
const
continue
debugger
default
delete
do
double
else
enum*
eval
export*
extends*
false
final
finally
float
for
function
goto
if
implements
import*
in
instanceof
int
interface
let
long
native
new
null
package
private
protected
public
return
short
static
super*
switch
synchronized
this
throw
throws
transient
true
try
typeof
var
void
volatile
while
with
yield
反正,寫代碼的時(shí)候,如果用錯(cuò)標(biāo)識(shí)符,IDE會(huì)提醒你的,了解就好,??不需要背下來。
3 變量
ECMAScript的變量是松散類型的,所謂松散類型就是可以用來保存任何類型的數(shù)據(jù)。
4 數(shù)據(jù)類型
ECMAScript中有5種簡單數(shù)據(jù)類型(基本數(shù)據(jù)類型):Undefined、Null、Number和String。還有1種復(fù)雜數(shù)據(jù)類型——Object,它的本質(zhì)上是由一組無序的鍵值對(duì)組成的。
ECMAScript不支持任何床見自定義類型的機(jī)制,而所有值最終都是上述6種數(shù)據(jù)類型之一。由于ECMAScrip數(shù)據(jù)類型具有動(dòng)態(tài)性,因此的確沒有再定義其他數(shù)據(jù)類型的必要了。
這里說的動(dòng)態(tài)性,指的是數(shù)據(jù)類型可以擴(kuò)展出任何類型,如object,可以動(dòng)態(tài)添加屬性與方法。
4.1 typeof操作符
鑒于ECMAScript是松散類型的,因此需要來檢測給定的變量的數(shù)據(jù)類型,typeof就是負(fù)責(zé)提供這方面信息的操作符。對(duì)一個(gè)值使用typeof操作符可能返回下列某個(gè)字符串:
- "undefined"——這個(gè)值未定義;
- "boolean"——這個(gè)值是布爾值;
- "string"——這個(gè)值是字符串;
- "number"——這個(gè)值是數(shù)值;
- "object"——這個(gè)值是對(duì)象或null;
- "function"——這個(gè)值是函數(shù)。
例子:
var message = "some string";
alert(typeof message);//"string"
alert(typeof(message));//"string"
alert(typeof 95);//"number"
這幾個(gè)例子說明,typeof操作符的操作數(shù)可以是變量(message),也可以是數(shù)值字面量。注意,typeof是一個(gè)操作符而不是函數(shù),因此例子中的圓括號(hào)盡管可以使用,但不是必須的。
4.2 Undefined類型
Undefined類型只有一個(gè)值,即特殊的undefined。在使用var聲明變量但未對(duì)其初始化時(shí),這個(gè)變量的值就是undefined,例如:
var message;
alert(message == undefined);//true
4.3 Null類型
Null類是第二個(gè)只有一個(gè)值的數(shù)據(jù)類型,這個(gè)特殊的值是null。從邏輯角度來看,null值表示一個(gè)空對(duì)象指針,而這也正是使用typeof操作符檢測null值時(shí)會(huì)返回"object"的原因。
如果定義的變量準(zhǔn)被在將來用于保存對(duì)象,那么最好將該變量初始化為null。這樣一來,只要直接檢查null值就可以知道相應(yīng)的變量時(shí)候已經(jīng)保存了一個(gè)對(duì)象的引用了。
4.4 Boolean類型
該類型只有兩個(gè)字面值:true和false。這兩個(gè)值與數(shù)字值不是同一回事,因此true不一定等于1,而false也不一定等于0。
雖然Boolean類型的字面值只有兩個(gè),但ECMAScript中所有類型的值都有與這兩個(gè)Boolean值等價(jià)的值,可以調(diào)用轉(zhuǎn)類型函數(shù)Boolean()。
下表給出了各種數(shù)據(jù)類型及其對(duì)應(yīng)的轉(zhuǎn)換規(guī)則。
| 數(shù)據(jù)類型 | 轉(zhuǎn)換為true值 | 轉(zhuǎn)換為false的值 |
|---|---|---|
| Boolean | true | false |
| String | 任何非空字符串 | 空字符串("") |
| Number | 任何非零數(shù)字值(包括無窮大或無窮?。?/td> | 0和NaN(不是數(shù)字) |
| Object | 任何對(duì)象 | null |
| Undefined | 不適用 | undefined |
這些轉(zhuǎn)換規(guī)則在流控制語句(如if語句)有很重要的作用
4.5 Number類型
這種類型使用IEEE754格式來表示整數(shù)和浮點(diǎn)數(shù)值(浮點(diǎn)數(shù)值在某些語言中也被稱為雙精度數(shù)值)。
最基本的數(shù)值字面量格式是十進(jìn)制。
除了以十進(jìn)制表示外,整數(shù)還可以通過八進(jìn)制(以8為基數(shù))</span>或十六進(jìn)制(以16進(jìn)制)關(guān)于二進(jìn)制,八進(jìn)制,十進(jìn)制和十六進(jìn)制的說明
其中,八進(jìn)制字面值的第一位必須是0,然后是八進(jìn)制數(shù)值序列(0~7)。如果字面值中的數(shù)值超出了范圍,那么前導(dǎo)零將被忽略,后面的數(shù)值將被當(dāng)作十進(jìn)制數(shù)值解析。例子:
var octalNum1 = 070;//八進(jìn)制的56
var octalNum2 = 079;//無效的八進(jìn)制數(shù)值——解析為79
var octalNum3 = 08;//無效的八進(jìn)制數(shù)值——解析為8
八進(jìn)制字面量在嚴(yán)格模式下是無效的,會(huì)導(dǎo)致支持的JavaScript引擎拋出錯(cuò)誤。
十六進(jìn)制字面值的前兩位必須是0x,后面跟任何十六進(jìn)制數(shù)值(09及AF)。其中,字母A~F可以大寫,也可以小寫。例子:
var hexNum1 = 0xA;//十六進(jìn)制的10
var hexNum2 = 0x1f;//十六進(jìn)制的31
在進(jìn)行算數(shù)計(jì)算時(shí),所有以八進(jìn)制和十六進(jìn)制表示的數(shù)值最終都將被轉(zhuǎn)換成十進(jìn)制數(shù)值。
4.5.1 浮點(diǎn)數(shù)值
所謂浮點(diǎn)數(shù)值,就是該數(shù)值中必須包含一個(gè)小數(shù)點(diǎn),并且小數(shù)點(diǎn)后面必須至少有一位數(shù)字。例子:
var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1;//有效,但不推薦
由于保存浮點(diǎn)數(shù)值需要的內(nèi)存空間是保存整數(shù)值的兩倍,因此ECMAScript會(huì)不失時(shí)機(jī)地將浮點(diǎn)數(shù)值轉(zhuǎn)換為整數(shù)值。例子:
var floatNum1 = 1.;//小數(shù)點(diǎn)后面沒有數(shù)字——解析為1
var floatNum2 = 10.0;//整數(shù)——解析為10
對(duì)于那些極大或者極小的數(shù)值,可以用e表示法(科學(xué)計(jì)數(shù)法)。用e表示法表示的數(shù)值等于e前面的數(shù)值乘以10的指數(shù)次冪。例子:
var floatNum1 = 3.125e7;//等于31250000
var floatNum2 = 3.125E7;//e不區(qū)分大小寫
var floatNum3 = 3e-7;//等于0.0000003
浮點(diǎn)數(shù)值的最高精度是17位小數(shù),但是在進(jìn)行算術(shù)計(jì)算時(shí)其精確度遠(yuǎn)遠(yuǎn)不如整數(shù)。
var a = 0.1;
var b = 0.2;
if (a + b == 0.3) {//不要做這樣的測試,因?yàn)槟悴荒艹晒Φ? alert("You got 0.3");
}
console.log(a + b);//0.30000000000000004
4.5.2 數(shù)值范圍
由于內(nèi)存限制,ECMAScript不能保存世界上所有的數(shù)值。ECMAScript能夠表示的最小數(shù)值保存在Number.MIN_VALUE中;能夠表示的最大數(shù)值保存在Number.MAX_VALUE中。如果某次計(jì)算的寄過得到了一個(gè)超出ECMAScript數(shù)值范圍的值,那么這個(gè)數(shù)值將被自動(dòng)轉(zhuǎn)換成特殊的Infinity值。具體來說,如果這個(gè)值是負(fù)數(shù),則會(huì)轉(zhuǎn)換成-Infinity(負(fù)無窮),反之,則會(huì)被轉(zhuǎn)成Infinity(正無窮)。
如上所述,如果某次計(jì)算返回了正或負(fù)的Infinity值,那么該值將無法參與下一次的計(jì)算。可以通過isFinite()來判斷,例子:
var result = Number.MAX_VALUE + Number.MAX_VALUE;
console.log(isFinite(result));//false
4.5.3 NaN
這個(gè)就是Not a Number,翻譯過來就是不是數(shù)值,在ECMAScript中,它是一個(gè)特殊的數(shù)值,表示本來應(yīng)該返回?cái)?shù)值的操作,結(jié)果么有返回?cái)?shù)值,防止拋出異常。
- NaN與任何值都不相等,包括它本身
- 任何涉及到與NaN的操作,都會(huì)返回NaN。
增對(duì)這兩個(gè)特點(diǎn),ECMAScript定義了isNaN()函數(shù)。這個(gè)函數(shù)可以幫我們確定參數(shù)是否“不是數(shù)值”。即,任何不能被轉(zhuǎn)換為數(shù)值的參數(shù)都會(huì)導(dǎo)致這個(gè)函數(shù)返回true。例子:
console.log(isNaN(NaN)); //true
console.log(isNaN(10)); //false
console.log(isNaN("10")); //false(可以被轉(zhuǎn)換成數(shù)值10)
console.log(isNaN("blue")); //true(不能被轉(zhuǎn)換成數(shù)值)
console.log(isNaN(true));//false(可以被轉(zhuǎn)換成數(shù)值1)
isNaN()也適用于對(duì)像。在基于對(duì)象調(diào)用isNaN()函數(shù)時(shí),會(huì)首先調(diào)用對(duì)象的valueOf()方法,然后確定該方法返回的值是否可以轉(zhuǎn)換為數(shù)值。如果不能,則基于這個(gè)返回值再調(diào)用toString()方法,再測試返回值。
4.5.4 數(shù)值轉(zhuǎn)換
Number()、parseInt()和parseFloat()這三個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值。
Number(),即轉(zhuǎn)型函數(shù),它可以用于任何數(shù)據(jù)類型,它的轉(zhuǎn)換規(guī)則如下:
- 如果是Boolean值,true和false將分別轉(zhuǎn)換為1和0.
- 如果是數(shù)值,只是簡單的輸入和輸出。
- 如果是null值,返回0。
- 如果是undefined,返回NaN。
- 如果是字符串,遵循以下規(guī)則:
1,如果字符串中只包含數(shù)字(包括前面帶上加號(hào)或減號(hào)),則將其轉(zhuǎn)換為十進(jìn)制數(shù)值。
2,如果字符串是有效的浮點(diǎn)格式,如“1.1”,則將其轉(zhuǎn)換為對(duì)應(yīng)的浮點(diǎn)數(shù)值。
3,如果字符串中是有效的十六進(jìn)制格式,例如“0xf”,則將其轉(zhuǎn)換為對(duì)應(yīng)的十進(jìn)制數(shù)值。
4,如果字符串是空的,則將其轉(zhuǎn)換為0。
5,如果字符串包含上述格式之外的字符,則將其轉(zhuǎn)換為NaN。
*如果是對(duì)象,則調(diào)用對(duì)象的valueOf()方法,然后依照前面的規(guī)則轉(zhuǎn)換返回的值。如果轉(zhuǎn)換的結(jié)果是NaN,則調(diào)用對(duì)象的toString()方法,然后再依照前面的規(guī)則轉(zhuǎn)換返回的字符串的值。
例子:
console.log(Number(true));//1
console.log(Number(false));//0
console.log(Number(1));//1
console.log(Number(null));//0
console.log(Number(undefined));//NaN
console.log(Number("1"));//1
console.log(Number("00001"));//1
console.log(Number("1.1"));//1.1
console.log(Number("00001.1"));//1.1
console.log(Number("0xf"));//15
console.log(Number(""));//0
console.log(Number("1abc1.1"));//NaN
parseInt(),它在轉(zhuǎn)字符串時(shí),更多的時(shí)看其是否符合數(shù)值模式。他會(huì)忽略字符串前面的空格,只倒找到第一個(gè)非空格字符。如果第一個(gè)字符不是數(shù)字字符或者正負(fù)號(hào),它就會(huì)返回NaN;也就是說parseInt()轉(zhuǎn)換空字符串會(huì)返回NaN(Number()會(huì)返回0)。如果第一個(gè)字符是數(shù)字字符,parseInt()會(huì)繼續(xù)解析第二個(gè)字符,直到解析完所有的后續(xù)字符或者遇到了一個(gè)非數(shù)字字符。例如,“123木頭人”會(huì)被轉(zhuǎn)換為123。類似的“123.5”會(huì)被轉(zhuǎn)換為123,因?yàn)樾?shù)點(diǎn)不是有效的數(shù)字字符。
另外,如果字符串以“0x”開頭且后面跟數(shù)字字符,就會(huì)將其當(dāng)成一個(gè)十六進(jìn)制的整數(shù);如果字符串以“0”開頭且后面跟數(shù)字字符,就會(huì)將其當(dāng)成一個(gè)八進(jìn)制數(shù)來解析。
例子:
console.log(parseInt(""));//NaN
console.log(parseInt("123木頭人"));//123
console.log(parseInt("123.5"));//123
console.log(parseInt("0xA"));//10
console.log(parseInt("070"));//70,有問題哦,請(qǐng)注意
console.log(parseInt("080"));//80,如屬于八進(jìn)制
console.log(parseInt("0xG"));//NaN,不屬于十六進(jìn)制
這里就有一個(gè)問題了,如上文所說,如果是以0開頭的且后面跟數(shù)字字符,就會(huì)當(dāng)成一個(gè)八進(jìn)制來解析,但是parseInt("070")在我的最新版chrome瀏覽器中被解析為70而不是56,為啥呢?其實(shí)是在ECMAScript 3 JavaScript引擎中,“070”是被當(dāng)成八進(jìn)制字面量,但是在ECMAScript 5 JavaScript引擎中,parseInt()已經(jīng)不具有解析八進(jìn)制的能力了,因此,前面的零會(huì)被認(rèn)為無效。
但是如果我硬要解析八進(jìn)制咋整?parseInt()這個(gè)函數(shù)提供了第二個(gè)參數(shù):轉(zhuǎn)換時(shí)使用的基數(shù)(即多少進(jìn)制)。例子:
console.log(parseInt("0xAF",16));//175
console.log(parseInt("AF",16));//175,因?yàn)槊鞔_知道了以十六進(jìn)制進(jìn)行解析,那么“0x”就不需要了
console.log(parseInt("10",2));//2
console.log(parseInt("10",8));//8
console.log(parseInt("10",10));//10
console.log(parseInt("10",16));//16
parseFloat(),與parseInt()類似,它是從第一個(gè)字符開始解析每個(gè)字符,而且也是一直解析到字符串末尾,或者遇到一個(gè)無效的浮點(diǎn)數(shù)字字符為止。也就是說,字符串的第一個(gè)小數(shù)點(diǎn)是有效的,而第二個(gè)小數(shù)點(diǎn)就是無效的了。除了第一個(gè)小數(shù)點(diǎn)有效外,parseFloat()和parseInt()的第二個(gè)區(qū)別在于它始終都會(huì)忽略前導(dǎo)的零,只能解析十進(jìn)制。注意點(diǎn):如果字符串包含的是一個(gè)可解析為整數(shù)的數(shù),它就會(huì)返回整數(shù)。例子:
console.log(parseFloat("123木頭人"));//123
console.log(parseFloat("0xA"));//0
console.log(parseFloat("22.5"));//22.5
console.log(parseFloat("22.34.5"));//22.34
console.log(parseFloat("0908.5"));//908.5
console.log(parseFloat("2.125e7"));//31250000
| 字面量 | 含義 |
|---|---|
| \n | 換行 |
| \t | 制表 |
| \b | 退格 |
| \r | 回車 |
| \f | 進(jìn)紙 |
| \ | 斜杠 |
| \' | 單引號(hào)('),在用單引號(hào)表示的字符串中使用。例如:'He said,\'hey.\'' |
| \" | 雙引號(hào)("),在用雙引號(hào)表示的字符串中使用。例如:"He said,\"hey.\"" |
| \xnn | 以十六進(jìn)制代碼表示的一個(gè)字符(其中n為0~F)。例如,\x41表示“A” |
| \unnn | 以十六進(jìn)制代碼nnn表示的一個(gè)Unicode字符(其中n為0~F)。例如,\u03a3表示希臘字符Σ |
4.6 String類型
String類型用于表示由零或多個(gè)16為Unicode字符組成的字符序列,即字符串。字符串可以由雙引號(hào)或者單引號(hào)表示。
4.6.1 字符字面量
String數(shù)據(jù)類型包含一些特殊的字符字面量,也叫轉(zhuǎn)義序列,用于表示非打印字符,或者具有其他用途的字符。如下表:
| 字面量 | 含義 |
|---|---|
| \n | 換行 |
| \t | 制表 |
| \b | 退格 |
| \r | 回車 |
| \f | 進(jìn)紙 |
| \ | 斜杠 |
| \' | 單引號(hào)('),在用單引號(hào)表示的字符串中使用。例如:'He said,\'hey.\'' |
| \" | 雙引號(hào)("),在用雙引號(hào)表示的字符串中使用。例如:"He said,\"hey.\"" |
| \xnn | 以十六進(jìn)制代碼表示的一個(gè)字符(其中n為0~F)。例如,\x41表示“A” |
| \unnn | 以十六進(jìn)制代碼nnn表示的一個(gè)Unicode字符(其中n為0~F)。例如,\u03a3表示希臘字符Σ |
這些字符字面量可以出現(xiàn)在字符串中的任意位置,而且也將被看作一個(gè)字符來解析,例子:
var test ='This is the letter sigma: \u03a3.';
console.log(test.length);
這個(gè)例子中的變量text有28個(gè)字符,其中6個(gè)字符長的轉(zhuǎn)義序列被作為1個(gè)字符。
當(dāng)然,如果字符串中包含雙字節(jié)字符,那么length屬性可能不會(huì)精確地返回字符串中的字符數(shù)目。
4.6.2 字符串的特點(diǎn)
ECMAScript中的字符串是不可變的,也就是說,字符串一旦創(chuàng)建,它們的值就不能改變。要改變摸個(gè)變量保存的字符串,首先要銷毀原來的字符串,然后再用另一個(gè)包含新值的字符串填充該變量。
例子:
var lang = 'Java';
lang = lang + 'Script';
實(shí)現(xiàn)這個(gè)操做過程如下:首先創(chuàng)建一個(gè)能容納10個(gè)字符的新字符串,然后在這個(gè)字符串中填充“Java”和“Script”,最后一步是銷毀元來的字符串“Java”和字符串“Script”,因?yàn)樗麄儍蓚€(gè)已經(jīng)么有用了。這也就是很老舊的瀏覽器版本(例如版本低于1.0的FireFox、IE6等)拼接字符串會(huì)慢的原因。但是這些瀏覽器后來的版本已經(jīng)解決了這個(gè)低效率的問題。
4.6.3 轉(zhuǎn)換為字符串
把一個(gè)值轉(zhuǎn)換成字符串有兩種方式:
- 方法一,toString(),數(shù)字、布爾值、對(duì)象和字符串都有toString()方法。但null和undefined值么有這個(gè)方法。
調(diào)用toString()方法時(shí),可以傳遞一個(gè)參數(shù),即輸出數(shù)值的基數(shù)。默認(rèn)以十進(jìn)制格式返回?cái)?shù)值的字符串表示。它可以輸出二進(jìn)制、八進(jìn)制、十六進(jìn)制,乃至其他任意有效進(jìn)制格式表示的字符串值。例子:
var num = 10;
console.log(num.toString());//"10"
console.log(num.toString(2));//"1010"
console.log(num.toString(8));//"12"
console.log(num.toString(10));//"10"
console.log(num.toString(16));//"a"
- 方法二,String(),轉(zhuǎn)型函數(shù),如同Number(),能夠?qū)⑷魏晤愋偷臄?shù)值轉(zhuǎn)成字符串,轉(zhuǎn)換規(guī)則:
- 如果值有toString()方法,則調(diào)用該方法,并返回相應(yīng)的結(jié)果;
- 如果值是null,則返回“null”;
- 如果值是undefined,則返回“undefined”。
4.7 Object類型
ECMAScript中的對(duì)象其實(shí)就是一組數(shù)據(jù)和功能的集合。Object類型是所有它的實(shí)例的基礎(chǔ)。換句話說,Object類型所具有的任何屬性和方法也同樣存在與更具體的對(duì)象中。
Object的每個(gè)實(shí)例都具有下列屬性和方法。
- constructor:保存著用于創(chuàng)建當(dāng)前對(duì)象的函數(shù)。構(gòu)造函數(shù)(constructor)就是Object()。
- hasOwnProperty(propertyName):用于檢查給定的屬性再當(dāng)前對(duì)象實(shí)例中(而不是再實(shí)例的原型中)是否存在。
- isPrototypeOf(object):用于檢查傳入的對(duì)象是否是當(dāng)前對(duì)象的原型。(后面會(huì)討論到原型)
- propertyIsEnumerable(propertyName):用于檢查給定的屬性是否能夠使用for-in語句來枚舉。
- toLocaleString():返回對(duì)象的字符串表示,該字符串與執(zhí)行環(huán)境的地區(qū)對(duì)應(yīng)。
- toString():返回對(duì)象的字符串表示。
- valueOf():返回對(duì)象的字符串、數(shù)值或布爾值表示。通常與toString()方法的返回值相同。
5 操作符
ECMA-262描述了一組用戶操做數(shù)據(jù)只的操作符,包括算術(shù)操作符、位操作符、關(guān)系操作符和相等操作符。他們能夠適用于很多值,例如字符串、數(shù)字值、布爾值,甚至于對(duì)象。不過,再應(yīng)用于對(duì)象時(shí),相應(yīng)的操作符通常都會(huì)調(diào)用對(duì)象的valueOf()和(或)toString()方法,以便取得可以操做的值。
5.1 一元操作符
只能操做一個(gè)值的操作符叫做一元操作符
1 遞增和遞減操作符
遞增和遞減借鑒與C,而且各有兩個(gè)版本:前置型和后置型。
前置型:
var age= 28;
++age;
age = age + 1;
--age;
age = age - 1;
var age = 28;
var anotherAge = --age + 2;
console.log(age);//27
console.log(anotherAge);//29
后置型:
var age = 28;
age++;
age--;
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2;//22
var num4 = num1 + num2;//21
上面的例子,應(yīng)該明白了前置和后置的區(qū)別。
所有這4個(gè)操作符對(duì)任何值都適用,也就是說它們不僅僅適用于整數(shù),還可以用于字符串、布爾值、浮點(diǎn)數(shù)值和對(duì)象。在應(yīng)用于不同的值時(shí),遞增和遞減操作符遵循下列規(guī)則。
- 在應(yīng)用于一個(gè)包含有效數(shù)字字符的字符串時(shí),先將其轉(zhuǎn)換為數(shù)字值,再執(zhí)行加減1的操作。字符串變量變成數(shù)值變量。
- 在應(yīng)用于一個(gè)不包含有效數(shù)字字符的字符串時(shí),將變量的值設(shè)置為NaN。字符串變量變成數(shù)值變量。
- 在應(yīng)用于布爾值false時(shí),先將其轉(zhuǎn)換為0再執(zhí)行加減1的操作。布爾值變量變成數(shù)值變量。
- 在應(yīng)用于布爾值true時(shí),先將其轉(zhuǎn)換為1再執(zhí)行加減1的操作。布爾值變量變成數(shù)值變量。
- 在應(yīng)用于浮點(diǎn)數(shù)值時(shí),執(zhí)行加減1的操作。
- 在應(yīng)用于對(duì)象時(shí),先調(diào)用對(duì)象的valueOf()方法以取得一個(gè)可供操作的值,然后對(duì)該值進(jìn)行前述規(guī)則。如果是時(shí)NaN,則再調(diào)用toString()方法后再應(yīng)用前述規(guī)則。對(duì)象變量變成數(shù)值變量。
例子:
var s1 = "2";
var s2 = "A";
var b1 = false;
var b2 = true;
var f = 1.1;
var o = {
valueOf: function () {
return -2;
}
};
console.log(++s1);//3
console.log(++s2);//NaN
console.log(++b1);//1
console.log(++b2);//0
console.log(--f);//0.10000000000000009(由于浮點(diǎn)舍入錯(cuò)誤所致)
console.log(--o);//-2
var s3 = "2";
var s4 = "A";
var b3 = false;
var b4 = true;
var f1 = 1.1;
var o1 = {
valueOf: function () {
return -2;
}
};
console.log(s3++);//2
console.log(s4++);//NaN
console.log(b3++);//0
console.log(b4++);//1
console.log(f1--);//1.1
console.log(o1--);//-1
2 一元加和減操作符
簡單說,一元加操作符(+)放在數(shù)值前面,對(duì)數(shù)值不會(huì)產(chǎn)生任何影響。一元減操作符主要用于表示負(fù)數(shù)。
例子:
var s1 = "1";
var s2 = "1.1";
var s3 = "a";
var b = false;
var f = 1.1;
var o = {
valueOf: function () {
return -1;
}
};
console.log(+s1);//1
console.log(+s2);//1.1
console.log(+s3);//NaN
console.log(+b);//0
console.log(+f);//1.1
console.log(+o);//-1
console.log(-s1);//-1
console.log(-s2);//1.1
console.log(-s3);//NaN
console.log(-b);//-0
console.log(-f);//-1.1
console.log(-o);//1