1990年底,歐洲核能研究組織(CERN)科學家 Tim Berners-Lee,在全世界最大的電腦網路——網際網路的基礎上,發明了萬維網(World Wide Web),從此可以在網上瀏覽網頁檔案。最早的網頁只能在操作系統的終端裡瀏覽,也就是說只能使用命令列操作,網頁都是在字元視窗中顯示,這當然非常不方便。
1994年10月,NCSA 的一個主要程式設計師 Marc Andreessen 聯合風險投資家 Jim Clark,成立了 Mosaic 通訊公司(Mosaic Communications),不久後改名爲 Netscape。這家公司的方向,就是在 Mosaic 的基礎上,開發面向普通使用者的新一代的瀏覽器 Netscape Navigator。
Netscape 公司很快發現,Navigator 瀏覽器需要一種可以嵌入網頁的指令碼語言,用來控制瀏覽器行爲。當時,網速很慢而且上網費很貴,有些操作不宜在伺服器端完成。比如,如果使用者忘記填寫「使用者名稱」,就點了「發送」按鈕,到伺服器再發現這一點就有點太晚了,最好能在使用者發出數據之前,就告訴使用者「請填寫使用者名稱」。這就需要在網頁中嵌入小程式,讓瀏覽器檢查每一欄是否都填寫了。
1995年,Netscape 公司僱傭了程式設計師 Brendan Eich 開發這種網頁尾本語言。Brendan Eich 有很強的函數語言程式設計背景,希望以 Scheme 語言(函數式語言鼻祖 LISP 語言的一種方言)爲藍本,實現這種新語言。
1995年5月,Brendan Eich 只用了10天,就設計完成了這種語言的第一版。它是一個大雜燴,語法有多個來源。
爲了保持簡單,這種指令碼語言缺少一些關鍵的功能,比如塊級作用域、模組、子型別(subtyping)等等,但是可以利用現有功能找出解決辦法。這種功能的不足,直接導致了後來 JavaScript 的一個顯著特點:對於其他語言,你需要學習語言的各種功能,而對於 JavaScript,你常常需要學習各種解決問題的模式。
1996年8月,微軟模仿 JavaScript 開發了一種相近的語言,取名爲JScript(JavaScript 是 Netscape 的註冊商標,微軟不能用),首先內建於IE 3.0。Netscape 公司面臨喪失瀏覽器指令碼語言的主導權的局面。
1996年11月,Netscape 公司決定將 JavaScript 提交給國際標準化組織 ECMA(European Computer Manufacturers Association),希望 JavaScript 能夠成爲國際標準,以此抵抗微軟。ECMA 的39號技術委員會(Technical Committee 39)負責制定和審覈這個標準,成員由業內的大公司派出的工程師組成,目前共25個人。該委員會定期開會,所有的郵件討論和會議記錄,都是公開的。
1997年7月,ECMA 組織發佈262號標準檔案(ECMA-262)的第一版,規定了瀏覽器指令碼語言的標準,並將這種語言稱爲 ECMAScript。這個版本就是 ECMAScript 1.0 版。之所以不叫 JavaScript,一方面是由於商標的關係,Java 是 Sun 公司的商標,根據一份授權協定,只有 Netscape 公司可以合法地使用 JavaScript 這個名字,且 JavaScript 已經被 Netscape 公司註冊爲商標,另一方面也是想體現這門語言的制定者是 ECMA,不是 Netscape,這樣有利於保證這門語言的開放性和中立性。因此,ECMAScript 和 JavaScript 的關係是,前者是後者的規格,後者是前者的一種實現。在日常場合,這兩個詞是可以互換的。
ECMAScript 只用來標準化 JavaScript 這種語言的基本語法結構,與部署環境相關的標準都由其他標準規定,比如 DOM 的標準就是由 W3C組織(World Wide Web Consortium)制定的。
ECMA-262 標準後來也被另一個國際標準化組織 ISO(International Organization for Standardization)批準,標準號是 ISO-16262。
ECMAScript6(簡稱ES6)是於2015年6月正式發佈的 JavaScript 語言的標準,正式名爲ECMAScript 2015(ES2015)。它的目標是使得JavaScript語言可以用來編寫複雜的大型應用程式,成爲企業級開發語言
<script>
alert("hello JavaScript");
</script>
<SCript src="../js/Hello.js"></SCript>
alert(內容); // 彈出訊息提示框
注意在Js中每條語句都要以 ; 結尾,在Js中沒有編譯,如果語法錯誤,要開啓瀏覽器的控制視窗(按F12)找到Console進行檢視
<script>
alert("hello JavaScript"); // alert(內容)是一個函數,其會生成一個彈窗彈出訊息
</script>
/*
JS數據型別:
String 字元
Number 數位
Boolean 布爾
Null 空值
Undifine 未定義
Object 物件
*/
var str = "hello";
var abc = "abc";
var num = 123456;
console.log(typeof str);
console.log(typeof num)
console.log(Number.MAX_VALUE); //number最大值
console.log(Number.MAX_VALUE * Number.MAX_VALUE); //Infinity 無窮大 型別Number
console.log(Number.MIN_VALUE); // number 正數最小值
console.log(str *abc); //NaN --> not a Number 型別Number
var a,b;
a=0.1;
b=0.2;
console.log(a+b); //小數計算會有精度問題
a=123;
b=321;
console.log(a+b);
/*
Boolean 布爾
true 真 false 假
*/
var bool = true;
console.log(typeof bool);
/*
Null 和 Undefine
Null 只有一個值 null 當檢測其型別時會返回Objec
*/
var nu=null;
var und = undefined;
console.log(typeof nu);
console.log(typeof und);
// alert("hello JavaScript"); //警告提示框
// document.write("hello JavaScript"); //向body中寫入文字
// console.log("helloconsole"); //向控制檯輸出內容
/*
識別符號
1.由 數位、字母、_、$組成
2.不能以數位開頭
3.不能是ES中的關鍵字,和保留字元
4.一般使用駝峯命名法,首字母小寫
所有我們可以自主命名的都是識別符號,例如:變數名、函數名、屬性名
*/
var a=1;
console.log(a);
document.write(a);
//alert(a);
呼叫toString() 方法,轉換成字串
-toString不會影響原來的變數,但是會產生一個新的字串
-null 和 Undefine 沒有toString()方法
呼叫String()函數
-對於Number和Boolean而言是直接呼叫 tostring方法;
-對於Null和Undefine而言是加 改爲引號賦值
/*
強制型別轉換
1.呼叫toString() 方法,轉換成字串
-toString不會影響原來的變數,但是會產生一個新的字串
-null 和 Undefine 沒有toString()方法
2.呼叫String()函數
-對於Number和Boolean而言是直接呼叫 tostring方法;
-對於Null和Undefine而言是加 改爲引號賦值
*/
var a;
a = 12345;
a = a.toString();
console.log(a);
console.log(typeof a);
a = true;
a = a.toString();
console.log(a);
console.log(typeof a);
a = null;
//a.toString(); //報錯
a = undefined;
//a.toString(); // 報錯
/*
將其他型別轉換成Number型別
1.使用Number()函數
-- 字串轉Number時會判斷是否爲數位,如果爲非數位則會輸出NaN,如果是空串則轉化爲0
-- Boolen 轉Number, true---> 1 false ---> 0
-- Null 轉Number,轉化成0
-- Undefine 轉Number ---> NaN
2.ParseInt()、ParseFloat函數
-- 會自動解析字串中的有效數位,將數位部分提取出來並進行轉換,從左至右取到非數位位爲止
-- praseFloat可以獲取字串中有效的小數
*/
var a;
a = 0x123; // 0x開頭表示16進位制數
console.log(a);
a = 020; // 以0開頭的數位表示8進位制
console.log(a);
//a = 0b12; // 以0b開頭表示二進制數,但不是所有瀏覽器都支援,比較少使用
//console.log(a);
a = "020";
//parseInt(a); //部分瀏覽器會將其當做八進制進行解析故需要傳入第二參數
a = parseInt(a,8);
console.log(a);
/*
呼叫Boolean()函數;
-- 數位轉Boolean 除了0和NaN其他都是true
-- 字串轉Boolean 除了空串其餘都是true
-- Null、Undefine 轉Boolean ---> false
*/
算術運算子和typeof運算子
/*
1. typeof運算子 ----> 獲取數據型別,返回值爲一個字串
2. 算術運算子 +、-、*、/、%
【當對非數位型別進行運算時會自動將其轉化爲數位型別再進行計算,任何數位和NaN計算都得NaN
若是兩個字串相加則是字串拼接操作,任何型別數據和字串做加法都會轉化爲字串然後做拼接操作】
【若是做- 、 / 、 *操作則會全部轉化爲數位型別再做運算操作】
*/
var a;
a = NaN;
a = a + "";
console.log(a);
console.log(typeof a);
a = 123;
a = a - "1";
console.log(typeof a);
console.log(a);
/*
1. + 、 -
+ 不會對數值產生影響
- 取相反數
*/
var a = -1;
a = +a;
console.log(a);
console.log(typeof a);
a = -a;
console.log(a);
console.log(typeof a);
a = "-1";
a = -a;
console.log(a);
console.log("字串的-操作:"+typeof a);
a = true;
a = -a;
console.log(a);
console.log(typeof a);
/*
條件運算子:
--語法
條件語句?語句1:語句2
如果條件判斷爲true則執行語句1;否則執行語句2,或者返回;
如果判斷條件爲一個非布爾值則會進行布爾值型別轉換再做判斷;
*/
// true?alert("此時爲true!"):alert("此時爲false");
// false?alert("此時爲true"):alert("此時爲false");
var a = 20;
var b = 40;
var c = 50;
var max;
// a>b?alert("a大"):alert("b大");
// max = a > b ? a : b;
// console.log(max)
// 不推薦使用,不方便閱讀
max = a>b?a>c?a:c:b>c?b:c;
console.log(max);
邏輯運算子
邏輯運算子與Java一致 && 、||、 !
var a = 1 || 2;
console.log(a); //1 前者
a = 1 && 2;
console.log(a); //2 後者
a = !1;
console.log(a); // false 取反
a = 1 || 2 && 3; // &&優先順序更高
console.log(a); //1
var a = 1;
console.log(a=="1"); // true
console.log(a!="1"); // flase
console.log(a==="1"); // flase
console.log(a!=="1"); // true
- 自增運算子**i++,++i**,自減運算子 **i--,--i**
- 其他運算子將在下列章節中具體用到時介紹
javascript中的if語句與Java中一本一致
prompt()函數,會彈出一個帶可輸入文字方塊的提示框;
/*
1.javascript中的if語句與Java中一本一致
2.prompt()函數,會彈出一個帶可輸入文字方塊的提示框;
案例:
成績 > 90 優
成績 > 80 良
成績 > 70 中
成績 > 60 及格
其他 不及格
*/
var sorce;
sorce = prompt("請輸入你的成績:");
while(true){
if(sorce > 100 || sorce < 0)
{
sorce = prompt("輸入有誤,請從新輸入:");
}
else{
if(sorce > 90)
{
document.write("評級:優");
}else if(sorce > 80){
document.write("評級:良");
}else if(sorce > 70){
document.write("評級:中");
}else if(sorce > 60){
document.write("評級:及格");
}else{
document.write("評級:不及格");
}
break;
}
}
/*
switch多分支語句:
*/
var sorce;
sorce = prompt("請輸入成績:");
/* 實現方式一 */
// switch(parseInt(sorce/10))
// {
// case 6 :
// case 7 :
// case 8 :
// case 9 :
// case 10 :
// alert("合格");break;
// default:
// alert("不合格");
// break;
// }
/* 實現方式二: */
switch (true){
case sorce>=60:
alert("合格");
break;
default:
alert("不合格");
break;
}
物件分類:
1.內建物件:
- 由ES標準中定義的物件,在任何ES的實現中都可以使用
- 比如,Math、String、Number、Boolean、Function、Object…
2.宿主物件:
3.自定義物件:
由開發人員自己定義的物件
建立物件:
使用new關鍵字呼叫函數,是建構函式constructor
建構函式是專門用來建立物件的函數
使用typeof檢查物件時返回Object
增加屬性與修改屬性請查閱下列程式碼:
/*
物件分類:
1.內建物件:
- 由ES標準中定義的物件,在任何ES的實現中都可以使用
- 比如,Math、String、Number、Boolean、Function、Object...
2.宿主物件:
- 由JS的執行環境提供的物件,目前來講主要指由瀏覽器提供的物件
- 比如DOM 、BOM
3.自定義物件:
- 由開發人員自己定義的物件
*/
/*
建立物件:
使用new關鍵字呼叫函數,是建構函式constructor
建構函式是專門用來建立物件的函數
使用typeof檢查物件時返回Object
*/
var obj = new Object();
// console.log(obj); //{}
// console.log(typeof obj); //object
/*
給物件新增屬性
*/
obj.name = "孫悟空";
// console.log(obj);
obj.gender = "男";
obj.age = 300;
console.log(obj); // {"age":300,"gender":"男","name":"孫悟空"}
/*
讀取屬性
object.屬性
如果讀取物件中沒有的屬性不會報錯,返回undefined
*/
console.log(obj.name); // 孫悟空
console.log(obj.hello); // undefined
/*
修改屬性:
obj.屬性名 = 新值
*/
obj.name = "豬八戒";
console.log(obj.name);
/*
刪除物件屬性 delete obj.屬性名
*/
delete obj.name;
console.log(obj.name);
var obj = new Object();
/*
向物件中新增一個屬性
屬性名:
- 物件的屬性名不強制要求遵守識別符號規範,但是我們要儘量按標準去命名
- 如果要使用特殊符號來命名不能採用 物件.屬性名 的方式來操作
- 需要使用另一種新增屬性的方式來新增以及操作語法 obj["屬性名"] = 值;
obj["屬性名"] 這種方式[]中可以直接傳入一個變數,會自動去變數裡的值
*/
obj["123"] = 789;
console.log(obj);
console.log(obj["123"]);
/*
物件的屬性值可以適任何數據型別包括Object
*/
obj.obj = new Object();
obj.obj.name = "你好,我是物件的物件";
console.log(obj);
console.log(obj.obj.name);
/*
in 運算子
- 可以檢查一個物件中是否含有指定的屬性,如果有返回true,沒有則返回false
- 語法: "屬性名" in 物件
*/
console.log("test2" in obj);
console.log("123" in obj);
/*
物件字面量,建立一個物件
*/
var obj = {};
console.log(obj);
console.log(typeof obj);
/*
使用字面量的方式建立物件時可以直接新增屬性
*/
var obj2 = {name:"豬八戒",age:800,hight:"185"};
console.log(obj2);
console.log(typeof obj2);