JavaScript 筆記02(js 循環(huán) / 函數(shù)參數(shù) / js 中復(fù)制值 / 檢測(cè)類型 / 數(shù)組常用 api )

JavaScript 筆記02

接筆記01

5.for / forEach / for-in / for-of

不多 bb,直接看代碼以蕴。

// 循環(huán)數(shù)組
let array = ['a', 'b', 'c'];
// 普通 for 循環(huán)
for (let index = 0; index < array.length; index++) {
    const element = array[index];
    console.log(element);
}
// forEach 循環(huán)
// 不能使用 break 語句中斷循環(huán)妇智,也不能使用 return 語句返回到外層函數(shù)
array.forEach(element => {
    console.log(element);
});
// for-in 循環(huán)
// 不推薦值戳,因?yàn)檫@里的 index 不是數(shù)字劫流,而是字符串庇楞,計(jì)算時(shí)用到很容易出錯(cuò)
// 遍歷出來后的順序也可能隨機(jī)
for(const index in array) { 
    console.log(typeof index);
    console.log(array[index]);
}
// for-of 循環(huán)
// 這是最簡(jiǎn)潔、最直接的遍歷數(shù)組元素的語法
// 這個(gè)方法避開了for-in循環(huán)的所有缺陷
// 與forEach()不同的是极祸,它可以正確響應(yīng)break、continue和return語句
for (const value of array) {
    console.log(value);
}

// 循環(huán)對(duì)象
let me = {
    name: 'ethan',
    sex: 'male',
    age: 24,
    hobby: 'skate'
};
// for-in 循環(huán)
for (const key in me) {
    // 先判斷是否含有該屬性
    if (me.hasOwnProperty(key)) {
        console.log(key+ ':' + me[key]);
    }
}
// for-of 循環(huán)怠晴,太麻煩遥金,還不如 for-in
for (const key of Object.keys(me)) {
    console.log(key+ ':' + me[key]);
}

但是 for-of 除了可以遍歷數(shù)組和對(duì)象,它還可以遍歷 string 字符串蒜田,以及 ES6 新增的 Map稿械、Set 集合。更詳細(xì)的可以參考這篇文章冲粤∶滥總結(jié)下,循環(huán)數(shù)組不需要 break 或者 return 推薦使用 forEach梯捕,需要的話使用 for-of厢呵,循環(huán)普通對(duì)象使用 for-in,剩下的都用 for-of傀顾,當(dāng)然最重要的還是了解他們的異同襟铭,在使用的時(shí)候靈活選擇。


6.關(guān)于函數(shù)參數(shù)

  1. js 中的函數(shù)不在乎參數(shù)的個(gè)數(shù)短曾,也不在乎參數(shù)的類型
  2. js 中的參數(shù)其實(shí)是一個(gè)數(shù)組

關(guān)于上述兩點(diǎn)寒砖,見如下代碼

function abc (a, b) {
    console.log(arguments[0]);
    console.log(arguments.length);
}

abc(1);   // 1 1
abc(1,2); // 1 2
abc();    // undefined 0

再看下我們把函數(shù)的參數(shù)去掉

function abc () {
    console.log(arguments[0]);
    console.log(arguments.length);
}

abc(1);   // 1 1
abc(1,2); // 1 2
abc();    // undefined 0

結(jié)果是相同的。

可以利用 arguments 這個(gè)特性來寫個(gè)不規(guī)定加數(shù)個(gè)數(shù)的加法

function add() {
    if(arguments.length === 0){
        return 0;
    } else {
        let total = 0;
        for(let i = 0; i < arguments.length; i++) {
            if (typeof arguments[i] === 'number') {
                total += arguments[i];
            }
        }
        return total;
    }
}

console.log(add(1, 3, 5.5, 7, 8, 'a', 10));

有一點(diǎn)需要注意嫉拐,arguments 實(shí)際上不是 array 的實(shí)例哩都,而是一個(gè) array 對(duì)象。

function abc() {
    console.log(arguments);
    console.log(typeof arguments);
}

abc();    // {}  object
abc(1);   // { '0': 1 }  object
abc(1,2); // { '0': 1, '1': 2 }  object

7.基本類型和引用類型復(fù)制值時(shí)的區(qū)別

這點(diǎn)主要是用來理解引用類型的指針

  • 復(fù)制基本類型的值時(shí)會(huì)在變量對(duì)象上創(chuàng)建一個(gè)新值婉徘,然后把這個(gè)新值復(fù)制到新變量分配的位置上漠嵌。
  • 復(fù)制引用類型的值時(shí)咐汞,復(fù)制的其實(shí)是一個(gè)指針,雖然指針不同献雅,但指針指向的是同一個(gè)對(duì)象碉考,所以當(dāng)其中一個(gè)引用類型改變了對(duì)象,另一個(gè)引用類型上的值也會(huì)變化挺身。
let num1 = 1;
let num2 = num1;
console.log(num2); // 1
num1 = 2;
console.log(num2); // 1 侯谁,由此可見,改變 num1 并不會(huì)影響 num2 的值
let person1 = {
  name: 'ethan'
};
let person2 = person1;
console.log(person2.name);  // ethan
person1.name = 'ethan1';
console.log(person2.name); // ethan1章钾,由此可見墙贱,改變 person1 會(huì)影響到 person2 的值,因?yàn)樗麄冎赶虻氖峭粋€(gè)對(duì)象贱傀。

8.檢測(cè)類型

關(guān)于 typeof 在筆記1的第4點(diǎn)中已經(jīng)寫明惨撇,但 typeof 主要是用來檢測(cè)基本數(shù)據(jù)類型,如果檢測(cè)的值是一個(gè)對(duì)象或者 null府寒,都會(huì)返回object魁衙,所以當(dāng)變量是引用類型的時(shí)候,最好使用 instanceof株搔,person instanceof RegExp剖淀,返回true/false。對(duì)于數(shù)組纤房,還可以使用Array.isArray()纵隔。


9.數(shù)組常用 API

方法 作用 返回值
push() 將任意數(shù)量的參數(shù)添加到數(shù)組末尾 修改后數(shù)組的長(zhǎng)度
pop() 從數(shù)組末尾移除最后一項(xiàng) 移除的項(xiàng)
shift() 移除數(shù)組的第一項(xiàng) 移除的項(xiàng)
unshift() 將任意數(shù)量的參數(shù)添加到數(shù)字前端 修改后數(shù)組的長(zhǎng)度
reverse() 反轉(zhuǎn)數(shù)組項(xiàng)的順序 反轉(zhuǎn)后的數(shù)組
sort() 排序,默認(rèn)的基本不用炮姨,需要重寫 排序后的數(shù)組
concat() 基于當(dāng)前數(shù)組創(chuàng)建一個(gè)新數(shù)組 新數(shù)組
splice() 刪除:array.splice(0,2); 2個(gè)參數(shù)分別是要?jiǎng)h除的第一項(xiàng)和要?jiǎng)h除的項(xiàng)數(shù) 從原數(shù)組中刪除的項(xiàng)組成的數(shù)組
插入:array.splice(2,0,"red","green");從第二項(xiàng)起刪除0項(xiàng)捌刮,并插入 red 和 green。 從原數(shù)組中刪除的項(xiàng)組成的數(shù)組
替換:array.splice(2,1,"red","green");參考上一條舒岸,很容易看懂 從原數(shù)組中刪除的項(xiàng)組成的數(shù)組
indexOf() / lastIndexOf() 從數(shù)組開頭/末尾開始查找位于第 n 位的項(xiàng) 查找的項(xiàng)
every() 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù) 如果每一項(xiàng)都返回 true绅作,則返回 true
filter() 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù) 返回該數(shù)組中所有返回 true 的項(xiàng)組成的新數(shù)組
forEach() 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù) 無返回值,該方法主要用來遍歷數(shù)組
map() 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù) 每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組
some() 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù) 只要有一項(xiàng)返回 true吁津,則返回 true
reduce() /reduceRight() 歸并方法棚蓄,看下面的例子吧 看例子

重寫 sort 方法

function compare (value1, value2) {
  if(value1 < value2) {
    return -1;
  } else if (value1 > value2) {
    return 1;
  } else {
    return 0;
  }
}

let values = [14,2,53,3,6,1];
values.sort(compare);
console.log(values);  // [ 1, 2, 3, 6, 14, 53 ]

迭代方法

let num = [1,2,3,4,5,4,3,2,1];

// every()
let everyResult = num.every((item, index, array) => {
  return (item > 2);
});
console.log(everyResult); // false

// filter()
let filterResult = num.filter((item, index, array) => {
  return (item > 2)
})
console.log(filterResult); // [ 3, 4, 5, 4, 3 ]

// forEach()
num.forEach(element => {
  console.log(element);  // 1  2  3  4  5  4  3  2  1
});

// map()
let mapResult = num.map((item, index, array) => {
  return (item*2);
})
console.log(mapResult);  // [ 2, 4, 6, 8, 10, 8, 6, 4, 2 ]

// some()
let someResult = num.some((item, index, array) => {
  return (item > 2);
})
console.log(someResult);  // ture

reduce()

let num = [1,2,3,4,5];
let sum = num.reduce((prev, cur, index, array) => {
  return prev+cur;
})
console.log(sum);  // 15

10.關(guān)于 callee(嚴(yán)格模式下會(huì)報(bào)錯(cuò))

函數(shù)內(nèi)部有兩個(gè)特殊的對(duì)象:arguments 和 this。callee 就是 arguments 的一個(gè)屬性碍脏。

首先看下非常經(jīng)典的階乘函數(shù)梭依。

function factorial(num) {
  if (num <= 1) {
    return 1;
  } else {
    return num * factorial(num-1);
  }
}

console.log(factorial(5)); // 120

但這樣有個(gè)問題,函數(shù)的執(zhí)行和函數(shù)名factorial緊緊耦合在一起了典尾,為了解決這個(gè)問題役拴,我們就可以使用arguments.callee

function factorial(num) {
  if (num <= 1) {
    return 1;
  } else {
    return num * arguments.callee(num-1);
  }
}

console.log(factorial(5)); // 120

這樣钾埂,即使改了函數(shù)名也不會(huì)有任何影響河闰。注意與 caller 區(qū)分科平。


11.函數(shù)的 apply()、call() 和 bind()方法

  1. apply():接受兩個(gè)參數(shù):一個(gè)是在其中運(yùn)行函數(shù)的作用域姜性,另一個(gè)是參數(shù)數(shù)組瞪慧。
function sum (num1, num2) {
  return num1 + num2;
}

function applySum1 (num1,num2,num3) {
  return sum.apply(this, [num1, num3]);
}

function applySum2 (num1,num2,num3) {
  return sum.apply(this, arguments);
}

console.log(applySum1(10,20,30)); // 40
console.log(applySum2(10,20,30)); // 30
  1. call():作用和apply()相同,不同的是第二個(gè)參數(shù)部念,不能以數(shù)組的形式弃酌,必須一個(gè)個(gè)列出來。
function sum (num1, num2) {
  return num1 + num2;
}

function callSum1 (num1,num2,num3) {
  return sum.call(this, num1, num3);
}

console.log(callSum1(10,20,30)); // 40

作用apply()call()最大的作用是能擴(kuò)充函數(shù)賴以運(yùn)行的作用域儡炼,如下:

window.color = 'red';
let o = {
  color: 'green'
};
function printColor () {
  return this.color;
}

console.log(printColor.call(window)); // red
console.log(printColor.call(this));   // red
console.log(printColor.call(o));      // green
  1. 這個(gè)方法會(huì)創(chuàng)建一個(gè)函數(shù)的實(shí)例妓湘,其 this 值會(huì)被綁定到傳給 bind()函數(shù)的值,如下:
let color = 'red';
let o = {
  color: 'green'
};
function printColor () {
  console.log(this.color);
}

let objectPrintColor = printColor.bind(o);
objectPrintColor(); // green

12.具體位數(shù)的小數(shù)處理

自己工作中剛好遇到乌询,要求是四舍五入取小數(shù)點(diǎn)后一位榜贴。我是這樣寫的:

s = Math.round(s * 10) / 10 + 'km';

今天一看書中有現(xiàn)成的方法toFix()

let s = 3.1415;
s1 = Math.round(s * 10) / 10;
console.log(s1);         // 3.1
console.log(typeof s1);  // number

s2 = s.toFixed(1);
console.log(s2);         // 3.1
console.log(typeof s2);  // string

似乎更簡(jiǎn)單,但數(shù)據(jù)類型已經(jīng)改變了妹田。所以書中也建議不要去實(shí)例化 Number 類型唬党。當(dāng)然,你看我工作中使用的場(chǎng)景鬼佣,其實(shí)使用toFix()也不影響初嘹。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市沮趣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坷随,老刑警劉巖房铭,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異温眉,居然都是意外死亡缸匪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門类溢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凌蔬,“玉大人,你說我怎么就攤上這事闯冷∩靶模” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蛇耀,是天一觀的道長(zhǎng)辩诞。 經(jīng)常有香客問我,道長(zhǎng)纺涤,這世上最難降的妖魔是什么译暂? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任抠忘,我火速辦了婚禮,結(jié)果婚禮上外永,老公的妹妹穿的比我還像新娘崎脉。我一直安慰自己,他們只是感情好伯顶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布囚灼。 她就那樣靜靜地躺著,像睡著了一般砾淌。 火紅的嫁衣襯著肌膚如雪啦撮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天汪厨,我揣著相機(jī)與錄音赃春,去河邊找鬼。 笑死劫乱,一個(gè)胖子當(dāng)著我的面吹牛织中,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衷戈,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狭吼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了殖妇?” 一聲冷哼從身側(cè)響起刁笙,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谦趣,沒想到半個(gè)月后疲吸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡前鹅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年摘悴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舰绘。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蹂喻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捂寿,到底是詐尸還是另有隱情口四,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布者蠕,位于F島的核電站窃祝,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜粪小,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一大磺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧探膊,春花似錦杠愧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至腌闯,卻和暖如春绳瘟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背姿骏。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工糖声, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人分瘦。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓蘸泻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嘲玫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悦施,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,149評(píng)論 0 13
  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡(jiǎn)單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,128評(píng)論 0 21
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,237評(píng)論 0 4
  • ??引用類型的值(對(duì)象)是引用類型的一個(gè)實(shí)例。 ??在 ECMAscript 中土陪,引用類型是一種數(shù)據(jù)結(jié)構(gòu)沐绒,用于將數(shù)...
    霜天曉閱讀 1,058評(píng)論 0 1
  • “他們都跑了,你也跟著跑啊旺坠。”李毓臨瞟了一眼慕容沖扮超,“現(xiàn)在不走取刃,以后可沒機(jī)會(huì)了〕鏊ⅲ” “跑什么璧疗?左庶子是掌侍從的,”...
    朝笙浮塔閱讀 354評(píng)論 0 0