JavaScript的基本概念、基礎語法(數據類型、運算符)

1、什么是JavaScript?

JavaScript一種直譯式腳本語言,是一種動態類型、弱類型、基于原型的語言,內置支持類型。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用于客戶端的腳本語言,最早是在HTML(標準通用標記語言下的一個應用)網頁上使用,用來給HTML網頁增加動態功能。

在1995年時,由Netscape公司的Brendan Eich,在網景導航者瀏覽器上首次設計實現而成。因為NetscapeSun合作,Netscape管理層希望它外觀看起來像Java,因此取名為JavaScript。但實際上它的語法風格與SelfScheme較為接近。

為了取得技術優勢,微軟推出了JScript,CEnvi推出ScriptEase,與JavaScript同樣可在瀏覽器上運行。為了統一規格,因為JavaScript兼容于ECMA標準,因此也稱為ECMAScript

以上摘自百度百科,從這段論述我們可以看出JavaScript:

  • 直譯式腳本語言、動態類型、弱類型、基于原型的語言;
  • 解釋器為JavaScript引擎(瀏覽器的一部分);
  • 廣泛應用于客戶端,最早用于給HTML網頁增加動態功能;
  • 誕生于1995年,在網景導航者瀏覽器上設計實現;
  • 與java沒有關系,兼容ECMA標準,也被稱為ECMAScript。

2、JavaScript的基本構成

英語語法是針對英語語言進行研究后,系統地總結歸納出來的一系列語言規則。語法是組詞造句的規則,是把合適的詞放進合適位置的語言(句子)規則,語法可以分成為兩大部分:分別為詞法和句法。詞法包括各類詞的形態及其變化,句法主要講句子的種類和類型,句子成分以及遣詞造句的規律。語法的精髓在于掌握語言的使用。

以上摘自百度百科(英語語法的定義),從這段論述我們可以看出英文的語法實質上:

  • 是組詞和造句的一系列規則;
  • 主要分為詞法和句法,實質上英文就是由單詞和語句構成。

標示符與關鍵字

雖然自然語言和編程語言有一定差異,但我個人感覺原理上的東西應該是想通的,JavaScript作為一門腳本語言,它的基本構成部分應該就是標示符與語句。標示符類似于英文中的單詞,而語言類似于英文中的短語,當然各自的功能是不同

  • 所謂標示符是JavaScript中定義的符號的名字,他可以是變量、函數、屬性的名字,也可以是函數的參數名等等。其命名應該注意:
  • 區分大小寫;
  • 第一個字符必須是字母、下劃線(_)、或者是$;
  • 后面可以是字母、數字、下劃線、$;

另外需要注意關鍵字和保留字!

  • 關鍵字是JavaScript引擎使用的的一些字,如果標示符使用關鍵字,那么可能會影響程序的正常運行,以下為關鍵字:
    break else new var
    case finally return void
    catch for switch while
    continue function this with
    default if throw
    delete in try
    do instanceof typeof

  • 保留字是JS未來在發展演變過程中可能用到的的字符,因此也不能用來做標示符,以下為保留字:
    abstract enum int short
    boolean export interface static
    bye extends long super
    char final native synchronized
    class float package throws
    const goto private transient
    debugger implements protected volatile
    doubler import public

變量的輸出方式

輸出變量的方式主要有四種:alert(),console.log(),document.write,document.title;

語句(statement)

  • 語句(statement)是為了完成某種任務而進行的操作;
  • JavaScript中語句以;結束,一行可以包含多條語句,如果省略分號不會產生語法錯誤,解釋器會自動判斷語句結束;

3、數據類型及分類

JavaScript語言的每一個值,都屬于某一種數據類型。JavaScript的數據類型,共有六種。

  • 數值(number):整數和小數(比如1和3.14)
  • 字符串(string):字符組成的文本(比如"Hello World")
  • 布爾值(boolean):true(真)和false(假)兩個特定值
  • undefined:表示“未定義”或不存在,即此處目前沒有任何值
  • null:表示空缺,即此處應該有一個值,但目前為空
  • 對象(object):各種值組成的集合

原始類型和復雜類型

  • 數值、字符串、布爾值稱為原始類型(primitive type)的值,即它們是最基本的數據類型,不能再細分了。

  • 將對象稱為復雜類型(complex type)的值,因為一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器。對象又可以分成四個子類型:

  • 狹義的對象(object)

  • 數組(array)

  • 函數(function)

  • 正則表達式 (regexp)

  • 至于undefined和null,一般將它們看成兩個特殊值。

  • null表示空值,表示該處的值現在為空;

  • undefined表示未定義,即此處的值目前是不存在的;

字符串類型

js中雙引號與單引號包裹的字符,都是字符串數據類型,但是與php不同的是,雙引號并不能夠解析變量;


字符串類型
  • 上圖可以看出,雙引號并不能夠解析變量

undefined數據類型

使用var聲明變量但是未對其進行初始化時,該變量的值就是undefined;

簡單實例1

也就是說變量聲明了,但是未初始化,此時變量默認的值就是undefined;

  • 值得注意的是未初始化的變量和尚未定義的變量有一定的區別:雖然使用typeof操作符來進行數據類型判斷的時候,都是返回的是undefined;

Null數據類型

從邏輯角度來看,null值表示一個空對象指針,因此使用typeof操作符檢測的null的時候,返回的都是object;


typeof檢測null返回的是object

如果定義的變量準備在將來保存對象,則最好將該變量初始化為null而 不是其他值;

布爾類型(boolean)

布爾值代表“真”和“假”兩個狀態。“真”用關鍵字true表示,“假”用關鍵字false表示。布爾值只有這兩個值;

  • 要注意的是:
    true和false是區分大小寫的,也就是說False和True都不是布爾值,只是標識符 ;

下列運算符會返回布爾值:

  • 兩元邏輯運算符: && (And),|| (Or)
  • 前置邏輯運算符: ! (Not)
  • 相等運算符:===,!==,==,!=
  • 比較運算符:>,>=,<,<=

在這里需要注意的是:如果JavaScript預期某個位置應該是布爾值,會將該位置上現有的值自動轉為布爾值。轉換規則是除了下面六個值被轉為false,其他值都視為true:

  • undefined
  • null
  • false
  • 0
  • NaN
  • ""(空字符串)
需要特別注意的是這幾種特殊情況

需要特別注意的是,空數組([])和空對象({})以及字符串"0"對應的布爾值,都是true。

Object

對象,就是一種無序的數據集合,由若干個“鍵值對”(key-value)構成。key我們稱為對象的屬性,value可以是任何JavaScript類型,甚至可以是對象.
對象可以這么寫:
var o = new object(); o.name = 'wuyanwen'; o.age = '24 ;'
但是更加常用 的寫法是這樣的
var o ={ name: ' wuyanwen'; age: '24 '; }
key可以使用引號包裹,也可以直接寫,對象有一個默認的方法toString,用來返回對象的字符串表示,如下所示:

4、運算符

  • 算術運算符

  • 賦值運算符

賦值運算符用于給變量賦值,最常見的賦值運算符,當然就是等號,表達式x=y表示將y賦值給x。除此之外,JavaScript還提供其他11個賦值運算符。

  • 比較運算符

比較運算符比較兩個值,然后返回一個布爾值,表示是否滿足比較條件。JavaScript提供了8個比較運算符。

  • 布爾運算符

  • 小括號

在JavaScript中,圓括號是一種運算符,它有兩種用法:

  • 如果把表達式放在圓括號之中,作用是求值;

  • 如果跟在函數的后面,作用是調用函數。
    把表達式放在圓括號之中,將返回表達式的值。

  • void

void運算符的作用是執行一個表達式,然后返回undefined。

  • 逗號運算符

逗號運算符用于對兩個表達式求值,并返回后一個表達式的值。

5、運算符優先級和結合性

有的運算符左結合,有的運算符右結合。

  • 1.typeof的優先級非常高,比加減乘除的優先級都要高,因此我們在進行復雜運算的時候,應該注意加括號;

  • 2.++、--是右結合的操作符(優先級最高的幾個都是右結合),而且比加減乘除優先級高。同時自增、自減運算符的運算數得是左值(可以放在賦值符號左邊的值),而不能是常數;

    1. 賦值運算符的優先級非常的低;
  • 4.邏輯非!也在優先級隊列的前端,比加減乘除高,但邏輯與、邏輯或優先級很低,不如加減乘除

詳細參考

復習部分:

1、JavaScript 定義了幾種數據類型? 哪些是原始類型?哪些是復雜類型?原始類型和復雜類型的區別是什么?

JavaScript定義了6種數據類型,其中number、string、boolean為原始類型,而對象(Object)是復雜類型,原始類型和復雜類型的區別主要在于原始類型不可以再進行數據類型的分類,而復雜類型比如說對象(Object)一般是幾個原始類型值的組合。

2、typeof和instanceof的作用和區別?

JavaScript有三種方法可以確定一個值到底是什么數據類型:

  1. typeof運算符;
  2. instanceof運算符;
  3. Object.prototype.toString方法;
利用typeof運算符確定原始類型數據類型.jpg
  • 1、typeof運算符對于原始類型number、string、boolean分別返回number 、string、以及boolean;
利用typeof運算符確定原始類型數據類型.jpg
  • 2、typeof運算符對于undefined類型,返回undefined,利用這一點可以利用typeof運算符來檢查一個沒有聲明的變量,而不報錯;
  • 3、typeof運算符對于函數 返回function;
  • 4、除了以上幾種情況,其他情況情況一般返回為object(對象);

instanceof運算符:
instanceof用于判斷一個變量是否某個對象的實例,運算符返回一個布爾值。instanceof只能用來判斷對象和函數,不能用來判斷字符串和數字等。(這部分留待后續進行深入的研究)

3、如何判斷一個變量是否是數字、字符串、布爾、函數?

我們可以利用typeof運算符來判斷一個變量的數據類型。

4、NaN是什么? 有什么特別之處?

NaN即為Not a Number,表示是一個非數字,NaN與任何值都不相等,包括它自己。NaN是屬于數字類型的。

5、如何把非數值轉化為數值?

有三個函數可以將非數值轉換為數值:

三種將非數值轉化為數值的方法.jpg
  • 1、Number()
  • 2、parseInt()
  • 3、parseFloat()

6、==與===有什么區別?

== 叫做相等運算符;
=== 叫做嚴格運算符;
嚴格運算符(===)的運算規則如下:

  • (1)不同類型值
    如果兩個值的類型不同,直接返回false;

  • (2)同一類型的原始類型值
    同一類型的原始類型值(數值,布爾值,字符串)比較時,值相同就返回true,值不同返回false;

  • (3)同一類型的復雜類型值
    兩個復合類型(對象、數組、函數等)數據比較時,不是比較他們的值是否相等,而是比較他們是否指向同一個對象;

  • (4)undefined和null
    undefined 和 null 與自身嚴格相等。

相等運算符(==)在比較相同類型的數據時,與嚴格相等運算符完全一樣;
在比較不同類型的數據時,相等運算符會先將數據進行類型轉換,然后再用嚴格相當呢個運算符比較。

  • (1)、原始類型的值
    原始類型的數據會轉換成數值類型再進行比較,字符串和布爾值會轉換成數值,然后再進行比較;

  • (2)、對象和原始類型值的比較
    對象(指廣義的對象,包括數值和函數等)與原始類型的值比較時,對象轉換為原始類型的值,再進行比較;

  • (3)、undefined和null
    undefined和null與其他類型的值比較時,結果都為false,他們互相比較時結果是true;

  • (4)、在這里要注意一些相等運算符的的缺點
    相等運算符隱藏的類型轉換,會帶來一些違反直覺的結果。

建議使用嚴格相等符(===),這樣能夠減少代碼的其他異常問題。

知乎的相關討論

7、break與continue有什么區別

break與continue兩個英文意思一個是破壞,一個是持續,兩者區別可以這樣理解:

假如工廠存在一條循環回用流水線,當執行到某工段的時候break了,整條循環回用生產線直接全線停產,執行后續生產線的的工作內容,(相當于跳出了這個循環);

而continue則是執行到某工段后,滿足了某個特定條件 ,直接略過循環生產線的后續工作內容,再次從頭開始.
這么說可能太抽象了,還是舉兩個例子吧!
for(var i = 1; i< 10; i++){ if(i % 4 === 0){ break; } console.log(i); }

for(var i = 1; i< 10; i++){ if(i % 4 === 0){ continue; } console.log(i); } console.log("continue略過了i===4的階段,執行后續的循環,循環結束后,執行循環體后操作")

image.png

8.void 0 和 undefined在使用場景上有什么區別?

void 0 的值永遠都是undefined,而undefined在某些時候可以被賦值,如果需要判斷一個變量的值是否為undefined,用void 0 比較有保證

9.

10.

11.

12.

13.

14.1

14.2

14.3

14.4

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容