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