一、變數、數據類型與運算符 1.變數 聲明變數: 2.數據類型 隱式轉換 強制轉換 3.運算符 1.算術運算符 2.賦值運算符和比較運算符 3.邏輯運算符 4.三元運算符 5.運算符優先順序 二、流程式控制制 1.條件語句 var readline = require("readline"); var r ...
JavaScript是一種屬於網路的腳本語言,常用來為網頁添加各式各樣的動態功能,是一種動態類型、弱類型、基於原型的語言。
它包括三個部分:ECMAScript、BOM和DOM。ECMAScript描述了該語言的語法和基本對象。BOM,瀏覽器對象模型,描述了與瀏覽器進行交互的方法和介面。DOM,文檔對象模型,描述了處理網頁內容的方法和介面。
js的使用:js代碼寫在script標簽中,其引入方式和css樣式的style標簽一致。
一、變數、數據類型與運算符
1.變數
聲明變數:
- 通過var關鍵字聲明一個或多個變數。
- 聲明變數的同時可以給其賦值(直接量,字面量),也可以不賦值,不賦值時預設值為undefined。
- 變數命名遵循一般的命名規範:區分大小寫,不能包含特殊字元,大小駝峰命名或下劃線命名,不能以數字開頭,命名含義明確等。
- 變數在記憶體中會自動存儲於釋放。
2.數據類型
js中的數據類型包括:字元串(String)、數字(Number)、布爾(Boolean)、數組(Array)、對象(Object)、空(Null)、未定義(Undefined)。
隱式轉換
// 轉換為布爾類型
var a; // undefined.
var test = function(vec){
if(vec){
console.log("true");
}else{
console.log("false");
}
};
a = null;
a = 0; // 0值
a = NaN; // NaN值
a = ''; // 空字元串
test(a);
// 轉換成數值型數據
var a;// undefined -> NaN
var b = 1;
a = null; // null -> 0
a = false; // false -> 0
a = "123"; // "12" -> 12
a = "123abc"; // "123abc" -> NaN
console.log(typeof a);
console.log(b + a);
強制轉換
// parseInt(string):將字元串類型轉換成數值;
// parseFloat(string):將字元串類型轉換成浮點型數值;
var a = "123";
console.log(typeof parseInt(a));
console.log(typeof parseFloat(a));
// String()和toString():將其它類型轉換成字元串
var a = 123;
console.log(typeof String(a));
console.log(typeof a.toString());
// Boolean:將其它數據類型轉換成布爾值。;
var a = undefined;
console.log(Boolean(a), typeof Boolean(a));
3.運算符
1.算術運算符
+、-、*、/、%、++、--
++、--分為首碼形式和尾碼形式。首碼先自加(減)再執行運算,尾碼先執行運算再自加(減)。
2.賦值運算符和比較運算符
=、+=、-=、*=、/=、%=、.=
>、>=、<、<=、==、!=、===、!==
3.邏輯運算符
&&、||、!
4.三元運算符
// exp1?exp2:exp3
var a = 1231; // var a;
typeof a==="number"?console.log("true"):console.log("false");
5.運算符優先順序
運算符 | 描述 |
. [] () | 欄位訪問、數組下標、函數調用以及表達式分組 |
++ -- - ~ ! delete new typeof void | 一元運算符、返回數據類型、對象創建、未定義值 |
* / % | 乘法、除法、取模 |
+ - + | 加法、減法、字元串連接 |
<< >> >>> | 移位 |
< <= > >= instanceof | 小於、小於等於、大於、大於等於、instanceof |
== != === !== | 等於、不等於、嚴格相等、非嚴格相等 |
& | 按位與 |
^ | 按位異或 |
| | 按位或 |
&& | 邏輯與 |
|| | 邏輯或 |
?: | 條件 |
= oP= | 賦值、運算賦值 |
, | 多重求值 |
二、流程式控制制
1.條件語句
// if(exp){執行代碼段};
var a = 123; // var a;
if(typeof a === "number"){
console.log("true");
}
// if(exp){exp為true的代碼段}else{exp為false的代碼段};
var a = 123; // var a;
if(typeof a === "number"){
console.log("true");
}else {
console.log("false");
}
// if ... else if ...
var readline = require("readline");
var rl = readline.createInterface({
input: process.stdin,
out: process.stdout,
});
rl.question("請輸入成績: ", (number) => {
if(number > 100){
console.log("輸入的成績不能大於100!");
}else if(number > 80){
console.log("錄入成功,A檔");
}else if(number > 60){
console.log("錄入成功,B檔");
}else if(number > 0){
console.log("錄入成功,C檔");
}else{
console.log("輸入的成績不能小於0!")
}
rl.close();
});
rl.on("close", function () {
console.log("退出程式!");
process.exit();
});
var readline = require("readline"); var rl = readline.createInterface({ input: process.stdin, out: process.stdout, }); rl.question("請輸入星期幾: ", (day) => { switch(day){ case "1": console.log("今天吃炒麵"); break; case "2": console.log("今天吃魚香肉絲"); break; case "3": console.log("今天吃麻辣香鍋蓋飯"); break; case "4": console.log("今天吃豆丁胡蘿蔔"); break; case "5": console.log("今天公司聚餐"); break; case "6": console.log("今天吃泡麵"); break; case "7": console.log("今天擼串"); break; default: console.log("input error.") } rl.close(); }); rl.on("close", function () { process.exit(); }
// switch ... case ...
var readline = require("readline");
var rl = readline.createInterface({
input: process.stdin,
out: process.stdout,
});
rl.question("請輸入星期幾: ", (day) => {
switch(day){
case "1":
console.log("今天吃炒麵");
break;
case "2":
console.log("今天吃魚香肉絲");
break;
case "3":
console.log("今天吃麻辣香鍋蓋飯");
break;
case "4":
console.log("今天吃豆丁胡蘿蔔");
break;
case "5":
console.log("今天公司聚餐");
break;
case "6":
console.log("今天吃泡麵");
break;
case "7":
console.log("今天擼串");
break;
default:
console.log("input error.")
}
rl.close();
});
rl.on("close", function () {
process.exit();
});
2.迴圈語句
for 迴圈
和java中的for迴圈一致:for(exp1; exp2; exp3){代碼塊;}
- exp1: 無條件的執行第一個表達式
- exp2: 是判斷是否能執行迴圈體的條件
- exp3: 增量操作
// 九九乘法表
var str = "";
for(var i=1;i<=9;i++){
for(var j=1;j<=i;j++){
str += i + "*" + j + "=" + i*j + " ";
if(i === j){
str += "\n";
}
}
}
console.log(str);
while 迴圈
var arr = function (number) { var arr_list = new Array(); // var arr_list = []; var i = 0; while (i < number){ arr_list[i] = Math.random(); i++; } return arr_list; }; console.log(arr(5))
var arr = function (number) {
var arr_list = new Array(); // var arr_list = [];
var i = 0;
while (i < number){
arr_list[i] = Math.random();
i++;
}
return arr_list;
};
console.log(arr(5));
do ... while迴圈
// 和java中的do ... while 迴圈一致,先執行依次do內的代碼塊,再執行while 判斷。不管while條件判斷是否成功,do都會至少執行一次。
var arr = function (number) {
var arr_list = new Array(); // var arr_list = [];
var i = 0;
do {
arr_list[i] = Math.random();
i++;
}while (i > number);
return arr_list;
};
console.log(arr(5));
三、函數
1.定義
函數通過function關鍵字定義。function 函數名稱([參數1, ...]){代碼塊; [return 返回值]};也可以通過Function構造器定義函數。
// 通過function 關鍵字定義函數
function hello() {
console.log("hello world.")
};
hello();
匿名函數,即function關鍵字定義的無函數名稱的函數。
// 通過function 關鍵字定義匿名函數
var hello = function () {
console.log("hello world.")
};
hello();
將匿名函數作為參數,傳遞給另一個函數進行執行,此時其被稱為回調函數。回調函數在js中異常強大。
function calc(v1, v2, callback) {
v1 = v1 || 1;
v2 = v2 || 2;
return callback(v1, v2);
}
calc(3,4, function (v1, v2) {
return v1 + v2
});
2.參數
函數如果定義了參數,在調用函數的時候沒有傳值則預設值為undefined。如果傳遞的參數超過了形參,js會忽略掉多於的參數值。
function calc(v1, v2){
return v1 + v2;
}
console.log(calc(5, 6, 7));
es5不能直接寫形參的預設值,但可以通過arguments對象來實現預設值。同時,arguments對象可以實現可變參數。
function calc(v1, v2){
v1 = v1 || 1;
v2 = v2 || 2;
return v1 + v2;
}
console.log(calc());
3.函數調用
function calc(v1, v2, callback) {
v1 = v1 || 1;
v2 = v2 || 2;
return callback(v1, v2);
}
value1 = calc(3,4, function (v1, v2) {
return v1 + v2
});
value2 = calc.call(calc, 3, 4, function (v1, v2) {
return v1 + v2;
});
value3 = calc.apply(calc, [3, 4, function (v1, v2) {
return v1 + v2;
}]);
value4 = (function (v1, v2) {
return v1 + v2;
})(3, 4);
console.group("函數調用的方式");
console.log("- 直接調用: " + value1);
console.log("- 間接call調用: " + value2);
console.log("- 間接apply調用: " + value3);
console.log("- 自調用: " + value4);
四、對象
js中對象分為:內建對象、宿主對象和自定義對象。
1.對象創建
直接通過var關鍵字定義Object對象。
var obj1 = new Object();
var obj2 = {};
// 使用字面量來創建一個對象: var obj = {} 和new本質上是一模一樣的
// 使用字面量創建對象時,可以在創建對象時直接指定對象中的屬性
// 字面量裡面的屬性可以加引號,也可以不加引號,建議不加
// 如果使用特殊字元或名字則必須加引號
var obj = {
name: "孫悟空",
gender: "男猴",
age: 1500,
credit: {
name1: "孫行者",
name2: "齊天大聖"
}
};
console.log(obj);
也可以通過工廠方法創建對象。
function Person(name, age) {
var obj = {};
obj.name = name;
obj.age = age;
obj.sayHello = function () {
console.log(obj.name + ", " + obj.age + "years old.");
};
return obj;
}
sun = Person("孫悟空", 2000);
sun.sayHello();
2.對象屬性操作和方法創建
var obj = new Object(); // new 構造對象, 可使用typeof obj 查看對象
// 在對象中保存的值稱為屬性
// 向對象中添加屬性:對象.屬性名 = 屬性值
obj.name = "孫悟空";
obj.gender = "男猴";
obj.age = 18;
console.log(obj);
// 讀取對象中的屬性: 對象.屬性名
// 如果讀取的對象中沒有該屬性,會返回undefined
console.log(obj.name);
// 修改對象的屬性值: 對象.屬性名 = 新值
obj.age = 24;
console.log(obj);
// 刪除對象屬性
delete obj.age;
console.log(obj);
// 自定義
obj.fuc = function add(x, y) {
return x+y;
};
console.log(obj);
3.作用域
在js中一共有兩種作用域,全局作用域和函數作用域
全局作用域:
- 直接編寫在script標簽內的JS代碼
- 在頁面打開時創建,在頁面關閉時銷毀
- 在全局作用域中有一個全局對象window,可以直接使用.它代表的是一個瀏覽器的視窗,它由瀏覽器創建
- 在全局作用域中創建的變數都會作為window對象的屬性保存
- 在全局作用域中創建的函數都會作為window對象的方法保存
- 全局作用中的變數和函數在頁面的任意位置都可以被訪問/執行
函數作用域:
- 調用函數時創建函數作用域,函數執行完畢之後,函數作用域銷毀
- 每調用一次函數就會創建一個新的函數作用域,它們之間是相互獨立的
- 全局作用域中訪問不到函數作用域,函數作用域中可以訪問全局作用域
- 函數作用域會優先查找本作用域中的變數,如果沒有就找上一級中的變數
- 函數作用域的a並不影響上一級作用域中的a
- 如果不使用var聲明,直接寫a = 20,就是在操作全局作用域中的a變數
- 如果使用全局作用域中的a變數[在本作用域中已聲明a變數],可以用window.a,這在b1中已強調過
全局作用域
console.log(window); // window是個對象
// 使用var關鍵字聲明的變數,會在所有的代碼執行之前執行;如果聲明變數時不使用var,則變數不會被提前聲明
console.log(a); //