第一篇 關(guān)于基本概念

1.1 數(shù)據(jù)類型

JavaScript的基本數(shù)據(jù)類型有undefined、null、boolean、number、string以及一種較為復(fù)雜的數(shù)據(jù)類型object
由于JS的數(shù)據(jù)類型是松散類型的,因此需要使用typeof操作符對(duì)數(shù)據(jù)類型進(jìn)行檢測,這里著重提一下:

  typeof null                // "object"
  typeof function            // "function"

函數(shù)盡管不是一種數(shù)據(jù) 類型,但由于其特殊的屬性,有必要與其他數(shù)據(jù)類型進(jìn)行區(qū)分。

1.1.1 Undefined

在變量聲明但未定義時(shí),內(nèi)部會(huì)自動(dòng)為其賦值為undefined。不過,包含undefined值的變量與未聲明的變量之間仍然存在一些差別,我們來看下面兩段代碼:

  var message                // 該變量聲明后默認(rèn)為undefined
  // age 為未聲明的變量
  alert( message )           // "undefined"
  alert( age )               // 發(fā)生錯(cuò)誤
  var message                // 該變量聲明后默認(rèn)為undefined
  // age 為未聲明的變量
  typeof message             // "undefined"
  typeof age                 // "undefined"

雖然在alert中age會(huì)產(chǎn)生錯(cuò)誤,但在typeof中未聲明的age也會(huì)返回undefined值,這是比較奇怪的現(xiàn)象!同時(shí),typeof是唯一地能對(duì)未聲明變量進(jìn)行的操作。

1.1.2 Null

null值表示一個(gè)空對(duì)象的指針,undefined實(shí)際上派生自null值,在JS的相等性測試中,兩者是相等的,注意這里的相等(==)全等(===)不同。

  null == undefined          // true

1.1.3 Boolean

Boolean類型分為兩種,即true和false,這里要注意大小寫,Boolean是對(duì)大小寫敏感的。
在不同數(shù)據(jù)類型中,Boolean類型有不同的表現(xiàn)形式,具體見下表。

數(shù)據(jù)類型 轉(zhuǎn)換為true的值 轉(zhuǎn)換為false的值
Boolean true false
String 非空字符串 " " ( 空字符串 )
Number 非零數(shù)字和無窮大 0或NaN
Object 任何對(duì)象 null
Undefined n/a undefined

上表中Undefined一行中,n/a是not applicable的縮寫,意為 “ 不適用 ”

1.1.4 Number

Number類型使用IEEE754格式來表示整數(shù)和浮點(diǎn)數(shù)。浮點(diǎn)數(shù)的最高精度是17位小數(shù),但在進(jìn)行計(jì)算時(shí)它的精度遠(yuǎn)遠(yuǎn)不如整數(shù),如0.1+0.2的結(jié)果不是0.3,而是0.30000000000000004。

  if ( a+b == 0.3 ) {            // 返回false,因此不要做這種測試!
      alert ( " you got 0.3 " )
  }

在JavaScript中,存在能夠保存的最大值Number.MAX_VALUE和最小值Number.MIN_VALUE,超過這兩個(gè)值即為Infinity-Infinity。

該類型中有一個(gè)特殊的數(shù)值,即NaN(Not a Number),該值是為了防止在數(shù)值計(jì)算中返回非數(shù)值的情況,其本身有兩個(gè)特點(diǎn)。

  • 涉及NaN的操作均會(huì)返回NaN;
  • NaN與任何值都不想等,包括它自己。

數(shù)值轉(zhuǎn)換:Number ( )、parserInt ( )、parserFloat ( )之間的比較。Number ( )可以接受任何數(shù)據(jù)類型,而parserInt ( )、parserFloat ( )只能接受字符串類型

  • ** Number ( ) **
  1. true => 1
  2. false 或 null => 0
  3. undefined => NaN
  4. string => 若為數(shù)字(包括二進(jìn)制、十進(jìn)制、八進(jìn)制、十六進(jìn)制和浮點(diǎn)數(shù)),均轉(zhuǎn)換成十進(jìn)制對(duì)應(yīng)的數(shù)字;若為空字符串(" "),轉(zhuǎn)換為0;其他情況,均轉(zhuǎn)換為NaN
  5. object => 先調(diào)用valueOf( )方法,依次按照之前的規(guī)則進(jìn)行轉(zhuǎn)換,若返回為NaN,則調(diào)用toString( )方法,再依次按照前面的規(guī)則進(jìn)行轉(zhuǎn)換
  • parserInt ( )parserFloat ( )
    parserInt ( )從第一個(gè)不為空格的數(shù)字字符開始檢測,直到檢測到非數(shù)字字符為止,它可以解析不同進(jìn)制的數(shù)值,并返回對(duì)應(yīng)十進(jìn)制的值,通過傳入第二個(gè)參數(shù),即進(jìn)制值來實(shí)現(xiàn);相比之下,parserFloat ( )只能解析十進(jìn)制的浮點(diǎn)數(shù),且能解析第一個(gè)小數(shù)點(diǎn),遇到第二個(gè)小數(shù)點(diǎn)會(huì)自動(dòng)忽略。

下面是一些常見的例子:

  Number( "Hello World" )        // NaN
  Number( undefined )            // NaN
  Number( " " )                  // 0
  Number( "0000011" )            // 11
  Number( true )                 // 1
  parseInt( "1234Joker" )        // 1234
  parseInt( " " )                // 0
  parseInt( "0xA" )              // 10
  parseInt( 22.5 )               // 22
  parseInt( "70" )               // 70
  parseInt( "10", 2 )            // 2
  parseInt( "10", 8 )            // 8
  parseInt( "10", 10 )           // 10
  parseInt( "10", 16 )           // 16
  parseFloat( "0xA" )            // 0
  parseFloat( "22.5" )           // 22.5
  parseFloat( "22.4.5" )         // 22.4

1.1.5 String

String類型用于表示由零個(gè)或多個(gè)16位字符組成的Unicode字符組成的字符序列,即字符串??梢杂茫?)或者('),但兩邊的引號(hào)類型要相等。字符串帶有length屬性,用于表示字符串的長度。

要想將別的數(shù)據(jù)類型如數(shù)值、布爾值、對(duì)象和字符串轉(zhuǎn)換為字符串類型,可以使用toString( )方法,不過null和undefined值沒有這個(gè)方法,需要使用轉(zhuǎn)型函數(shù)String( )。

1.1.6 Object

簡單來說,對(duì)象即為一組數(shù)據(jù)和功能的集合,關(guān)于對(duì)象的具體內(nèi)容,會(huì)在后續(xù)文章中進(jìn)行闡述

1.2 操作符

1.2.1 一元操作符

  • 遞增和遞減操作符
    這種操作符又各自分為兩種,前置型和后置型,下面以遞減為例
  var num1 = 2;
  var num2 = 20;
  var num3 = --num1 + num2;      // 等于21
  var num4 = num1 + num2;        // 等于21
  var num1 = 2;
  var num2 = 20;
  var num3 = num1-- + num2;      // 等于22
  var num4 = num1 + num2;        // 等于21

從上面的代碼中可以看出,前置型操作符使用num-1進(jìn)行運(yùn)算,而后置型操作符則使用num進(jìn)行運(yùn)算。此外,這四個(gè)操作符對(duì)任何值均有效。

  • 一元加和減操作符

加操作符對(duì)數(shù)值不會(huì)有任何影響,減操作符主要用于表示負(fù)數(shù),這兩個(gè)操作符應(yīng)用于非數(shù)值類型的值時(shí),其轉(zhuǎn)換規(guī)則與Number( )相同,這里不再贅述。

1.2.2 布爾操作符

布爾操作符一共有三種:非(NOT)、與(AND)、或(OR)

  • 邏輯非
數(shù)據(jù)類型 返回值
空字符轉(zhuǎn)、數(shù)值0、null、NaN、undefined true
對(duì)象、非空字符串、非0數(shù)值(包括Infinity) false
  • 邏輯與
    可以應(yīng)用于任何數(shù)據(jù)類型,不一定返回布爾值,具體規(guī)則:

1.若第一個(gè)操作數(shù)是對(duì)象,則返回第二個(gè)操作數(shù);
2.若第二個(gè)操作數(shù)是對(duì)象,則只有當(dāng)?shù)谝粋€(gè)操作數(shù)返回true的情況下才返回該對(duì)象;
3.若兩個(gè)操作數(shù)都是對(duì)象,則返回第二個(gè)操作數(shù);
4.若第一個(gè)操作數(shù)是nulll,則返回null;
5.若第一個(gè)操作數(shù)是NaN,則返回NaN;
6.若第一個(gè)操作數(shù)是undefined,則返回undefined。

  • 邏輯或
    可以應(yīng)用于任何數(shù)據(jù)類型,不一定返回布爾值,具體規(guī)則:

1.若第一個(gè)操作數(shù)是對(duì)象,則返回第一個(gè)操作數(shù);
2.若第一個(gè)操作數(shù)求值為false,則返回第二個(gè)操作數(shù);
3.若兩個(gè)操作數(shù)都是對(duì)象,則返回第一個(gè)操作數(shù);
4.若兩個(gè)操作數(shù)都是null,則返回null;
5.若兩個(gè)操作數(shù)都是NaN,則返回NaN;
6.若兩個(gè)操作數(shù)都是undefined,則返回undefined。

邏輯與邏輯或都屬于短路操作,即如果第一個(gè)操作數(shù)能決定結(jié)果,那么不會(huì)對(duì)第二個(gè)操作數(shù)求值。

1.2.3 乘性操作符

乘性操作符總共有三種:乘法、除法和求模。這里只列舉一些較為特殊的用法。
乘法:

  • 若有一個(gè)操作數(shù)為NaN,則返回NaN;
  • 若是Infinity與0相乘,則返回NaN;
  • 若是Infinity與非0數(shù)相乘,則返回Infinity或者-Infinity

除法:

  • 若是Infinity被Infinity除,則返回NaN;
  • 若是0被0除,則返回NaN;
  • 若是非零的有限數(shù)被0除,則返回Infinity或者-Infinity

1.2.4 加性操作符

特殊用法:

  Infinity + Infinity           // Infinity
  -Infinity + -Infinity         // -Infinity
  Infinity + -Infinity          // NaN
  +0 + +0          // +0
  +0 + -0          // +0
  -0 + -0          // -0

另外,當(dāng)加性運(yùn)算符遇到字符串時(shí),就會(huì)將其他數(shù)據(jù)類型轉(zhuǎn)換成字符串類型,然后進(jìn)行拼接。

  "" + 123 + 456         // 123456

1.2.5 關(guān)系操作符

關(guān)系操作符主要有小于(<)、大于(>)、小于等于(<=)、大于等于(>=),這些操作符均返回一個(gè)布爾值。

需要注意:

  1. 若兩邊均為字符串,則比較兩個(gè)字符串的編碼值;
  2. 若又一個(gè)操作數(shù)為數(shù)值,則領(lǐng)一個(gè)操作數(shù)轉(zhuǎn)換成數(shù)值再進(jìn)行比較。
  var res = "Brick" < "alphabet"         // true
  var res2 = "23" < "3"                  // true

還有一個(gè)比較有意思的現(xiàn)象,根據(jù)規(guī)則,NaN與任何值進(jìn)行比較均返回false,所以:

  var res1 = NaN < 3            // false
  var res2 = NaN >= 3           // false

1.2.6 相等操作符

相等操作符可以分為兩組,一種為相等和不想等(== 和 !=),另一種為全等和不全等(=== 和 !==)。== 和 != 會(huì)先轉(zhuǎn)換數(shù)操作數(shù)(稱為強(qiáng)制轉(zhuǎn)型),然后再比較它們的相等性;而 === 和 !== 則要求相比較的兩個(gè)操作數(shù)類型和值均相等。
下面列舉一些相等操作符的特殊用法:

  null == undefined             // true
  "NaN" == NaN                  // false
  5 == NaN                      // false
  NaN == NaN                    // false
  NaN != NaN                    // true
  false == 0                    // true
  true == 1                     // true
  true == 2                     // false
  undefined == 0                // false
  null == 0                     // false
  "5" == 5                      // true
  "5" === 5                     // false

除以上幾種操作符以外,javascript還提供了條件操作符、賦值操作符、逗號(hào)操作符,由于這幾種操作符較為簡單,這里不進(jìn)行詳細(xì)介紹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容