從零開始,學習web前端之js基礎
js來源
Javascript作為web標準中的行為標準,最初起名叫LiveScript,它是Netscape開發出來一種指令碼語言,其目的是為了擴充套件基本的Html的功能,驗證web頁表單資訊,為web頁增加動態效果。為了趕上java的熱潮,Netscape和Sun公司一起開發了一種新的指令碼語言,他的語法和Java非常的類似,所以更名為:Javascript。
js歷史
因為 JavaScript 1.0 非常成功,成為web的必備元件,Netscape 在 Netscape Navigator 3.0 中釋出了 1.1 版。恰巧那個時候,微軟決定進軍瀏覽器,釋出了 IE 3.0 並搭載了一個 JavaScript 的克隆版,叫做 JScript。微軟步入 Web 瀏覽器領域的這重要一步雖然令其聲名狼藉,但也成為 JavaScript 語言發展過程中的重要一步。
在微軟進入後,有 3 種不同的 JavaScript 版本同時存在:Netscape Navigator 3.0 中的 JavaScript、IE 中的 JScript 以及 CEnvi 中的 ScriptEase。與 C 和其他程式語言不同的是,JavaScript 並沒有一個標準來統一其語法或特性,而這 3 中不同的版本恰恰突出了這個問題。隨著業界擔心的增加,這個語言的標準化顯然已經勢在必行。
ECMAScript
ECMAScript是一種由Ecma國際前身為歐洲計算機制造商協會,英文名稱是European Computer Manufacturers Association。
正是因為JavaScript 並沒有一個標準來統一其語法或特性,所以歐洲的這個ECMA的組織,牽頭制定JavaScript的標準,取名為ECMAScript。
簡單來說ECMAScript不是一門語言,而是一個標準。符合這個標準的比較常見的有:JavaScript、Action Script(Flash中用的語言)。
ECMAScript是標準,javascript是實現
JS組成
JS = ECMAScript + DOM + BOM
ECMAScript(前身為歐洲計算機制造商協會)
JavaScript的語法規範
DOM(Document Object Model 的簡稱)
JavaScript操作網頁上元素的API
BOM(Browser Object Model 的簡稱)
JavaScript操作瀏覽器部分功能的API
引入方式
內嵌式:直接在html文件中編寫js程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title >
</head>
<body>
</body>
</html>
<script>
alert("hello")
</script>
外鏈式:鏈入一個外js檔案
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
</body>
</html>
<script type="text/javascript" src="js/index.js" ></script>
輸出訊息的幾種方式
alert() 在頁面彈出一個對話方塊,早期JS除錯使用。
confirm() 在頁面彈出一個對話方塊, 常配合if判斷使用。
console.log() 將資訊輸入到控制檯,用於js除錯。
prompt() 彈出對話方塊,用於接收使用者輸入的資訊。
document.write()在頁面輸出訊息,不僅能輸出資訊,還能輸出標籤。
示例:
alert("hello");
confirm("關閉瀏覽器?");
console.log("hello");
按F12選擇console或控制檯可以看見
prompt("姓名");
document.write("hello")
document.write("<h1>hello</h1>")
變數
會變化的量。
變數是用來儲存資料的容器。
命名規則
駝峰命名規則:userName
遵從規則:
1.變數命名必須以字母或是下標符號”_”或者”$”為開頭。
2.變數名長度不能超過255個字元。
3.變數名中不允許使用空格,首個字不能為數字。
4.不用使用指令碼語言中保留的關鍵字及保留符號作為變數名。
5.變數名區分大小寫。(javascript是區分大小寫的語言)
定義變數
var name;//定義變數
給變數賦值
var name;//定義變數
name="yzq"//給變數賦值
定義並賦值
在實際的開發中我們一般在定義變數的時候直接賦值
var name="yzq" =號是賦值運算子
資料型別
簡單資料型別
- 數值型別 number
- 字串型別 String
- 布林型別 boolean
- 未定義 undefined
number
進位制
常用的進位制
- 二進位制 基數為2,逢2進1
- 八進位制 基數為8,逢8進1
- 十進位制 滿10進1
- 十六進位制 由0-9,A-F組成,字母不區分大小寫。
浮點數
因為精度丟失問題,所以不要判斷計算後的兩個浮點數是否相等。
示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
var num=0.07;
console.log(num*100);//輸出的值為7.000000000000001
</script>
</head>
<body>
</body>
</html>
數值範圍
由於記憶體的限制,ECMAScript 並不能儲存世界上所有的數值
最小值:Number.MIN_VALUE,這個值為: 5e-324
最大值:Number.MAX_VALUE,這個值為: 1.7976931348623157e+308
無窮大:Infinity
無窮小:-Infinity
示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
console.log(Number.MAX_VALUE);
console.log(Number.MIN_VALUE)
console.log(1/0);
console.log(-1/0);
</script>
</head>
<body>
</body>
</html>
NaN
Not a Number的簡寫
console.log(“abc”/18); //結果是NaN
Undefined和任何數值計算都為NaN;
NaN 與任何值都不相等,包括 NaN 本身
isNaN() :任何不能被轉換為數值的值都會導致這個函式返回 true
isNaN(NaN);// true
isNaN(“blue”); // true
isNaN(123); // false
示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
var a="aaaa"/11;
console.log(a);
console.log(isNaN(a));//true
console.log(isNaN(NaN));//true
console.log(isNaN(123));//false
</script>
</head>
<body>
</body>
</html>
String
定義方式
用引號時,可單可雙,不可一單一雙。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
var a="hello";
var b='hello';
console.log(a);
console.log(b);
</script>
</head>
<body>
</body>
</html>
轉義符
無法輸出的字元,先輸出/,再輸出字元。
例:想在雙引號中輸出雙引號,需要轉義符
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
var a="h'el'lo";
var b='h、/"el\lo';
var c="aaaa\"dsd\'sa";//這裡雙引號需要轉義符
console.log(a);
console.log(b);
console.log(c);
</script>
</head>
<body>
</body>
</html>
字串拼接
通過+拼接字串
示例
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
var a="hello";
var b="world";
console.log(a+" "+b);
</script>
</head>
<body>
</body>
</html>
字串不可變
字串比較特殊,一旦給值後就無法再修改他的值。如果再賦值,相當於重新建立的一個String物件,而原有的字串會被回收。
Boolean
boolean型別有兩個字面量:true和false,區分大小寫。(大寫不對)
雖然Boolean 型別的字面值只有兩個,但 ECMAScript 中所有型別的值都有與這兩個 Boolean 值等價的值
注意:
true,任何非0數字,任何字串,任何物件都可以表示true。
例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
var a=2;
if (a){
alert(a);
}else {
alert("false")
}
</script>
</head>
<body>
</body>
</html>
false、0 、“”、undefined 、null為false
例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
if (""){
alert(true);
}else {
alert("false")
}
</script>
</head>
<body>
</body>
</html>
if判斷時會把()內的值強行轉換成boolean型別進行判斷。
undefined和null
null和undefined有很大的相似性。
null == undefined的結果(true)也就更加能說明這點。但是null ===undefined的結果(false)。
不過相似歸相似,還是有區別的,就是和數字運算時,10 + null結果為:10;10 + undefined結果為:NaN。
任何資料型別和undefined運算都是NaN;
任何值和null運算,null可看做0運算。
資料型別轉換
轉換成字串型別
- 變數+“” 或者 變數+“abc”
- String(變數)
- 變數.toSting() 注意:undefined和null不可以,Null和undefined無toString方法。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
a=111;
console.log(typeof(a+""));
console.log(typeof(a+"sdas"));
console.log(typeof(a+"sdas"));
console.log(typeof String(a));
console.log(typeof (a.toString()))
</script>
</head>
<body>
</body>
</html>
轉換為number型別
1)變數-*/一個數字(有非數字字元會出現NaN)
<script>
var a="1";
console.log(a-0); //1
console.log(typeof (a-0));//number
console.log(a/1);//1
console.log(typeof (a-1));//number
console.log(a*1);//1
console.log(typeof (a*1));//number
console.log("1aa"-1);//NaN
</script>
2) Number(變數)(有非數字字元會出現NaN)
<script>
var a = "1.4";
console.log(Number(a)); //1.4
console.log(typeof Number(a));//number
console.log(Number(true))//1
console.log(Number(false));//0
console.log(Number("1aa"));//NaN
</script>
需要注意的是:
Number(“”)返回0
console.log(Number(true))返回1
console.log(Number(false));返回0
3) parseInt()和parseFloat()(譯為取整和取浮點數)
var a = "1.4";
console.log(parseInt(a)); //1
console.log(typeof parseInt(a));//number
console.log(parseInt(true))//NaN
console.log(parseInt(false));//NaN
console.log(parseInt("1aa"));//1
console.log(parseFloat("1.221aaa"));//1.221
注意:
parseInt(“”)和parseFloat(“”)返回NaN
parseInt(變數):如果變數中收割字元為字母則結果為NaN,否則取出現首個非數字前的整數。
parseFloat(變數):如果變數中收割字元為字母則結果為NaN。否則取出現首個非數字前的浮點數。(沒有小數取整)
轉換為boolean型別
任何資料型別都可以轉換成boolean型別
1)Boolean(變數);
<script>
console.log(Boolean("111"));//true
console.log(Boolean(0));//false
console.log(Boolean(1));//true
</script>
2)!!變數(兩個感嘆號 變數)
console.log(!1);//false
console.log(!!1);//true
console.log(!0);//true
console.log(!!0);//false
第一個邏輯非操作 會基於無論什麼運算元返回一個與之相反的布林值
第二個邏輯非操作 則對該布林值求反
於是就得到了這個值真正對應的布林值
操作符
操作符種類
一、算數運算子(+—*/…)
a) 一元運算子:正號、負號、++、–、平方等一個變數就能運算
b) 二元運算子:+-*/%等兩個變數才能運算
c) 三元運算子: 值1?值2:值3;
二、邏輯運算子( ||&& ! )(或且非)
三、比較運算子(<、>、==、>=…)
四、賦值運算子(=、+=、-=、*=、/=、%=)
優先順序
優先順序從高到底
() 優先順序最高
一元運算子 ++ – !
算數運算子 先* / % 後 + -
關係運算符 > >= < <=
相等運算子 == != === !==
邏輯運算子 先&& 後||
&&和||運算
1)&&連結兩個boolean型別,有一個是false結果就是false。兩個都為true時才為true。
2)||連結兩個boolean型別,有一個是true結果就是true。兩個都為false時才為false。
console.log(false && true);//false
console.log(true && true);//true
console.log(false || true);//true
console.log(false || false);//false
流程控制
選擇結構
if語句
If語句用法有三種
1.if(條件1){程式1}
2.if(條件1){程式1}else{程式2}
3.if(條件1){程式1}else if(條件2){程式2}…else{程式n}
if 語句 - 只有當指定條件為 true 時,使用該語句來執行程式碼
if…else 語句 - 當條件為 true 時執行程式碼,當條件為 false 時執行其他程式碼
if…else if….else 語句 - 使用該語句來選擇多個程式碼塊之一來執行
示例:
<script>
var a=1;
if (a==1){
alert(1);
}else if(a==2) {
alert(2);
}else if (a==3){
alert(3);
}
</script>
switch
語法
switch(n)
{
case 1:
執行程式碼塊 1
break;
case 2:
執行程式碼塊 2
break;
default:
n 與 case 1 和 case 2 不同時執行的程式碼
}
工作原理:首先設定表示式 n(通常是一個變數)。隨後表示式的值會與結構中的每個 case 的值做比較。如果存在匹配,則與該 case 關聯的程式碼塊會被執行。使用 break 來阻止程式碼自動地向下一個 case 執行。
注意:
break可以省略,如果省略,程式碼會繼續執行下一個case
switch 語句在比較值時使用的是全等(===)操作符,因此不會發生型別轉換
(例如,字串 “10” 不等於數值 10)。
var a = 1;
switch (a) {
case "1":
console.log("字串1")
break;
case 1:
console.log(1);
break;
default:
console.log("default");
break;
}
迴圈結構
for 迴圈
語法:
for (語句 1; 語句 2; 語句 3)
{
被執行的程式碼塊
}
語句 1 在迴圈(程式碼塊)開始前執行
語句 2 定義執行迴圈(程式碼塊)的條件
語句 3 在迴圈(程式碼塊)已被執行之後執行
示例:
<script>
for(var i=0;i<10;i++){
console.log(i);
}
</script>
for(;;){程式} 死迴圈;
while
語法
while (條件)
{
需要執行的程式碼
}
While 迴圈會在指定條件為真時迴圈執行程式碼塊。
示例
<script>
var i=0;
while (i<5){
i++;
console.log(i);
}
</script>
死迴圈:
while(true){
}
do..while
語法:
do
{
需要執行的程式碼
}
while (條件);
do/while 迴圈是 while 迴圈的變體。該迴圈會執行一次程式碼塊,在檢查條件是否為真之前,然後如果條件為真的話,就會重複這個迴圈。
示例:
<script>
var i = 0;
do {
console.log(i)
} while (i > 0);
</script>
break和continue
break : 立刻跳出迴圈,不再執行該迴圈中的任何程式;
示例
<script>
var i=0;
while (true){
if (i==3){
break;
}
i++;
console.log(i);
}
</script>
continue : 跳出本次迴圈,進入下一次迴圈中繼續執行程式;
示例:
<script>
for (var i = 0; i < 10; i++) {
if (i == 5)continue
console.log(i);
}
</script>
陣列
陣列是一種資料型別,可以儲存多個數據。
陣列的定義
1.字面量定義
var arr={1,2,3};
2.物件定義
var arr = new Array(引數);
引數位置一個數值時為陣列長度,多個數值時為陣列中的元素。
陣列的操作
獲取陣列的長度
陣列的長度 = 陣列名.length;
可以通過修改陣列的長度來改變陣列中元素的個數,如果改小了,陣列從後面刪除元素。(偽陣列的長度可以修改,但是不能修改裡面的元素)
<script>
var arr = new Array(1, 2, 3, 4, 5, 6);
console.log(arr.length);
console.log(arr);
arr.length = 3;
console.log(arr.length);
console.log(arr);
</script>
獲取陣列元素
陣列中的指定元素 = 陣列名[索引值];
陣列的索引代表的是陣列中的元素在陣列中的位置,從0開始。
如果獲取陣列中元素是,陣列名[索引值],沒有指定索引(元素沒那麼多),系統不報錯,而是給定值為undefined;
示例:
<script>
var arr = [1, 2, 3, 4, 5];
console.log(arr[0]);//1
console.log(arr[3]);//4
console.log(arr[5]);//undefined
</script>
遍歷陣列
遍歷陣列就是獲取陣列中每一個元素
一般通過for迴圈來遍歷陣列
示例:
<script>
var arr = [1, 2, 3, 4, 5];
for (var i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
</script>
函式
函式是什麼
函式就是可重複使用的程式碼塊。
函式的定義
函式就是包裹在花括號中的程式碼塊,前面使用了關鍵詞 function:
function functionname()
{
執行程式碼
}
當呼叫該函式時,會執行函式內的程式碼。
可以在某事件發生時直接呼叫函式(比如當用戶點選按鈕時),並且可由 JavaScript 在任何位置進行呼叫。
JavaScript 對大小寫敏感。關鍵詞 function 必須是小寫的,並且必須以與函式名稱相同的大小寫來呼叫函式
示例:
<script>
/*定義函式*/
function fn() {
alert("我是個函式")
}
/*呼叫函式*/
fn();
</script>
引數
1)形參
形式上參與運算的變數,無實際值,為實參佔位置,就像一`個軀殼一樣。(可以理解為函式的內部變數外部無法訪問)
2)實參
實際參與運算的變數。形參為他佔位置,真實參與運算的變數。
/*定義函式*/
function sum(a,b) {
console.log(a+b);
}
/*呼叫函式*/
sum(1,2);//傳入實際引數
返回值
有時,我們會希望函式將值返回呼叫它的地方。通過使用 return 語句就可以實現。在使用 return 語句時,函式會停止執行,並返回指定的值。
<script>
/*定義函式*/
function add(a, b) {
return a + b;//將計算後的值返回
}
/*呼叫函式*/
var sum = add(1, 2);//傳入實際引數
console.log(sum);//3
</script>
注意
1. 如果函式沒有顯示的使用 return語句 ,那麼函式有預設的返回值:undefined
2. 如果函式使用 return語句,那麼跟在return後面的值,就成了函式的返回值
3. 如果函式使用 return語句,但是return後面沒有任何值,那麼函式的返回值 也是:undefined
4. 函式使用return語句後,這個函式會在執行完 return 語句之後停止並立即退出,也就是說return後面的所有其他程式碼都不會再執行。
變數和作用域(函式中的變數需要函式執行後才能使用)
全域性變數(成員變數)
哪裡都可以訪問到的變數。(進入script立即定義的變數和沒有var的變數)
區域性變數
函式內部的變數,只有函式內部可以訪問到。(函式內部用var定義的變數和形參)
<script>
var a = "111";//全域性變數
b = "222"//全域性變數
function fn() {
var c = "333";//區域性變數
d = "444";//全域性變數
}
fn();//函式內的變數必須先初始化(呼叫函式),然後才能訪問
console.log(a);//111
console.log(b);//222
console.log(c);//訪問不到,c是區域性變數
console.log(d);//444
</script>
隱式全域性變數
隱式全域性變數就是隱藏的全域性變數不好被發現。
示例
function fn(){
var a = b = c = 1; // b和c就是隱式全域性變數(等號)
var a = 1; b = 2; c = 3; // b和c就是隱式全域性變數(分號)
var a = 1 , b = 2 , c = 3; // b和c就不是隱式全域性變數(逗號)
}
預解析
js的解析器在頁面載入的時候會檢查語法是否有錯誤,並提升變數宣告。
<script>
console.log(aaa);//這裡會輸出undefined
var aaa=1;
</script>
在頁面載入時,解析器會提升變數宣告,但不會提升值
上面的程式碼在解析過後相當於:
<script>
var aaa;
console.log(aaa);//這裡會輸出undefined
aaa=1;
</script>
物件
什麼是物件
JavaScript 中的所有事物都是物件:字串、數值、陣列、函式……
此外,JavaScript 允許自定義物件。
物件具有一定的特性和行為。
javascript是基於物件的語言。只能創建出一類物件(都是Object型別);
物件的屬性和方法
屬性是與物件相關的值。
方法是能夠在物件上執行的動作。
訪問物件的屬性
語法
objectName.propertyName
訪問物件的方法
語法
objectName.methodName()
建立物件的方法
1.通過new Object建立
<script>
/*建立物件*/
var person = new Object();
/*定義屬性*/
person.name = "yzq";
person.age = 23;
/*定義方法*/
person.work = function () {
console.log("工作");
}
/*呼叫物件的屬性和方法*/
console.log(person.name);
person.work();
</script>
2.物件字面量
<script>
/*字面量物件*/
var p = {
name: "yzq",
age: 23,
work: function () {
console.log("工作");
}
}
console.log(p.age);
p.work();
</script>
3.通過函式構造物件
<script>
function person(name, age) {
this.name = name;
this.age = age;
this.work = work;
function work() {
console.log("工作");
}
}
var p = new person("yzq", 23);
console.log(p.name);
p.work();
</script>
this關鍵字
this只出現在函式中。
誰呼叫函式,this就指的是誰。
示例:
function test() {
console.log(this);
}
test(); //window.test();
//上面的this是window,實際是window呼叫test()
/*字面量物件*/
var p = {
name: "yzq",
age: 23,
changeName: function (newName) {
this.name = newName;
}
}
p.changeName("喻志強");//changeName中的this就是p
console.log(p.name);//輸出 喻志強
// 建構函式中的this始終是new的當前物件
javascript中的內建物件
javascript給我們提供了很多內建物件,我們可以直接呼叫這些物件的屬性和方法。
參考網站
如果你覺得本文對你有幫助,麻煩動動手指頂一下,算是對本文的一個認可。也可以關注我web前端的部落格專欄,我會不定期的更新,如果文中有什麼錯誤的地方,還望指正,謝謝!