摘要:雖然現(xiàn)在還需要借助的力量但未來一定是屬于。將類引入了,大大簡化了原先復(fù)雜的工作從前要實(shí)現(xiàn)繼承得多麻煩工廠模式無法解決對象識(shí)別,構(gòu)造函數(shù)模式內(nèi)存浪費(fèi),原型模式私有方法還要結(jié)合構(gòu)造模式定義實(shí)例實(shí)現(xiàn)類的繼承,我要用到繼承類可以重寫父類的方法
雖然現(xiàn)在還需要借助babel的力量但未來一定是屬于ES6。(那ES7?-_-|||)
let在ES6之前javascript只有兩種作用域,即全局作用域和函數(shù)作用域,let的出現(xiàn)彌補(bǔ)JS了沒有塊作用域的痛點(diǎn)
let的塊作用域function cat(){ let mew = "喵" let angry = true console.log(mew) if(angry){ let mew = "..." //外層{}成為塊作用域 console.log(mew) } console.log(mew) } cat() //喵 //... //喵
讓我們和var做一下對比
function cat(){ var mew = "喵" var angry = true console.log(mew) if(angry){ var mew = "..." //外層 mew 被覆蓋 console.log(mew) } console.log(mew) } cat() //喵 //... //...
而let由于產(chǎn)生了塊作用域似的mew = "..." 只在塊作用域內(nèi)被使用,所以第三次輸出mew是"喵"
如上由于var不產(chǎn)生塊作用域所以if語句中的var mew = "..."相當(dāng)于覆蓋了函數(shù)中第一個(gè)mew(即函數(shù)作用域中的)所以在次輸出mew是"..."
應(yīng)用上述例子中,通過let的使用可以避免變量被不必要地覆蓋
讓我們再看一個(gè)栗子:
var a = [] for (var i = 0; i < 5; i++) { a[i] = function () { console.log(i) } } a[3]() // 5
為了輸出3,通常會(huì)使用閉包來處理
var a = [] for (var i = 0; i < 5; i++) { a[i] = (function(i){ var j = i return function () { console.log(j) } })(i) } a[3]() //3
這不僅使代碼變得冗長了不少,而且的外層可以訪問到i(說明i在使用完并未被清除,內(nèi)存泄漏)
使用let聲明只在塊級(jí)作用域內(nèi)有效
var a = [] for (let i = 0; i < 5; i++) { a[i] = function () { console.log(i) } } a[3]() // 3一些需要注意的點(diǎn) 暫時(shí)性死區(qū)
在var 聲明前使用變量,會(huì)得到undefined
console.log(abc) //undefined var abc
但在let 聲明前使用變量,會(huì)報(bào)錯(cuò)
console.log(abc) //錯(cuò)誤 var abc
這是由于在let的作用域中,let申明之前會(huì)形成暫時(shí)性死區(qū),在變量定義之前,使該變量都是不可用的。
重復(fù)聲明在塊級(jí)作用域中重復(fù)聲明會(huì)報(bào)錯(cuò)
{ var color = "black" let color = "white" } // 報(bào)錯(cuò) { let color = "black" var color = "white" } // 報(bào)錯(cuò) { let color = "black" let color = "white" } // 報(bào)錯(cuò)箭頭函數(shù)
箭頭函數(shù)的使用可以使書寫更為簡練
計(jì)算數(shù)組各項(xiàng)平方let ary = [1,2,3,5] let res = ary.map(function(item){return item*item}) //[1, 4, 9, 25]
使用箭頭函數(shù)可以簡化書寫
let ary = [1,2,3,5] let res = ary.map((item) => {return item*item}) //[1, 4, 9, 25]
更進(jìn)一步可以省略括號(hào)(多個(gè)參數(shù)不能省略括號(hào))
let ary = [1,2,3,5] let res = ary.map(item => {return item*item}) //[1, 4, 9, 25]
函數(shù)可以進(jìn)一步簡化成:
let ary = [1,2,3,5] let res = ary.map(item => item * item ) //[1, 4, 9, 25]模板字符串
模版字符串是對字符串拼接的改進(jìn),以往輸出帶有變量的語句時(shí),我們采用字符串拼接的方式,而模板字符串可以在字符串中直接使用變量,即簡化書寫同時(shí)也降低出錯(cuò)的風(fēng)險(xiǎn)
let name = "Yoda" console.log("My name is " + name) // console.log(`My name is ${name}`) //模板字符串
模板字符串使用反引號(hào) ( ) 來代替普通字符串中的用雙引號(hào)和單引號(hào);
模板字符串使用包含特定語法(${expression})的占位符;
模板字符串可以不需換行符直接使用換行:
let name = "Yoda" console.log(`My name is ${name} what‘s your name`) // My name is Yoda // what‘s your name
可以直接顯示計(jì)算結(jié)果
let a = 1 let b = 2 console.log(`${a} + $ = ${ a + b }) // 1 + 2 = 3延展操作符
let cuboid = [2,3,4] let cuboidVolume = (a,b,c) => {console.log(a*b*c)} cuboidVolume(cuboid[0], cuboid[1], cuboid[2]) //24 //延展操作符 cuboidVolume(...cuboid) // 24
延展操作符可以將數(shù)組拆分傳作為參數(shù)入函數(shù)
延展操作符可以用于數(shù)組拼接:
let fruit = ["orange","apple","banana"] let meat = ["beef"] let breakfast = [...fruit, ...meat , "bread"] // ["orange", "apple", "banana", "beef", "bread"]Classes(類)與繼承
總所周知,js的原型鏈繼承向來以難以理解外加坑多著稱
(構(gòu)造函數(shù),原型對象,實(shí)例對象它們之間剪不斷理還亂的關(guān)系,如果再加上繼承,prototype和[[prototype]]的指向@_@說多了都是淚啊)
由于JS中沒有類的概念,許多初學(xué)者都掉坑原型鏈之中。
ES6將類引入了,大大簡化了原先復(fù)雜的工作(從前要實(shí)現(xiàn)繼承得多麻煩:工廠模式無法解決對象識(shí)別,構(gòu)造函數(shù)模式內(nèi)存浪費(fèi),原型模式私有方法還要結(jié)合構(gòu)造模式...)
定義
class Person { constructor(name,age){ this.name = name this.age = age } say(){ console.log(`Hello my name is ${this.name}`) } } //person 實(shí)例 let person = new Person("Yoda",2000) person.name //"Yoda" person.say() //Hello my name is Yoda
實(shí)現(xiàn)類的繼承,我要用到extend:
class Programmer extends Person{ constructor(name,age, language){ super(name,age) this.language = language } } let javaProgrammer = new Programmer("Jack",22,"java") javaProgrammer.language //"java"
繼承類可以重寫父類的方法:
class Programmer extends Person{ constructor(name,age, language){ super(name,age) this.language = language } say(){ console.log(`I am a programmer using ${this.language}`) } } let javaProgrammer = new Programmer("Jack",22,"java") javaProgrammer.say() //I am a programmer using java
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/80101.html
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。異步編程入門的全稱是前端經(jīng)典面試題從輸入到頁面加載發(fā)生了什么這是一篇開發(fā)的科普類文章,涉及到優(yōu)化等多個(gè)方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結(jié)思考,循序漸進(jìn)的理解 TypeScript。 網(wǎng)絡(luò)基礎(chǔ)知識(shí)之 HTTP 協(xié)議 詳細(xì)介紹 HTT...
摘要:前端日報(bào)精選大前端公共知識(shí)梳理這些知識(shí)你都掌握了嗎以及在項(xiàng)目中的實(shí)踐深入貫徹閉包思想,全面理解閉包形成過程重溫核心概念和基本用法前端學(xué)習(xí)筆記自定義元素教程阮一峰的網(wǎng)絡(luò)日志中文譯回調(diào)是什么鬼掘金譯年,一個(gè)開發(fā)者的好習(xí)慣知乎專 2017-06-23 前端日報(bào) 精選 大前端公共知識(shí)梳理:這些知識(shí)你都掌握了嗎?Immutable.js 以及在 react+redux 項(xiàng)目中的實(shí)踐深入貫徹閉包思...
摘要:謝謝大大指出的關(guān)于中用的不到位的錯(cuò)誤,貼上大大推薦的文章中的菜鳥和高階錯(cuò)誤,文章很詳細(xì)說明了一些使用中的錯(cuò)誤和指導(dǎo)。另外更正內(nèi)容在后面補(bǔ)充。從開始說到異步流程控制,之前用的比較多的是的。 showImg(https://segmentfault.com/img/remote/1460000006771934); 謝謝n?i?g?h?t?i?r?e?大大指出的關(guān)于Promise中catc...
摘要:同源策略同源策略是一種約定,由公司年引入瀏覽器,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到等攻擊。 一、Vue變化檢測 背景 初始化對象,屬性未知;某些事件觸發(fā)時(shí),對象改變(新增屬性),Vue監(jiān)聽不到 原因 Vue.js 不能檢測到對象屬性的添加或刪除,因?yàn)閂ue.js 在初始化實(shí)例時(shí)將屬性轉(zhuǎn)為 getter/setter,所以屬性必須在 dat...
摘要:如果我們能把不同路由對應(yīng)的組件分割成不同的代碼塊,只在路由被訪問的時(shí)候才加載對應(yīng)的組件,這樣就更加高效了。這樣會(huì)大大提高首屏顯示的速度,但是可能其他的頁面的速度就會(huì)降下來。 一、 代碼分割,讓頁面按需加載,加快首屏速率 vue.js構(gòu)建單頁應(yīng)用雖然能通過路由來實(shí)現(xiàn)多頁面效果,但是實(shí)際上打包后所有的代碼都只有一個(gè)入口文件app.bundle.js,當(dāng)項(xiàng)目變得十分龐大的時(shí)候,app.bun...
閱讀 2390·2021-11-11 16:54
閱讀 2647·2021-09-26 09:47
閱讀 3994·2021-09-08 09:36
閱讀 2744·2021-07-25 21:37
閱讀 936·2019-08-30 15:54
閱讀 2551·2019-08-30 14:22
閱讀 3260·2019-08-30 13:57
閱讀 2613·2019-08-29 17:17