《JavaScript語言入門教程》記錄整理:入門和數據類型

来源:https://www.cnblogs.com/codemissing/archive/2020/07/29/JavaScript_intro_DataType.html
-Advertisement-
Play Games

本系列基於阮一峰老師的《JavaScrip語言入門教程》或《JavaScript教程》記錄整理,教程採用知識共用 署名-相同方式共用 3.0協議。這幾乎是學習js最好的教程之一(去掉之一都不過分) 最好的教程而阮一峰老師又採用開源方式共用出來,之所以重新記錄一遍,一是強迫自己重新認真讀一遍學一遍;二 ...


目錄

本系列基於阮一峰老師的《JavaScrip語言入門教程》或《JavaScript教程》記錄整理,教程採用知識共用 署名-相同方式共用 3.0協議。這幾乎是學習js最好的教程之一(去掉之一都不過分)

最好的教程而阮一峰老師又採用開源方式共用出來,之所以重新記錄一遍,一是強迫自己重新認真讀一遍學一遍;二是對其中知識點有個自己的記錄,加深自己的理解;三是感謝這麼好的教程,希望更多人閱讀瞭解

入門篇

js介紹

  1. JavaScript 是一種輕量級的腳本語言和嵌入式(embedded)語言,其只能通過宿主環境(host,瀏覽器或node環境)提供I/O操作
  2. 語法角度,JS是一種"對象模型"語言。支持函數式編程、"面向對象"編程、過程式編程等
  3. js核心語法包括:基本的語法構造(比如操作符、控制結構、語句)和標準庫(就是一系列具有各種功能的對象比如ArrayDateMath等)。然後就是宿主提供的API(比如瀏覽器提供的BOM、DOM和Web互聯網相關的類;Node環境提供文件操作API、網路通信API等)
  4. JavaScript 的所有值都是對象
  5. js可以採用事件驅動(event-driven)和非阻塞式(non-blocking)設計,實現高併發、多任務處理

歷史

  1. 1995年,Brendan Eich 只用了10天,完成了js的第一版,其設計借鑒了C、java、Scheme、Awk、Self、Perl、Python等多種語言,同時也留下了各種設計缺陷(導致常常需要學習各種解決問題的模式)
  2. JavaScript與Java是兩種不同的語言,兩者的關係僅僅是js的基本語法和對象體系最開始是想要模仿Java,而後又與當時Java的公司Sun有合作,也藉助Java的聲勢,從而後來改名叫JavaScript
  3. ECMAScript 和 JavaScript 的關係是,前者是後者的規格,後者是前者的一種實現。ECMAScript 只用來標準化 JavaScript 的基本語法結構。但其他標準如 DOM 的標準就是由 W3C組織(World Wide Web Consortium)制定的
  4. 2007年,ECMAScript 4.0版草案發佈,但是過於激進,導致後面中止了 ECMAScript 4.0 ,將其中一小部分功能發佈為ECMAScript 3.1。之後又將其改名為 ECMAScript 5。
  5. 2015年6月,ECMAScript 6 正式發佈,且更名為“ECMAScript 2015”。之後每年發佈一個ECMAScript版本
  6. 周邊大事記

基本語法

  1. js執行單位是行(line),一行一行地執行,一般,一行就是一個語句
  2. 語句(statement)執行某種操作、表達式(expression)用於得到返回值。凡是 JavaScript 語言中預期為值的地方,都可以使用表達式(這一點使js某些使用很靈活)
  3. 語句以分號結尾,一個分號表示一個語句結束。多個語句可以寫在一行內。分號前無內容,表示空語句。表達式不需要分號結尾
  4. 變數是對“值”的具名引用,即為"值"取名。變數的名字就是變數名。如下使用var聲明一個變數a,並賦值1
var a=1;
  1. 只聲明變數而不賦值,則該變數的值是undefined,表示"無定義"。同時變數賦值時不寫var也有效,但不建議。變數必須先聲明再使用,否則會報錯not defined
  2. 一條var命令可以聲明多個變數。js是動態類型語言,變數類型可以隨時更改。
var a = 1;
a = 'hello';
  1. 使用var重新聲明一個已存在的變數,是無效的,重新聲明時賦值,相當於重新賦值
  2. 變數提升:js的執行方式是,先解析代碼,獲取所有被聲明的變數,然後再一行一行地運行,這樣就會導致所有變數的聲明語句,會被提升到代碼的頭部,這叫做變數提升(hoisting)
  3. 標識符(identifier)指的是識別各種值的合法名稱。比如變數名、函數名。js標識符大小寫敏感。標識符的命名規則是:只能以字母、下劃線(_)和美元符號($)開頭,從第二個字元開始還可以使用數字。
  4. js標識符中的字母指的是Unicode字母。因此中文標識符也可以使用
  5. js中的保留字不能用於標識符,保留字是指js中用來表示特定含義的字元,如return、class、true、false、function等
  6. 註釋:註釋用來對代碼進行解釋,js引擎執行時會忽略註釋部分。//表示單行註釋。/* */表示多行註釋
  7. js使用大括弧表示"區塊"(block)。對於var命令,js的區塊不構成單獨的作用域(scope)
  8. 條件語句:
  • ifif...else...結構,根據條件的布爾值判斷執行。

  • switch結構判斷表達式的值是否與case相符並執行,如果都不符則執行最後的defaultcasebreak不能少,否則當前case代碼塊執行完會接著執行下一個case。switch語句部分和case語句部分,都可以使用表達式,這就是js中可以為值的地方,都可以使用表達式的體現,如下:

switch (1 + 3) {
  case 2 + 2:
    f();
    break;
  default:
    neverHappens();
}

switch語句的值和case語句的值,比較時採用的是嚴格相等運算符(===)

  • ?:三元運算符:如下,條件true,執行"表達式1",否則執行"表達式2",然後獲取對應返回值
(條件) ? 表達式1 : 表達式2
  1. 迴圈語句:重覆執行某個操作
  • while 迴圈:迴圈條件和代碼塊,條件為真,就迴圈執行代碼塊

  • for 迴圈:可以指定迴圈的起點、終點和終止條件。分為初始化表達式(initialize)、條件表達式(test)、遞增表達式(increment)

for (初始化表達式; 條件; 遞增表達式) {
  語句
}

所有for迴圈,都可以改寫成while迴圈

for語句的無線迴圈表示:

for ( ; ; ){
  console.log('Hello World');
}
  • do...while 迴圈:先執行一次迴圈體,再判斷條件
  • break語句用於跳出代碼塊或迴圈。continue語句用於立即終止本輪迴圈,並開始下一輪迴圈
  1. js語句的前面可以添加標簽(label),相當於定位符,用於跳轉到程式的任意位置
label:
  語句

數據類型

概述

  1. JavaScript的數據類型有六種(ES6新增了 Symbol 類型)
  • 數值(number):整數和小數(比如1和3.14)
  • 字元串(strin):文本(比如"Hello World")。
  • 布爾值(boolean):表示真偽的兩個特殊值,即true(真)和false(假)
  • undefined:表示“未定義”或不存在,即由於目前沒有定義,所以此處暫時沒有任何值
  • null:表示空值,即此處的值為空。
  • 對象(object):各種值組成的集合。

數值、字元串、布爾值稱為原始類型(primitive type),是最基本的數據類型。對象稱為合成類型(complex type)。undefinednull兩個特殊值。

對象分為:狹義的對象(object)、數組(array)、函數(function)

  1. 類型判斷

typeof運算符返回一個值的數據類型:

  • 數值、字元串、布爾值分別返回numberstringboolean
  • 函數返回functionundefined返回undefined(可以檢測未聲明的變數),對象返回objectnull返回object
// 檢測未聲明
if (typeof v === "undefined") {
  // ...
}

typeof window // "object"
typeof {} // "object"
typeof [] // "object"

typeof null // "object"
  • instanceof可以區分數組和對象
[] instanceof Array // false
[] instanceof Array // true

null 和 undefined

  1. 兩者含義"類似",if語句中自動轉為false,相等於運算符(==)兩者比較為true。null表示"空"對象,轉為數值是0undefined表示"無定義"的原始值,轉為數值是NaN
Number(null) // 0
Number(undefined) // NaN
  1. 函數沒有返回值時,預設返回 undefined
  2. 布爾值表示truefalse兩個真假狀態。
  3. 如果 JavaScript 預期某個位置應該是布爾值,則會將該位置上現有的值自動轉為布爾值。

下麵六個值會被轉為false,其他的值都是true

  • undefined
  • null
  • false
  • 0
  • NaN
  • ""或''(空字元串)

空數組([])和空對象({})對應的布爾值,都是true

數值

  1. js中所有數字都是以64位浮點數存儲,整數也是如此。因此1===1.0,是同一個數
1 === 1.0 // true

JavaScript 語言的底層根本沒有整數,所有數字都是小數(64位浮點數)

  1. 浮點數不是精確的值,因此小數的比較和運算要特別註意
0.1 + 0.2 === 0.3   // false

0.3 / 0.1           // 2.9999999999999996

(0.3 - 0.2) === (0.2 - 0.1)   // false
  1. js浮點數的64個二進位位,從最左邊開始,由如下組成:
  • 第1位:符號位,0表示正數,1表示負數。數值正負
  • 第2位到第12位(共11位):指數部分。數值的大小
  • 第13位到第64位(共52位):小數部分(即有效數字)。數值的精度
  1. 絕對值小於2的53次方的整數,即$-253$到$253$,都可以精確表示
Math.pow(2, 53); // 9007199254740992

Math.pow(2, 53) + 1; // 9007199254740992

Math.pow(2, 53) + 2; // 9007199254740994

Math.pow(2, 53) + 3; // 9007199254740996

Math.pow(2, 53) + 4; // 9007199254740996
  1. 最大值和最小值:Number.MAX_VALUENumber.MIN_VALUE
Number.MAX_VALUE // 1.7976931348623157e+308
Number.MIN_VALUE // 5e-324
  1. 數值表示法:50(十進位)、0xFF(十六進位)、123e3123e-3(科學計數法)
  2. 當小數點前面的數字多於21位時,或者小數點後的零多於5個時,js會自動將數值轉為科學計數法表示
  3. 使用字面量(literal)表示數值時:
  • 十進位:沒有前導0的數值
  • 八進位:有首碼0o0O的數值,或者有前導0、且只用到0-7的八個阿拉伯數字的數值。
  • 十六進位:有首碼0x0X的數值。
  • 二進位:有首碼0b0B的數值。

js會自動將八進位、十六進位、二進位轉為十進位

  1. js存在2個0:+0-0,兩者是等價的。唯一區別是+0-0當作分母時表達式的返回值不相等。
  2. NaN表示“非數字”(Not a Number),比如字元串解析為數字報錯時會返回NaN。0除以0得到NaN。NaN只是一個特殊值,類型依舊是Number
  3. NaN不等於任何值,包括它本身
NaN === NaN // false

NaN的布爾值為false,NaN與任何數(包括它自己)的運算,得到的都是NaN

  1. Infinity表示“無窮”,表示無法表示正無窮(Infinity)和負無窮(-Infinity);非0數除以0,得到Infinity
    Infinity大於一切數值(除了NaN),-Infinity小於一切數值(除了NaN)

NaN的比較運算會返回false

  1. parseInt()方法將字元串轉為整數。字元串轉為整數時,會一個個字元依次轉換,如果遇到不能轉為數字的字元,就不再進行下去,返回已經轉好的部分。轉換失敗返回NaN

解析科學計數法的數字時會出現奇怪的結果

第二個參數表示解析的值的進位

parseInt('1000', 2) // 8
parseInt('1000', 6) // 216
parseInt('1000', 8) // 512
  1. parseFloat():將一個字元串轉為浮點數,可以對科學計數法字元串正確轉換
  2. isNaN()判斷一個值是否是NaNisNaN()只對數值有效,其他類型值會先轉為數值,再判斷。對於空數組和只有一個數值成員的數組,isNaN()返回false
isNaN('Hello') // true
// 相當於
isNaN(Number('Hello')) // true
  1. 判斷NaN最好的方法是:NaN是唯一不等於自身的值
function myIsNaN(value) {
  return value !== value;
}

如果使用isNaN()判斷,要同時判斷類型:

function myIsNaN(value) {
  return typeof value === 'number' && isNaN(value);
}
  1. isFinite()判斷是否為正常的數值,判斷是參數也會進行類型轉換

字元串

  1. 字元串是放在單引號或雙引號中的零個或多個排在一起的字元。字元串中使用相同的引號要用\反斜杠轉義
  2. 每行的尾部使用反斜杠,可以實現多行字元串(\後面只能有換行符,否則報錯)
var longString = 'Long \
long \
long \
string';

longString // "Long long long string"

也可使用+可以將多個字元串列連接

  1. 反斜杠(\)用來表示一些特殊字元,稱為轉義。如\n換行符;\r:回車鍵;\t:製表符。如果在字元串中需要包含反斜杠,需要\轉義自身。
"你好,反斜杠\\";  // "你好,反斜杠\"
  1. 字元串可以看做字元數組,但僅能使用數組的方括弧運算符獲取字元,而不能進行其他操作
  2. length屬性返回字元串長度
'hello'.length  // 5
  1. js使用Unicode字元集。不僅以Unicode存儲字元,而且可以只用Unicode碼點,如'\u00A9'表示版權符號
var s = '\u00A9';
s // "©"

每個字元在 JavaScript 內部都是以16位(2個位元組)的 UTF-16 格式儲存。js單位字元長度固定為16位長度

js 對 UTF-16 的支持不完整,只支持兩位元組的字元,無法識別四位元組的字元。比如四位元組字元

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文更新於2020-05-03,使用MySQL 5.7,操作系統為Deepin 15.4。 MySQL的備份分為邏輯備份和物理備份,物理備份分為冷備份和熱備份。恢復分為完全恢復和不完全恢復,不完全恢復又分為基於時間點的恢復和基於位置的恢復。 邏輯備份和恢復 使用mysqldump進行邏輯備份,如my ...
  • 一般這個錯誤是由密碼錯誤引起,解決的辦法自然就是重置密碼。 假設我們使用的是root賬戶。 1.重置密碼的第一步就是跳過MySQL的密碼認證過程,方法如下: root 00:22:26~$ vim /etc/my.cnf (註:windows下修改的是my.ini) 2.在文檔內搜索mysqld定位 ...
  • Windows下mysql忘記密碼怎麼辦? 時隔半個月,我終於又開始操刀mysql,但是不小心砍到了我的腦子,密碼什麼的我全都忘了,結果,你懂的。。。所以,今天我就總結了一下網上的解決方法以及我自己的解決方法的一些心得。 方法一:免密碼進入mysql再修改密碼 步驟一:找到mysql安裝目錄下的配置 ...
  • 提到事務,相信大家都不陌生,事務的ACID四大特性,也是面試時經常問的,不過一般情況下,我們可能想到的是傳統關係型資料庫的事務,其實,Redis也是提供了事務機制的,本篇博客就來講解下Redis的事務機制。 1. 事務演示 Redis的事務提供了一種將多個命令請求打包,然後一次性、按順序性地執行多個 ...
  • 官方文檔https://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_eight.htm#i1037226set autotrace off表示關閉,是預設的(set autot off)set autotrace on表示顯示結果、執行計劃、統... ...
  • why do it 如果你的App中包含或涉及到第三方登錄(例如:QQ登陸、微信登陸等),就必須接入蘋果登陸,如果不適配蘋果推出的Sign In With Apple審核將會被拒絕。 what is Sign In With Apple 其實和平時的一些第三方登陸一樣,通過授權,可以拿到用戶名,郵箱 ...
  • hi,我是老朋友,最近迷戀上了海外版本的抖音,也就是tiktok,然後想把某個老外的所有視頻保存下來,tiktok軟體里不支持,所以就網上搜尋了一番,發現一個不錯的線上工具。支持解析任何主播主頁的作品、喜歡視頻支持Tiktok 作品、喜歡批量下載。可以把Tiktok國際版抖音視頻批量去水印解析下載到 ...
  • 本文主要寫給剛接觸移動端開發的同鞋們。 首先先將幾個主要概念講一下; 什麼是移動端? 移動端故名思義是為移動終端,大名叫移動通信終端,是指可以在移動中使用的電腦設備。其實就是我們常說的手機。 什麼是佈局? 前端開發中佈局是將主要的html結構佈置好。 rem是什麼? rem是一種長度單位,是而且僅 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...