Javascript 基礎(chǔ)入門(一)

一. Javascript基本介紹

Javascript 簡(jiǎn)稱JS武翎,是一門獨(dú)立的編程語(yǔ)言烈炭,是可以運(yùn)行在瀏覽器上的腳本;名稱上有Java宝恶,但是它與Java沒有任何關(guān)系的符隙。
在HTML中引入JS的方法:
方案一, 直接在<script>標(biāo)簽中引入編寫js代碼
方案二, 將js代碼寫在js文件中, 然后通過script標(biāo)簽的src屬性進(jìn)行引入
兩種方式運(yùn)行出的效果是一致的. 但是需要各位注意一點(diǎn), HTML程序在執(zhí)行的時(shí)候是從上到下進(jìn)行渲染的. (代碼也是從上到下執(zhí)行的)

在js中使用// 來表示單行注釋. 使用/* */表示多行注釋.

二. Javascript基本數(shù)據(jù)類型

常見的兩行JS代碼

console.log('開始學(xué)習(xí)了');    // 在控制臺(tái)打印,相當(dāng)于python中的print
let a = '1002';
console.log(typeof a);    //打印變量a的數(shù)據(jù)類型

1垫毙、主要是以下幾種數(shù)據(jù)類型

number  數(shù)字, 不論是整數(shù)還是小數(shù), 數(shù)據(jù)類型都是number
string  字符串, 這個(gè)沒啥可聊的. 就是很單純的字符串
boolean  布爾值, 只有兩個(gè), true和false. 注意不是大寫T和F. 
object 對(duì)象, 這個(gè)比較特殊. 你可以理解為所有被new出來的東西都是對(duì)象  
undefined, 這個(gè)表示未定義. 所有沒有被定義過的東西默認(rèn)都是該類型 類似像空一樣的東西

2霹疫、定義變量

JS中,要使用一個(gè)變量要先定義變量综芥,關(guān)鍵詞是 var 或者 let丽蝎,可以定義變量名稱,不賦值膀藐。要注意一行代碼同時(shí)創(chuàng)建多個(gè)變量的情況屠阻。

var 變量名; // 創(chuàng)建變量, 此時(shí)該變量除了被賦值啥也干不了. 
let 變量名; // 創(chuàng)建變量, 此時(shí)該變量除了被賦值啥也干不了. 
var 變量名 = 值; // 創(chuàng)建一個(gè)變量, 并且有值. 
var 變量名 = 值1, 變量名2 = 值2, 變量名3 = 值3.....; // 一次創(chuàng)建多個(gè)變量.并都有值
var 變量名1, 變量名2, 變量名3 = 值3;  // 創(chuàng)建多個(gè)變量. 并且只有變量3有值

3红省、JS中的運(yùn)算符

JS中的運(yùn)算符和Python幾乎一致. 但有些特殊的.

and, or, not 到了js中注意,換成了&&, ||, !, 其含義和概念是一致的.

var a = 10, b = 20, c = 30 ;
console.log(a > b && b > c);  // false
console.log(!(a > b)) // 注意括號(hào)

4、JS 中的 == 和 ===,

== 只是判斷值是否一致,  
=== 會(huì)判斷數(shù)據(jù)類型和數(shù)據(jù)是否都一致. 
var a = "123";
var b = 123;
console,log(a == b);  // true
console.log(a === b); // false

5国觉、數(shù)據(jù)類型及進(jìn)制轉(zhuǎn)換

字符串轉(zhuǎn)換成數(shù)字吧恃,使用parseInt(字符串),parse英文翻譯是“解析”的意思

let a = '1002';
console.log(typeof a);
let b = parseInt(a);
console.log(typeof b); //輸出 number

數(shù)字轉(zhuǎn)換成字符串
方法1:數(shù)字.toString()麻诀,參數(shù)不填是默認(rèn)是十進(jìn)制
方法2: 數(shù)字 + ""

var a = 10;
var b = a.toString(16);  //輸出是16進(jìn)制數(shù)字對(duì)應(yīng)的字符串蚜枢,10對(duì)應(yīng)16進(jìn)制是a,
console.log(b);
console.log(typeof b);
//方法2
b = a+"";    //b就是字符串了

進(jìn)制轉(zhuǎn)換
parseInt 的結(jié)果是十進(jìn)制针饥,參數(shù)中要說明要轉(zhuǎn)換的參數(shù)是多少進(jìn)制的
toString() 要說明轉(zhuǎn)換成多少進(jìn)制的

var a = 10;
// 16進(jìn)制的數(shù)字是多少
var x = a.toString(16);  // a厂抽,字符串類型
console.log(x, typeof x)    //a string


// AB的十進(jìn)制是多少
var d = parseInt("AB", 16); // parseInt的結(jié)果是十進(jìn)制,參數(shù)中要說明要轉(zhuǎn)換的參數(shù)是多少進(jìn)制的 171
console.log(d, typeof d)    //171 number

6丁眼、JS中的++與--

a++; 就是a = a + 1
++a; 就是a = a + 1
a--; 就是a = a - 1
--a; 就是a = a - 1
重點(diǎn)概括:

  1. 不論是a++還是++a. 目的都是讓a自增1.

a++這個(gè)表達(dá)式整體運(yùn)算出來的結(jié)果等于 a
++a這個(gè)表達(dá)式整體運(yùn)算出來的結(jié)果等于 a + 1
表達(dá)式執(zhí)行完成后筷凤,a自增1

a = 10
b = a++    //a++表達(dá)式運(yùn)算結(jié)果為a,就是10苞七,所以b=10藐守;運(yùn)算完成后,a自增1蹂风,那么a=11
console.log(b)  // 10
console.log(a)  // 11
a = 10
b = ++a  //++a表達(dá)式運(yùn)算結(jié)果為a+1卢厂,就是10+1,所以b=11惠啄;運(yùn)算完成后慎恒,a自增1,那么a=11
console.log(b)  // 11
console.log(a)  // 11

以下邏輯比較奇怪撵渡,一般不會(huì)這么使用

a = 10;
a = a++;    //a=a融柬,也就是a=10,運(yùn)算完成后a自增1趋距,所以a又變成了11粒氧,但是最終賦值的時(shí)候,還是按照之前計(jì)算的a=a++节腐,而由于是先計(jì)算a++外盯,所以a++的值是a=10,a=11只是短暫的瞬間
console.log(a);  // 10

a = 10;
a = ++a;    //a=a+翼雀,也就是a=11饱苟,運(yùn)算完成后a自增1,所以a短暫瞬間變成了12锅纺,a=12掷空,但是賦值是最后運(yùn)算的,而++a是最初運(yùn)算的囤锉,值是11
console.log(a)  // 11

剖析:

a = 10;
a = a++;  
console.log(a);  // 10

第一步:a = 10
第二步:1)先計(jì)算a++坦弟,表達(dá)式的值是a,也就是10官地;
2)a自增1酿傍,而原來a=10,所以驱入,此時(shí)a==11赤炒;
3)最終賦值,a = a++亏较,記住莺褒,這一步只是賦值,而不再進(jìn)行對(duì)a進(jìn)行任何計(jì)算雪情,a++之前已經(jīng)計(jì)算好了遵岩,表達(dá)式的值就是10,所以巡通,賦值這步的結(jié)果就是把之前計(jì)算好的a++的值賦值給a尘执,所以,a==10宴凉。(在上一步a通過自增已經(jīng)從10變成11了誊锭,但是最后這步又對(duì)a重新進(jìn)行賦值了)
第三步:打印a的值,所以打印的結(jié)果是a=10

第二部分代碼:

a = 10;
a = ++a;  
console.log(a);  // 11

第一步:a = 10
第二步:1)先計(jì)算++a弥锄,表達(dá)式的值是a+1的值丧靡,也就是++a == 11;
2)a自增1籽暇,而原來a=10窘行,所以,此時(shí)a==11图仓;
3)最終賦值罐盔,a = ++a,記住救崔,這一步只是賦值惶看,而不再進(jìn)行對(duì)a進(jìn)行任何計(jì)算,++a之前已經(jīng)計(jì)算好了六孵,表達(dá)式的值就是11纬黎,所以,賦值這步的結(jié)果就是把之前計(jì)算好的a++的值賦值給a劫窒,所以本今,a=11;
第三步:打印a的值,所以打印的結(jié)果是a=11

7冠息、字符串操作

s.split() 字符串切割

let s = "劉德華_張學(xué)友_黎明_郭富城";

let res=s.split('_');
console.log(res);    // [ '劉德華', '張學(xué)友', '黎明', '郭富城' ]
console.log(typeof res);    // object

s.substr(start, len) 字符串切割, 從start開始切, 切l(wèi)en個(gè)字符

let s = "劉德華_張學(xué)友_黎明_郭富城"
let res = s.substr(4, 3);  // 從索引為4的位置開始切挪凑,切取長(zhǎng)度為3
console.log(res);  // 張學(xué)友

s.substring(start, end) 字符串切割, 從索引start切割到索引end,取左不取右

let s = "劉德華_張學(xué)友_黎明_郭富城"
let res1=s.substring(0,3)
console.log(res1)  //劉德華

(重點(diǎn))s.length 字符串長(zhǎng)度

let s = "劉德華_張學(xué)友_黎明_郭富城"
console.log(s.length)

s.charAt(i) 第i索引位置的字符

let s = "劉德華_張學(xué)友_黎明_郭富城"
console.log(s.charAt(0))  //劉

(重點(diǎn))st.charCodeAt(索引)逛艰,對(duì)應(yīng)索引的字符在ASCII碼中的字符編碼

let st='nameAge天空'
let res=st.toUpperCase()
console.log(st.charCodeAt(3)); //索引3對(duì)應(yīng)的字符是e躏碳,在ASCII編碼中對(duì)應(yīng)是101

把ASCII字符編碼轉(zhuǎn)換成字符

let as = String.fromCharCode(101)
console.log(as);  //輸出字符是e

s.indexOf('xxx')返回xxx的第一個(gè)索引位置, 如果沒有xxx. 則返回-1

let s = "劉德華_張學(xué)友_黎明_郭富城華"
let res=s.indexOf('華')
console.log(res);  //結(jié)果是2,返回的是散怖,第一個(gè)“華”的索引
console.log(s.indexOf('哈'))  //沒有'哈'這個(gè)字符菇绵,所以返回-1

s.lastIndexOf("xxx") 返回xxx的最后一次出現(xiàn)的索引位置,如果沒有xxx. 則返回-1

let s = "劉德華_張學(xué)友_黎明_郭富城華"
let res=s.lastIndexOf('華')
console.log(res);  //結(jié)果是14镇眷,返回的是咬最,最后一個(gè)“華”的索引

s.includes("xxx") 判斷xxx是否出現(xiàn)在s中. 在就返回 true,不在就返回 false欠动;相當(dāng)于是python中的in

let s = "劉德華_張學(xué)友_黎明_郭富城華"
console.log(s.includes('劉德華'));//返回true

s.toUpperCase() 把字符串中所有小寫字母轉(zhuǎn)換成大寫字母

let st='nameAge天空'
let res=st.toUpperCase()
console.log(res); // NAMEAGE天空

s.startsWith("xxx") 判斷是否以xxx開頭

let st='nameAge天空'
let res=st.toUpperCase()
console.log(res)
console.log(st.startsWith('n'))    ;// true
console.log(st.startsWith('an'))    ;// false

關(guān)于null和undefined. null可以理解為變量創(chuàng)建了永乌,但是值為空. undefined就是沒有定義變量。

練習(xí):提取json字符串

s = "callback_jsonp({'name': '劉德華', 'age': 18, zhiye:  {'one': '歌手'}})";

let start = s.indexOf('{')
let end = s.lastIndexOf('}')
let ret = s.substring(start, end+1)
console.log(ret)

二. JS條件語(yǔ)句

注:如果代碼塊1中的內(nèi)容只有一行. 則可以省略外面的大括號(hào)(一些逆向工程里會(huì)有)

// 語(yǔ)法
if(條件1){
    代碼塊1    
}

// 解讀: 當(dāng)`條件1`成立時(shí), 執(zhí)行代`碼塊1`中的內(nèi)容, 如果`條件1`不成立. 則不執(zhí)行該`代碼塊1`中的內(nèi)容

例子

let a = 10;
if(a>1){
    console.log('條件成立');
};

if (a>1) console.log('如果大括號(hào)中的內(nèi)容只有一行. 則可以省略外面的大括號(hào)');

雙條件分支

// 語(yǔ)法
if(條件1){
    代碼塊1
} else {
    代碼塊2
}
// 解讀: 當(dāng)`條件1`成立時(shí), 執(zhí)行`代碼塊1`中的內(nèi)容, 如果`條件1`不成立. 則執(zhí)行`代碼塊2`中的內(nèi)容

例子

let b=10;
if (b>20){
    console.log('條件為真是執(zhí)行');

}else {
    console.log('條件為假是執(zhí)行');
}

多條件分支

// 語(yǔ)法
if(條件1){
    代碼塊1
} else if(條件2) {
    代碼塊2
} else if(條件3) {
    代碼塊3
} ... {
    代碼塊n
} else {
    代碼塊else
}
// 解讀: 當(dāng)`條件1`成立時(shí), 執(zhí)行`代碼塊1`中的內(nèi)容, 如果`條件2`不成立. 則執(zhí)行`代碼塊2`中的內(nèi)容...如果都不成立, 最終執(zhí)行`代碼塊else`中的內(nèi)容. 

例子

let c = 85;
if (c>=85){
    console.log('優(yōu)秀')}
else if(c>=75){
    console.log('良好')}
else if(c>=60){
    console.log('及格')}
else {
    console.log('不及格')}

switch語(yǔ)句. 也是一種多分支翁垂,在JS中常用于混淆铆遭,打亂case的執(zhí)行順序。

switch(變量){
    case 值1:
        代碼塊1
        break  // 可選
    case 值2:
        代碼塊2
        break  // 可選
    case 值3:
        代碼塊3
        break  // 可選
        
    default:   // 可選
        default代碼塊
}

/*
    解讀: 
        執(zhí)行時(shí), 
        switch會(huì)判斷變量的值是否是`值1`, 
        如果是, 則執(zhí)行代碼塊1以及代碼塊1中的break, 
        如果不是, 則繼續(xù)判斷`值2`...
        如果前面的`值`都沒有和`變量`相等的.則執(zhí)行`default代碼塊`. 
        
    注意, 
        每一個(gè)`case`中都可以選擇`break`, 也可以不選擇`break`, 需要注意的是, 如果不寫`break`. 
        那么就會(huì)形成`case穿透`現(xiàn)象. 
        
    例, `變量`的值如果和`值1` 相等. 并且case1中沒有寫`break`, 
    則在執(zhí)行的時(shí)候. 會(huì)執(zhí)行完`case1`中的代碼. 
    然后會(huì)自動(dòng)穿透到`case2`中去執(zhí)行里面的代碼, 而不經(jīng)過case2中的數(shù)據(jù)的驗(yàn)證. 

*/

例子

let t=10;
switch (t){
    case 1:
        console.log('我是1');
        console.log('我就是1');
        break;
    case 2:
        console.log('我是2');
        console.log('我就是2');
        break;
    case 3:
    console.log('我是3');
    console.log('我就是3');
    break;
    default:
        console.log('我是默認(rèn)');
}

case穿透現(xiàn)象的利用

let month=5
switch (month){
    case 1:
    case 2:
    case 3:
        console.log('第一季度');
        break;
    case 4:
    case 5:
    case 6:
        console.log('第二季度');
                break;

    case 7:
    case 8:
    case 9:
        console.log('第三季度');
                break;

    case 10:
    case 11:
    case 12:
        console.log('第四季度');
        break;
    default:
        console.log('輸入的月份要在1-12之間')
}

三. JS中的循環(huán)語(yǔ)句

在js中有三種循環(huán)語(yǔ)句. 首先是while循環(huán). 它的邏輯和python中的while幾乎一模一樣, 就是符號(hào)上有些許的區(qū)別.

// 語(yǔ)法
while(條件){
    循環(huán)體 ->  里面可以有break和continue等關(guān)鍵字
}


/*
    判斷`條件`是否為真, 如果`真`, 則執(zhí)行`循環(huán)體`.執(zhí)行完`循環(huán)體`, 會(huì)再次判斷`條件`....
    并且在循環(huán)中也可以使用`break`和`continue`等關(guān)鍵字來控制循環(huán)的走向. 
*/
// 語(yǔ)法
do{
    循環(huán)體
} while(條件);

/*
    解讀:
        先執(zhí)行`循環(huán)體`, 然后判斷`條件`是否成立, 如果成立.在來一次. 
    注意, 由于do..while是先執(zhí)行的`循環(huán)體`. 所以, 不論條件如何, 至少執(zhí)行一次`循環(huán)體`
*/

例子

let a=10;
do{
    console.log(a);
    a++;
} while (a<=10)
// 語(yǔ)法: for的第一種語(yǔ)法
for(表達(dá)式1; 表達(dá)式2; 表達(dá)式3){
    循環(huán)體
}
表達(dá)式1
while 表達(dá)式2:
    循環(huán)體
    表達(dá)式3

/*
    解讀: 
        for循環(huán)和我們python中的循環(huán)是完全不一樣的. 解讀起來會(huì)有點(diǎn)兒麻煩. 
        首先, 在執(zhí)行的時(shí)候, 先執(zhí)行`表達(dá)式1`, 
        然后, 判斷`表達(dá)式2`得到的結(jié)果是否真, 如果`真`, 則執(zhí)行循環(huán)體, 
        再然后, 執(zhí)行`表達(dá)式3`, 
        再然后, 判斷`表達(dá)式2`執(zhí)行的結(jié)果是否為`真`, 如果`真`, 則執(zhí)行`循環(huán)體`
        再然后, 執(zhí)行`表達(dá)式3`
        .....
        直到, `表達(dá)式2`得到的結(jié)果是`假`, 則跳出循環(huán)
*/
// 看起來很繞. 我們用for循環(huán)來跑一個(gè)1~99
for(var i = 1; i < 100; i++){
    console.log(i);
}
/*
    首先, i = 1, 
    然后, 判斷 i < 100 成立
        打印i
    在然后, i++, i變成2
    再然后, 判斷 i < 100 還是成立
        打印i
    再然后, i++, i變成3
    再然后, 判斷 i< 100 還是成立
        打印3....
    ....
    當(dāng)i = 100了. i < 100不成立. 程序結(jié)束 
*/

// for循環(huán)的固定邏輯也就這樣了
for(變量聲明; 條件判斷; 改變變量){
    循環(huán)體
}

// for的第二種用法
var a = [11,22,33,44,55,66]
for(let i in a){
    console.log(i + "_" + a[i])
}
// 這種寫法非常類似python中的for循環(huán). 但是要注意. 這里的`i`拿到的僅僅是 `數(shù)組a`的索引信息. 
// 如果需要數(shù)據(jù) a[i]

四.JS中的數(shù)組和對(duì)象(重點(diǎn))

在JS中創(chuàng)建數(shù)組. 直接[ ]即可. 也可以用new Array(). 效果都是一樣的.
在JS中 new 出來的東西沿猜,數(shù)據(jù)類型都是object枚荣;在JS中 創(chuàng)建空對(duì)象的時(shí)候,可以不寫()

// 定義數(shù)字的兩個(gè)方法

let a1=['劉德華', '張學(xué)友', '黎明', '郭富城'];

console.log(a1, typeof a1);     // [ '劉德華', '張學(xué)友', '黎明', '郭富城' ] object

// 在JS中 new 出來的東西啼肩,數(shù)據(jù)類型都是object
let a2=new Array('劉德華', '張學(xué)友', '黎明', '郭富城');
console.log(a2, typeof a2);     // [ '劉德華', '張學(xué)友', '黎明', '郭富城' ] object

// 在JS中 創(chuàng)建空對(duì)象的時(shí)候橄妆,可以不寫()
let a3=new Array;
console.log(a3, typeof a3);     //[] object

數(shù)組的常用操作

arr.push(data); // 在數(shù)組后面添加數(shù)據(jù)

// 在JS中 創(chuàng)建空對(duì)象的時(shí)候,可以不寫()
let a3=new Array;
console.log(a3, typeof a3);     //[] object

a3.push('下雨天')
a3.push('無(wú)名火', '666')
console.log(a3 );    //[ '下雨天', '無(wú)名火', '666' ]

arr.length; // 數(shù)組長(zhǎng)度

let res=a3.length
console.log(res)

arr.pop(); // 刪除數(shù)據(jù), 從后面刪除, 并返回被刪除的內(nèi)容

let a3=[ '下雨天', '無(wú)名火', '666' ]
let del = a3.pop()
console.log(del)    //666
console.log(a3)    // [ '下雨天', '無(wú)名火' ]

arr.shift() // 刪除數(shù)據(jù), 從前面刪除, 并返回被刪除的內(nèi)容

let a=[ '下雨天', '無(wú)名火', '666' ]
let del = a.shift()
console.log(del)    // 下雨天
console.log(a)    // [ '無(wú)名火', '666' ]

arr.unshift(xxx); // 在數(shù)組之前增加數(shù)據(jù)

let b=[ '下雨天', '無(wú)名火', '666' ]
let add = b.unshift('劉德華', '張學(xué)友')     // 返回的是數(shù)組的長(zhǎng)度祈坠;也可以不用變量接收
console.log(add)    // 5害碾,返回的是數(shù)組的長(zhǎng)度
console.log(b)    // [ '劉德華', '張學(xué)友', '下雨天', '無(wú)名火', '666' ]

arr.flat(); // 扁平化處理數(shù)組

let arr=[1, 2, 3, [4, 5, 6]]
arr = arr.flat()
console.log(arr)

arr.slice(開始索引,結(jié)束索引);切片功能赦拘,取左不取右慌随;和python一樣

let arr=[0, 1, 2, 3, 4, 5, 6]
let res = arr.slice(1,3)
console.log(res)

arr.join("連接符"); // 使用連接符將arr中的每一項(xiàng)拼接起來. 和python中的 "".join()雷同

let name=['劉德華', '張學(xué)友', '黎明', '郭富城'];
let res = name.join('-')
console.log(res);    // 劉德華-張學(xué)友-黎明-郭富城

arr.forEach中的每一項(xiàng)循環(huán)出來. 分別去調(diào)用function函數(shù), 會(huì)自動(dòng)的將數(shù)據(jù)傳遞給函數(shù)的第一個(gè)參數(shù),第二個(gè)參數(shù)是數(shù)組的索引躺同,第三個(gè)參數(shù)就是數(shù)組本身arr

let arr=[11, 22, 33, 44, 55, 66]
arr.forEach(function fn(a,b,c){
    console.log(a, b, c, a+b);
})

在JS中創(chuàng)建一個(gè)字典(也屬于對(duì)象阁猜,object類)非常容易. 和python中的字典幾乎一樣,JS中的字典的key可以加引號(hào)蹋艺,也可以不加剃袍。

var p = {
    name: "劉德華",
    age: 18,
    wife: "朱麗倩",
    
    sin: function(){
        console.log("唱歌")
    }
};

重點(diǎn):
把對(duì)象變成json字符串: JSON.stringify()
把字符串變成對(duì)象: JSON.parse()

let p = {
    name: "劉德華",
    age: 18,
    wife: "朱麗倩",

    sin: function(){
        console.log("唱歌")
    }
};

console.log(typeof p, p)
// 把字典對(duì)象轉(zhuǎn)換成json字符串
let json_str=JSON.stringify(p)
console.log(typeof json_str, json_str)  // string {"name":"劉德華","age":18,"wife":"朱麗倩"}

// 把json字符串轉(zhuǎn)換成字典對(duì)象
let dic = JSON.parse(json_str)
console.log(typeof dic)     // object

(重點(diǎn))使用對(duì)象(數(shù)組、字典)的兩種方法:
方法1:對(duì)象.key
方法2:對(duì)象['key']

console.log(p.name, p['age'])
p.sin()

從上述內(nèi)容中幾乎可以看到. JS對(duì)象的使用幾乎是沒有門檻的. 十分靈活

for(var n in p){
    if(typeof(p[n]) != 'function'){
        console.log(p[n])
    }
}

五. JS中的函數(shù)(重點(diǎn))

// 函數(shù):標(biāo)準(zhǔn)函數(shù)捎谨,有函數(shù)名民效,有參數(shù)
function fn(a,b){
    return a+b;
}

let res1 = fn(3, 4)
console.log(res1)

// 函數(shù)名可以是特殊符號(hào)憔维,如 $、_
function $(){
    console.log('函數(shù)名稱是$')
}
// 調(diào)用函數(shù)
$()

function _(){
    console.log('函數(shù)名稱是_')
}
// 調(diào)用函數(shù)
_()

// 賦值畏邢,內(nèi)存地址復(fù)制业扒,函數(shù)運(yùn)行的時(shí)候不是依賴函數(shù)的名字,而是函數(shù)的地址
sdgjksfldfgkjdsfh = _
sdgjksfldfgkjdsfh()

擴(kuò)展一下
數(shù)組的元素是函數(shù)

let arr=[function (){
    console.log(123)}, function (){console.log(456)}, function (){console.log(789)}]

arr[0]()

// for循環(huán)運(yùn)行函數(shù)
for (let i=0;i<arr.length;i++){
    arr[i]()
}

JS中的函數(shù)可以沒有函數(shù)名棵红,也可以自運(yùn)行.
注意:JS中只要能夠形成 xxx() 并且xxx是一個(gè)函數(shù)的話就可以執(zhí)行凶赁。

自運(yùn)行函數(shù)
(function gn(){
    console.log('我要自己運(yùn)行');
})();

(function (){
    console.log('我是一個(gè)函數(shù)咧栗,我沒有函數(shù)名逆甜,我自己運(yùn)行')})()

帶參數(shù)

// 帶參數(shù)
(function (a, b){
    let sum=a+b;
    console.log('我是一個(gè)函數(shù),我沒有函數(shù)名致板,我自己運(yùn)行 結(jié)果是:', sum)})(3, 4)

自運(yùn)行函數(shù)帶返回值交煞,需要用變量接收

// 帶返回值的自運(yùn)行函數(shù)
let new_arg = (function (a, b){
    let sum=a+b;
    return sum
    })(3, 4)

console.log(new_arg)

自運(yùn)行函數(shù)使用window中參數(shù)值的兩種方法
window是HTML中的頂級(jí)作用域,作用于全局斟或,是所有作用域的根素征。window中的方法可以直接使用,也就是可以直接省略window萝挤。如

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>        // 方法1:
        (function () {
    window.name = '劉德華';
})();console.log(name);
        // 方法2:
        (function (a) {
    a.age = 18;
})(window)

console.log(window.age)
</script>
</head>
<body>

</body>
</html>

注意:JS文件的時(shí)候御毅,不可以直接使用window,因?yàn)閣indow只是HTML中的頂級(jí)作用域怜珍,直接運(yùn)行下面JS代碼會(huì)報(bào)錯(cuò)端蛆,提示 window 沒有定義。所以酥泛,在逆向扣代碼的時(shí)候今豆,要注意

(function () {
    window.name = '劉德華';
})()
console.log(name)

this的用法
字典對(duì)象可以使用this來調(diào)用對(duì)象本身的參數(shù)

let dic={
    name:'劉德華',
    age: 18,
    song: function (){
        console.log(this.name+'唱了一手歌')},
    today: function (){
        console.log('今天');
        this.song();
    }
}

JS中return多個(gè)值時(shí),前面的表達(dá)式也會(huì)執(zhí)行柔袁,但只返回最后一個(gè)

function fn(){
    let a=2;
    let b=3;
    return a++, a*b, a+b
}

console.log(fn())

執(zhí)行順序的時(shí)候呆躲,先執(zhí)行a++,再執(zhí)行a*b捶索,最后執(zhí)行并返回a+b的值

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末插掂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子腥例,更是在濱河造成了極大的恐慌辅甥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件院崇,死亡現(xiàn)場(chǎng)離奇詭異肆氓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)底瓣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門谢揪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕉陋,“玉大人,你說我怎么就攤上這事拨扶〉树蓿” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵患民,是天一觀的道長(zhǎng)缩举。 經(jīng)常有香客問我,道長(zhǎng)匹颤,這世上最難降的妖魔是什么仅孩? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮印蓖,結(jié)果婚禮上辽慕,老公的妹妹穿的比我還像新娘。我一直安慰自己赦肃,他們只是感情好溅蛉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著他宛,像睡著了一般船侧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厅各,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天镜撩,我揣著相機(jī)與錄音,去河邊找鬼讯检。 笑死琐鲁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的人灼。 我是一名探鬼主播围段,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼投放!你這毒婦竟也來了奈泪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤灸芳,失蹤者是張志新(化名)和其女友劉穎涝桅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烙样,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冯遂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谒获。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛤肌。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壁却,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出裸准,到底是詐尸還是另有隱情展东,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布炒俱,位于F島的核電站盐肃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏权悟。R本人自食惡果不足惜砸王,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望僵芹。 院中可真熱鬧处硬,春花似錦小槐、人聲如沸拇派。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)件豌。三九已至,卻和暖如春控嗜,著一層夾襖步出監(jiān)牢的瞬間茧彤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工疆栏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留曾掂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓壁顶,卻偏偏與公主長(zhǎng)得像珠洗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子若专,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容