JavaScript學習第二天
技術標籤:JavaScriptjavascript
算了,這次勤快點,還是碼碼字。上次照片拍得實在太醜。
首先非常非常感謝 pink老師,感謝他的無私貢獻,或許能帶領我走進前端的殿堂。
目錄
一.arguments的使用
當我們不確定有多少個引數傳遞的時候,可以用argument來獲取。在JavaScript中,arguments實際上是當前函式的一個內建物件。所有函式都內建了一個arguments物件,arguments物件中儲存了傳遞的所有實參。
arguments展現形式是一個偽陣列,因此可以進行遍歷,偽陣列具有以下特點:
- 具有length屬性
- 按索引方式儲存資料
- 不具有陣列的push,pop等方法
e.g 求任意個數的最大值
function getMax(){
var max = arguments[0];
for (var i = 1;i < arguments.length;i++){
if (max < arguments[i])
max = arguments[i];
}
return max;
}
console.log(getMax(1,2,5,9,40,29,30));
二.函式練習
practice1 利用函式翻轉任意陣列reverse
function reverse(arr){
var newArr = [];
for (var i = arr.length - 1; i>=0; i--){
newArr[newArr.length] = arr[i];
}
return newArr;
}
var arr1 = reverse([1,3,5,7,9]);
console.log(arr1);
practice2 利用函式氣泡排序
function sort(arr){
for (var i = 0; i < arr.length-1; i++){
for (var j = 0; j< arr. length - i - 1;j++){
if (arr[j] > arr[j+1]){
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
var arr1 = sort([1,8,2,5,7]);
console.log(arr1)
practice3 利用函式判斷是否是閏年
function isRunYear(year){
return !((year%400)||(year%4==0&&year%100!=0))
}
console.log(isRunYear(2020))
三.函式的兩種宣告方式
1.利用函式關鍵字自定義函式(命名函式)
function fn(){
}
fn();
2.函式表示式(匿名函式)
var 變數名 = functino(){ };
例如
var fun = function(){
console.log('我是函式表示式');
}
fun();
注意:
(1)fun 是變數名,不是函式名
(2)函式表示式宣告方式和宣告變數差不多,只不過變數裡面存的是值,而函式表示式裡面存的是函式
(3)函式表示式也可以傳參
四.作用域
概念同C,提高程式的可靠性,減少命名衝突
分為全域性作用域和區域性作用域。
全域性作用域:整個script標籤或者是一個單獨的js檔案內
區域性作用域:(函式作用域)在函式內部就是區域性作用域,這個變數的名字只在函式內部起效果和作用
類似的變數也分為全域性變數和區域性變數
注意:
1.在函式內部沒有用 var 宣告而是直接賦值的也是全域性變數
2.函式的形參也可以看做區域性變數
3.全域性變數生命期長,比較佔記憶體。
4.現階段js(es6之前,es6表示版本)中沒有塊級作用域。
如
if (3 < 5){
var num = 10;
}
console.log(num);
//是會輸出10,不會報錯的
作用域鏈
如果函式中還有函式,那麼在這個作用域中就又可以誕生一個作用域。根據在內部函式可以訪問外部函式變數的這種機制,用鏈式查詢來決定哪些資料能被內部函式訪問,就稱作作用域鏈。
如
var num = 10;
function fn(){
var num = 20;
function fun(){
console.log(num);
}
}
fn();
//結果為20,離得近的遮蔽離得遠的,就近原則
五.預解析
我們js引擎執行js分為兩步:預解析和程式碼執行
(1)預解析:js引擎會把js裡面所有的var 還有 function 提升到當前作用域的最前面
(2)程式碼執行:按照程式碼書寫的順序從上往下執行
其中 預解析分為 變數預解析(變數提升) 和 函式預解析(函式提升)
(1)變數提升 就是把所有的變數宣告提升到當前的作用域最前面 不提升賦值操作。
(2)函式提升 就是把所有的函式宣告提升到當前作用域的最前面 不呼叫函式
// 1
console.log(num);
// 變數為宣告,報錯
// 2
console.log(num);
var num = 10;
// 結果為: undefined
// 相當於執行:
// var num;
// console.log(num);
// var num = 10;
// 3
fn();
function fn() {
console.log(11);
}
// 輸出11
// 相當於執行:
// function fn() {
// console.log(11);
// }
// fn();
// 4
fun();
var fun = function(){
console.log(11);
}
// 報錯
// 相當於執行:
// var fun;
// fun();
// var fun = function(){
// console.log(11);
// }
注意:
function f1(){
var a = b = c = 9;
// 相當於 var a = 9; b = 9; c = 9;
// b 和 c直接賦值 沒有var 宣告 當全域性變數看
}
六.物件(object)
在JavaScript中,物件是一組無序的相關屬性和方法的集合,所有的事物都是物件,例如字串,數值,數值,函式等等。
例如
(1)明星不是物件,而迪麗熱巴是物件
(2)女朋友不是物件,而xxx是物件
即物件是一個具體的事物,不能太抽象。實際上,根據我學的python,太抽象的話可以說成類。
物件由屬性和方法組成。
- 屬性:事物的特徵,在物件中用屬性來表示(常用名詞)
- 方法:事物的行為,在物件中用方法來表示(常用動詞)
創造物件的三種方法:
- 利用字面量來建立物件
- 利用new Object來建立物件
- 利用建構函式來建立物件
1.利用物件字面量來建立
如
var obj = {
uname: '張三瘋',
age: 18,
sex: '男',
sayHi: function() {
console.log('hi~');
}
}
// (1)裡面的屬性或者方法我們採用鍵值對的形式,鍵是屬性名,值是屬性值
// (2)多個屬性或者方法之間用,隔開
// (3)方法冒號後面跟的是一個匿名函式
// 呼叫屬性的兩種方法:
// (1)物件名.屬性名 . 我們理解為的
console.log(obj.uname);
// (2)物件名['屬性名']
console.log(obj['age']);
// 呼叫物件的方法 sayHi 物件名。方法名() 千萬不要忘記新增小括號
obj.sayHi();
2.利用 new Object來建立,如
var obj = new Object();
obj.uname = '張三瘋';
obj.age = 18;
obj.sex = '男';
obj.sayHi = function() {
console.log('hi~');
}
// (1)我們是利用等號 = 賦值的方法 新增物件的屬性和方法
// (2)每個屬性和方法之間用分號結束
// (3)呼叫同第一種方法建立的物件類似
console.log(obj.uname);
console.log(obj['sex']);
obj.sayHi();
3.利用建構函式建立物件
// 我們為什麼需要使用建構函式
// 就是因為我們前兩種建立物件的方法一次只能建立一個物件
// 我們可以利用函式的方法 重複這些相同的程式碼 我們就把這個函式稱為 建構函式
// 建構函式 就是把我們物件裡面的一些相同的屬性和方法抽象出來封裝到函式裡面
// 語法格式:
// function 建構函式名() {
// this.屬性名 = 屬性值;
// this.方法名 = function() {}
// }
// new 建構函式名();
// 例如:
function Star(uname, age, sex) {
this.name = uname;
this.age = age;
this.sex = sex;
}
var ldh = new Star('劉德華', 18 ,'男');
console.log(ldh.name);
// 注意:
// 1.建構函式名首字母要大寫
// 2.建構函式不需要 return 就可以返回結果