前端之 JavaScript 基礎

JavaScript 概述

ECMAScript 和 JavaScript的關系

1996年11月,JavaScript 的創造者 Netscape(網景) 公司,決定將 JavaScript 提交給國際標準化組織 ECMA ,希望這門語言能夠成為國際標準。次年,ECMA發布262號標準文件(ECMA-262)的第一版,規定了瀏覽器腳本語言的標準,并將這種語言稱為ECMAScript,這個版本就是1.0版。

該標準一開始就是針對JavaScript語言制定的,但是沒有稱其為JavaScript,有兩個方面的原因。一是商標,JavaScript本身已被Netscape注冊為商標。二是想體現這門語言的制定者是ECMA,而不是Netscape,這樣有利于保證這門語言的開發性和中立性。

因此ECMAScript和JavaScript的關系是,前者是后者的規格,后者是前者的一種實現。JavaScript = ECMAScript + JavaScript自己特有的東西(BOM+DOM)

ECMAScript的歷史

年份名稱描述
1997ECMAScript 1第一個版本
1998ECMAScript 2版本變更
1999ECMAScript 3添加正則表達式
添加try/catch
?ECMAScript 4沒有發布
2009ECMAScript 5添加”strict mode”嚴格模式
添加JSON支持
2011ECMAScript 5.1版本變更
2015ECMAScript 6添加類和模塊
2016ECMAScript 7增加指數運算符(**)
增加Array.prototype.includes

注:ES6就是指ECMAScript 6。

盡管 ECMAScript 是一個重要的標準,但它并不是 JavaScript 唯一的部分,當然,也不是唯一被標準化的部分。實際上,一個完整的 JavaScript 實現是由以下 3 個不同部分組成的:

  • 核心(ECMAScript)?
  • 文檔對象模型(DOM) Document object model (整合js,css,html)
  • 瀏覽器對象模型(BOM) Broswer object model(整合js和瀏覽器)

簡單地說,ECMAScript 描述了JavaScript語言本身的相關內容。

  • JavaScript 是腳本語言
  • JavaScript 是一種輕量級的編程語言。
  • JavaScript 是可插入 HTML 頁面的編程代碼。
  • JavaScript 插入 HTML 頁面后,可由所有的現代瀏覽器執行。
  • JavaScript 很容易學習。

JavaScript語言規范

JavaScript引入方式

Script標簽內寫代碼

<script>// 在這里寫你的JS代碼
</script>

引入額外的JS文件

<script>可以定義在html頁面的任何地方。但是定義的位置會影響執行順序。
? ? ? ? <script>可以定義多個。

<script src="myscript.js"></script>

注釋(注釋是代碼之母)- 和 java 注釋基本一樣

// 這是單行注釋/*這是多行注釋
*/

結束符

JavaScript中的語句要以分號(;)為結束符。

JavaScript語言基礎

變量聲明

  • JavaScript的變量名可以使用_,數字,字母,$組成,不能以數字開頭。
  • 聲明變量使用?var 變量名;?的格式來進行聲明
  • 變量名是區分大小寫的。
  • 推薦使用駝峰式命名規則。
  • 保留字不能用做變量名。
var name = "lp";
var age = 18;

ES6新增了 let 命令,用于聲明變量。其用法類似于 var,但是所聲明的變量只在 let 命令所在的代碼塊內有效。例如:for 循環的計數器就很適合使用 let 命令。

for (let i=0;i<arr.length;i++){...}

ES6新增 const 用來聲明常量。一旦聲明,其值就不能改變。

const PI = 3.1415;
PI // 3.1415
PI = 3 // TypeError: "PI" is read-only

保留字列表:

abstract
boolean
byte
char
class
const
debugger
double
enum
export
extends
final
float
goto
implements
import
int
interface
long
native
package
private
protected
public
short
static
super
synchronized
throws
transient
volatile

運算符

算數運算符

+ - * / % ++ --

比較運算符

> >= < <= != == === !==

注意:

1 == “1”  // true
1 === "1"  // false

邏輯運算符

&& || !

賦值運算符

= += -= *= /=

流程控制

if-else

var a = 10;
if (a > 5) {console.log("yes");
} else {console.log("no");
}

if-else if-else

var a = 10;
if (a > 5) {console.log("a > 5");
} else if (a < 5) {console.log("a < 5");
} else {console.log("a = 5");
}

switch

var day = new Date().getDay();
switch (day) {case 0:console.log("Sunday");break;case 1:console.log("Monday");break;default:console.log("...")
}

switch中的case子句通常都會加break語句,否則程序會繼續執行后續case中的語句。

for

for (var i=0;i<10;i++) {console.log(i);
}

while

var i = 0;
while (i < 10) {console.log(i);i++;
}

三元運算

var a = 1;
var b = 2;
var c = a > b ? a : b

函數

函數定義

JavaScript 中的函數和 Python 中的非常類似,只是定義方式有點區別。

// 普通函數定義
function f1() {console.log("Hello world!");
}// 帶參數的函數
function f2(a, b) {console.log(arguments);  // 內置的arguments對象console.log(arguments.length);console.log(a, b);
}// 帶返回值的函數
function sum(a, b){return a + b;
}
sum(1, 2);  // 調用函數// 匿名函數方式
var sum = function(a, b){return a + b;
}
sum(1, 2);// 立即執行函數
(function(a, b){return a + b;
})(1, 2);

補充:ES6中允許使用“箭頭”(=>)定義函數。

var f = v => v;
// 等同于
var f = function(v){return v;
}

如果箭頭函數不需要參數或需要多個參數,就是用圓括號代表參數部分:

var f = () => 5;
// 等同于
var f = function(){return 5};var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2){return num1 + num2;
}

函數中的arguments參數

function add(a,b){console.log(a+b);console.log(arguments.length)
}add(1,2)

注意:函數只能返回一個值,如果要返回多個值,只能將其放在數組或對象中返回

函數的全局變量和局部變量

局部變量:在JavaScript函數內部聲明的變量(使用 var)是局部變量,所以只能在函數內部訪問它(該變量的作用域是函數內部)。只要函數運行完畢,本地變量就會被刪除。

全局變量:在函數外聲明的變量是全局變量,網頁上的所有腳本和函數都能訪問它。

變量生存周期:

  • JavaScript變量的生命期從它們被聲明的時間開始。
  • 局部變量會在函數運行以后被刪除。
  • 全局變量會在頁面關閉后被刪除。

作用域

首先在函數內部查找變量,找不到則到外層函數查找,逐步找到最外層。

幾個例子:

// 1.
var city = "BeiJing";
function f() {var city = "ShangHai";function inner(){var city = "ShenZhen";console.log(city);}inner();
}f();  //輸出結果是?ShenZhen// 2.
var city = "BeiJing";
function Bar() {console.log(city);
}
function f() {var city = "ShangHai";return Bar;
}
var ret = f();
ret();  // 打印結果是?BeiJing// 3.閉包
var city = "BeiJing";
function f(){var city = "ShangHai";function inner(){console.log(city);}return inner;
}
var ret = f();
ret();

詞法分析(嘗試理解)

JavaScript中在調用函數的那一瞬間,會先進行詞法分析。

詞法分析的過程:

當函數調用的前一瞬間,會先形成一個激活對象:Avtive Object(AO),并會分析以下3個方面:

  1. 函數參數,如果有,則將此參數賦值給AO,且值為undefined。如果沒有,則不做任何操作。
  2. 函數局部變量,如果AO上有同名的值,則不做任何操作。如果沒有,則將此變量賦值給AO,并且值為undefined。
  3. 函數聲明,如果AO上有,則會將AO上的對象覆蓋。如果沒有,則不做任何操作。

函數內部無論是使用參數還是使用局部變量都到AO上找。看兩個例子:

var age = 18;
function foo(){console.log(age);var age = 22;console.log(age);
}
foo();  // 問:執行foo()之后的結果是?undefined 和 22// 第二題:
var age = 18;
function foo(){console.log(age);var age = 22;console.log(age);function age(){console.log("呵呵");}console.log(age);
}
foo();  // 執行后的結果是?
? age(){console.log("呵呵");} 和 22 和22
詞法分析過程:
1、分析參數,有一個參數,形成一個 AO.age=undefine;
2、分析變量聲明,有一個 var age, 發現 AO 上面已經有一個 AO.age,因此不做任何處理
3、分析函數聲明,有一個 function age(){...} 聲明, 則把原有的 age 覆蓋成 AO.age=function(){...};最終,AO上的屬性只有一個age,并且值為一個函數聲明執行過程:
注意:執行過程中所有的值都是從AO對象上去尋找1、執行第一個 console.log(age) 時,此時的 AO.age 是一個函數,所以第一個輸出的一個函數
2、這句 var age=22; 是對 AO.age 的屬性賦值, 此時AO.age=22 ,所以在第二個輸出的是 22
3、同理第三個輸出的還是22, 因為中間再沒有改變age值的語句了

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454009.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454009.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454009.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TCPMP0.72RC1的編譯與移植以及自己另外做UI完整方法

我叫張挺&#xff0c;雖然開博&#xff0c;除了轉了一篇黃色文章以外&#xff0c;技術文章從來沒有寫&#xff0c;所以呢&#xff0c;感到很不好意思&#xff01;于是決定還寫一篇在網上也留點痕跡。我這里主要是介紹TCPMP的移植以及如何把這個鳥鳥整到自己的界面中來&#xff…

svga文件如何查看_電腦隱藏文件?如何查看隱藏文件 方法簡單易學

大家好&#xff0c;我是小白一鍵重裝軟件的客服。如何查看隱藏文件呢&#xff1f;有時候不小心把文件夾勾選隱藏后文件就消失了&#xff0c;到底是怎么回事呢&#xff1f;其實這個是電腦上面一些設置開啟了文件隱藏的功能哦&#xff0c;那么下面小白系統帶你了解下如何查看隱藏…

jquery 的animate 的transform

$(function(){ var t 1000; $("#id").animate( {borderSpacing:180}, //180 指旋轉度數 { step: function(now,fix){ $(this).css(-webkit-transform,rotate(nowdeg)); $(this).css(-ms-transform,rotate(nowdeg)); $(this).css(-moz-transform,rotate(nowdeg)); $(…

前端之 BOM 和 DOM

前言 到目前為止&#xff0c;我們已經學過了JavaScript的一些簡單的語法。但是這些簡單的語法&#xff0c;并沒有和瀏覽器有任何交互。也就是我們還不能制作一些我們經常看到的網頁的一些交互&#xff0c;我們需要繼續學習BOM和DOM相關知識。 JavaScript分為 ECMAScript&…

如何給FLV文件加字幕

如何給FLV文件加字幕關鍵字&#xff1a;FFMPEG AVS 字幕 本文只是收集工作中的一點經驗和積累&#xff0c;如果你能從本文中得到收獲&#xff0c;或者得到啟發。那將是我最開心的事情。 本文面向的讀者是對FFMPEG以及AVS有一定基礎的&#xff0c;對電腦有一定基礎的&#xff…

化工圖紙中LISP_必備干貨丨石油化工安裝工程質量與成本控制研究

對于整個石油化工工程來說&#xff0c;石油化工的安裝工程在其中是最重要并且最核心的一個環節&#xff0c;其對石油化工工程的質量有著決定性的作用。從客觀的角度來說&#xff0c;如果石油化工安裝工程在實際的施工過程中出現任何的問題&#xff0c;就會威脅到周邊人群的生命…

[原創]windows server 2012 AD架構 試驗 系列 – 15解決AD復制沖突

[原創]windows server 2012 AD架構 試驗 系列 – 15解決AD復制沖突 這節我詳細說下 ADDS使用stamp來作為解決沖突的依據 Stamp由三塊組成 Version, time stamp , source DC GUID (發生對象修改行為的源DC的GUID) 一般來說沖突分為幾下情況: 1-屬性沖突 你可以用repadmin來查看版…

Python全局變量和局部變量

全局變量和局部變量 定義在函數內部的變量擁有一個局部作用域&#xff0c;定義在函數外的擁有全局作用域。   局部變量只能在其被聲明的函數內部訪問&#xff0c;而全局變量可以在整個程序范圍內訪問。調用函數時&#xff0c;所有在函數內聲明的變量名稱都將被加入到作用域中…

前端之 jQuery 入門

jQuery介紹 jQuery是一個輕量級的、兼容多瀏覽器的JavaScript庫。jQuery使用戶能夠更方便地處理HTML Document、Events、實現動畫效果、方便地進行Ajax交互&#xff0c;能夠極大地簡化JavaScript編程。它的宗旨就是&#xff1a;“Write less, do more.“ jQuery的優勢 一款輕…

python劍指offer替換空格_迷人的算法-劍指offer面試題5:替換空格

題目&#xff1a;請實現一個函數&#xff0c;把字符串中的每個空格替換成"%20"。例如&#xff0c;輸入"We are happy."&#xff0c;則輸出"We%20are%20happy."。此題看似簡單&#xff0c;實則坑還是比較多的。替換字符的長度有變化&#xff0c;由…

音頻視頻解決方案:GStreamer/ffmpeg/ffdshow/directshow/vfw

音頻視頻編程相關&#xff1a;GStreamer/ffmpeg/directshow/vfw linux和window下幾種流行的音頻視頻編程框架作一個總結&#xff0c;防止自己迷惘&#xff0c;免于暈頭轉向。 一、GStreamer GStreamer is a library that allows the construction of graphs of media-handlin…

Linux 將進程放入后臺執行,解決網絡,ssh斷開導致進程結束(nohup, setsid, , disown)...

Linux 將進程放入后臺執行&#xff0c;解決網絡&#xff0c;ssh斷開導致進程結束&#xff08;nohup, setsid, &, disown&#xff09; 1、nohup 命令 我們知道&#xff0c;當用戶注銷&#xff08;logout&#xff09;或者網絡斷開時&#xff0c;終端會收到 HUP&#xff08;…

bzoj1927

1927: [Sdoi2010]星際競速Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 2556 Solved: 1580[Submit][Status][Discuss] Description 10年一度的銀河系賽車大賽又要開始了。作為全銀河最盛大的活動之一&#xff0c;奪得這個項目的冠軍無疑是很多人的夢想&#xff0c;來自杰…

python until怎么用_python基礎之從認識python到python的使用

python的歷史&#xff1a;python的創始人是吉多范羅蘇姆(Guido van Rossum)&#xff0c;人稱“龜叔”&#xff0c;1989年圣誕節期間&#xff0c;Guido開始寫Python語言的編譯器。他希望這個叫做Python的語言能符合他的理想&#xff1a;創造一種C和shell之間&#xff0c;功能全面…

前端之同源策略 Jsonp 與 CORS

同源策略 同源策略&#xff08;Same origin policy&#xff09;是一種約定&#xff0c;它是瀏覽器最核心也最基本的安全功能&#xff0c;如果缺少了同源策略&#xff0c;則瀏覽器的正常功能可能都會受到影響。可以說Web是構建在同源策略基礎之上的&#xff0c;瀏覽器只是針對同…

vue新手入門——vue-cli搭建

首先說明&#xff0c;以下內容vue官網都有文檔&#xff0c;如果覺得麻煩啰嗦&#xff0c;請移步至 安裝-vue.js 。 準備工作&#xff1a; 1.下載并安裝node環境&#xff0c;一般情況下安裝好node之后&#xff0c;npm也會安裝好。具體安裝的話&#xff0c;百度大概能幫得上忙。 …

如何看懂源代碼–(分析源代碼方法)

我們在寫程式時&#xff0c;有不少時間都是在看別人的代碼。例如看小組的代碼&#xff0c;看小組整合的守則&#xff0c;若一開始沒規劃怎么看&#xff0c; 就會“嚕看嚕苦&#xff08;臺語&#xff09; ” 不管是參考也好&#xff0c;從開源抓下來研究也好&#xff0c;為了了解…

linux關于安裝

一&#xff0e;安裝gcc gcc cloog-ppl ppl(libppl.so.7/libppl_c.so.2) cpp mpfr(libmpfr.so.1) gcc-c libstdc-devel mpfr-2.4.1-6.el6.i686.rpm和ppl-0.10.2-11.el6.i686.rpm 快捷鍵rz sz&#xff1a; rz、sz命令沒找到&#xff1f; 安裝lrzsz即可&#xff1a; shell># y…

python cmath模塊_cmath模塊-PYTHON

這是一個float型的常數>>> cmath.e2.718281828459045>>> type(cmath.e)文檔>>> import cmath>>> help(cmath)Help on module cmath:NAMEcmathFILE/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/cm…

Python 第三方模塊之 pdfkit

pdfkit&#xff0c;把 HTMLCSS 格式的文件轉換成 PDF 格式文檔的一個工具。 其實&#xff0c;pdfkit 是 html 轉成 pdf 工具包 wkhtmltopdf 的 Python 封裝。所以&#xff0c;首先安裝 wkhtmltopdf 。 一般情況下&#xff0c;wkhtmltopdf需要手動安裝&#xff0c;網站是 https…