摘要:函數(shù)內(nèi)部重新聲明了一個(gè),值為,這兩個(gè)是不一樣的,互相不產(chǎn)生影響,因此最后輸出。方法實(shí)現(xiàn)繼承相同的簡(jiǎn)單使用用對(duì)象替換當(dāng)前對(duì)象,如果為空,則為全局對(duì)象。
前端學(xué)習(xí)的摘錄,持續(xù)更新中...1. 數(shù)組去重3種方案
① 使用set去重:set是ES6中提供的數(shù)據(jù)結(jié)構(gòu),不同于數(shù)組,所有的值都是不重復(fù)的,Set內(nèi)部使用===來(lái)判斷是否相等,類(lèi)似"1"和1會(huì)兩個(gè)都保存,NaN和NaN只會(huì)保存一個(gè)
let unique= [...new Set([1,"1",1,NaN,NaN,undefined,undefined,null,null])]; //[1, "1", NaN, undefined, null]
② 遍歷,將值添加到新數(shù)組,用indexOf()判斷值是否存在,已存在就不添加,達(dá)到去重效果。(對(duì)NaN去重失敗)
let a = [1,"1",1,NaN,NaN,undefined,undefined,null,null]; let unique = arr =>{ let newA = []; arr.forEach(key => { if(newA.indexOf(key)<0){ //遍歷newA是否存在key,如果存在key會(huì)大于0就跳過(guò)push的那一步 newA.push(key); } }); return newA; } unique(a); // ["1", 1, NaN, NaN, undefined, null]
③ 遍歷,將數(shù)組的值添加到一個(gè)對(duì)象的屬性名里,并給屬性賦值。對(duì)象不能添加相同屬性名,以這個(gè)為依據(jù)可以實(shí)現(xiàn)數(shù)組去重,然后用Object.keys(對(duì)象)返回這個(gè)對(duì)象可枚舉屬性組成的數(shù)組,這個(gè)數(shù)組就是去重后的數(shù)組。(返回的都是字符串,對(duì)于1和"1"都當(dāng)成"1")
let a = [1,"1",1,NaN,NaN,undefined,undefined,null,null]; let unique = arr => { var obj = {}; arr.forEach(value => { obj[value] = 0; // 隨便賦值,為了將屬性添加進(jìn)obj對(duì)象 }); return Object.keys(obj); } unique(a); // ["1", "NaN", "undefined", "null"]2. 深拷貝
深度遍歷屬性值拷貝
function deepcopy(obj) { var copyObj = Object.create(Object.getPrototypeOf(obj)); Object.getOwnPropertyNames(obj).forEach((keyName) => { if ( typeof obj[keyName] == "object") { copyObj[keyName] = deepcopy(obj[keyName]) } else { copyObj[keyName] = obj[keyName] } }); return copyObj; }
采用JSON.parse(JSON.stringify(obj)),有局限性
function deepcopy(obj){ return JSON.parse(JSON.stringify(obj)); }3. 函數(shù)length屬性
函數(shù)length屬性的含義: 該函數(shù)預(yù)期傳入的參數(shù)個(gè)數(shù)。指定了默認(rèn)值以后,length將返回沒(méi)有指定默認(rèn)值的參數(shù)個(gè)數(shù);指定了默認(rèn)值后,length屬性將失真。
(function (a) {}).length // 1 (function (a = 5) {}).length // 0 (function (a, b, c = 5) {}).length // 2
如果設(shè)置了默認(rèn)值的參數(shù)不是尾參數(shù),那么length屬性也不再計(jì)入后面的參數(shù)了。
(function (a = 0, b, c) {}).length // 0 (function (a, b = 1, c) {}).length // 14.參數(shù)作用域
如果參數(shù)默認(rèn)值是一個(gè)變量,則該變量所處的作用域,與其他變量的作用域規(guī)則是樣,即先是當(dāng)前函數(shù)的作用域,然后才是全局作用域。
var x = 1; function f(x, y = x) { console.log(y); } f(2) // 2
上面代碼中,參數(shù)y的默認(rèn)值等于x。調(diào)用時(shí),由于函數(shù)作用域內(nèi)部的變量x已經(jīng)生成,所以y等于參數(shù)x,而不是全局變量x;如果調(diào)用時(shí),函數(shù)作用域內(nèi)部的變量x沒(méi)有生成,結(jié)果則不同。
let x = 1; function f(y = x) { let x = 2; console.log(y); } f() // 1
上面代碼中,函數(shù)調(diào)用時(shí),y的默認(rèn)值變量x尚未在函數(shù)內(nèi)部生成,所以x指向全局變量。如果此時(shí),全局變量x不存在,就會(huì)報(bào)錯(cuò):ReferenceError: x is not defined
一個(gè)復(fù)雜的例子:
var x = 1; function foo(x, y = function() { x = 2; }) { var x = 3; y(); console.log(x); } foo() // 3
上面代碼中,函數(shù)foo的參數(shù)y的默認(rèn)值是一個(gè)匿名函數(shù)。函數(shù)foo調(diào)用時(shí),它的參數(shù)x的值為undefined,所以y函數(shù)內(nèi)部的x一開(kāi)始是undefined,后來(lái)被重新賦值2。函數(shù)foo內(nèi)部重新聲明了一個(gè)x,值為3,這兩個(gè)x是不一樣的,互相不產(chǎn)生影響,因此最后輸出3。
如果將var x = 3的var去除,兩個(gè)x就是一樣的,最后輸出的就是2。
5. call方法實(shí)現(xiàn)繼承(apply相同)call的簡(jiǎn)單使用:obj1.method.call(obj2,argument1,argument2,...), 用對(duì)象obj2替換當(dāng)前對(duì)象obj1,如果obj2為空,則為全局對(duì)象。簡(jiǎn)單使用:
function add(a, b) { return a+b; } function sub(a, b) { return a-b; } add.call(sub, 3, 1); // 4
繼承:
function Parent() { this.showMsg = function(msg) { return msg; } } function Child() { Parent.call(this); // this.super()意味 } const chi = new Child(); chi.showMsg("hello world"); // "hello world"
多重繼承:
function Parent1() { this.add = function(a, b) { return a + b; } } function Parent2() { this.sub = function(a, b) { return a - b; } } function Child() { Parent1.call(this); Parent2.call(this); }6. Javascript 詞法作用域
JavaScript是詞法作用域不是動(dòng)態(tài)作用域,詞法作用域是寫(xiě)代碼或說(shuō)定義時(shí)確定的,動(dòng)態(tài)作用域是在運(yùn)行時(shí)確定的,詞法作用域關(guān)注函數(shù)在何處申明,動(dòng)態(tài)作用域關(guān)注在何處調(diào)用。但是,JS中的this關(guān)注的也是函數(shù)的調(diào)用。
function foo() { console.log(a); // 2 } function bar () { var a = 3; foo(); } var a = 2; bar()
如果按照動(dòng)態(tài)作用域理論運(yùn)行結(jié)果是:3
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/97067.html
摘要:不聲明第三個(gè)變量的值交換我們都知道交換兩個(gè)變量值的常規(guī)做法,那就是聲明一個(gè)中間變量來(lái)暫存。但鮮有人去挑戰(zhàn)不聲明中間變量的情況,下面的代碼給出了這種實(shí)現(xiàn)。 前端已經(jīng)被玩兒壞了!像console.log()可以向控制臺(tái)輸出圖片等炫酷的玩意已經(jīng)不是什么新聞了,像用||操作符給變量賦默認(rèn)值也是人盡皆知的舊聞了,今天看到Quora上一個(gè)帖子,瞬間又GET了好多前端技能,一些屬于技巧,一些則是聞所...
摘要:對(duì)微信小程序進(jìn)行全局配置,決定頁(yè)面文件的路徑窗口表現(xiàn)設(shè)置網(wǎng)絡(luò)超時(shí)時(shí)間設(shè)置多等。 微信小程序知識(shí)總結(jié)及案例集錦 微信小程序的發(fā)展會(huì)和微信公眾號(hào)一樣,在某個(gè)時(shí)間點(diǎn)爆發(fā) 學(xué)習(xí)路徑 微信小程序最好的教程肯定是官方的文檔啦,點(diǎn)擊這里直達(dá) 微信官方文檔 認(rèn)真跟著文檔看一遍,相信有vue前端經(jīng)驗(yàn)的看下應(yīng)該就能上手了,然后安裝 微信小程序開(kāi)發(fā)者工具 新建一個(gè)quick start項(xiàng)目,了解代碼結(jié)構(gòu),...
摘要:作用標(biāo)準(zhǔn)模式與兼容模式各有什么區(qū)別聲明位于位于文檔中的第一行,處于標(biāo)簽之前。又稱(chēng)內(nèi)核及以上版本,等內(nèi)核及以上。存儲(chǔ)大小數(shù)據(jù)大小不能超過(guò)。可以防止惡意刷票論壇灌水有效防止對(duì)某一個(gè)特定注冊(cè)用戶(hù)用特定程序暴力方式進(jìn)行不斷的登陸嘗試。 HTMLDoctype作用?標(biāo)準(zhǔn)模式與兼容模式各有什么區(qū)別?(1)、聲明位于位于HT...
閱讀 1295·2021-10-08 10:04
閱讀 1922·2021-09-04 16:40
閱讀 2536·2019-08-30 13:21
閱讀 2280·2019-08-29 15:10
閱讀 2848·2019-08-29 12:35
閱讀 1189·2019-08-26 17:41
閱讀 3062·2019-08-26 17:03
閱讀 1136·2019-08-26 12:01