? ? ? ?用js進行平時項目開發(fā)的時候會經(jīng)常面臨著一個問題鹦蠕,就是要對變量的作用域進行分析判斷,今天就來淺談一下自己如何來進行區(qū)分的看铆。
1.在js中這里指的是es3.0秽浇,沒有塊級作用域的概念,只存在函數(shù)作用域唁奢,即一個function里的變量為一個單獨的作用域瓢谢,記住要用var進行聲明,否則就會上升至全局變量驮瞧。其實這個還是比較好區(qū)分的,下面來給段代碼
var b=2; function a(){ var b =1; c(); console.log(b)}; ? function c (){console.log (b)} ?; ? ? ?a(); 輸出結(jié)果為2枯芬,1
因為在js中函數(shù)的函數(shù)聲明的那一刻起它的作用域就相應(yīng)的產(chǎn)生了论笔,這就是js里的詞法作用域,聲明的時候就確定了作用域的范圍千所,就像上面的代碼中c函數(shù)聲明時其產(chǎn)生的作用域是全局作用域狂魔,再a函數(shù)中調(diào)用c并不能改變c的作用域鏈,所以第一個輸出的為全局變量2,第二個就簡單了淫痰,先從a函數(shù)得作用域開始尋找b如果能找到就返回最楷,不能找到就去父級查找,此情景可以找到就輸出1
2.在前端頁面如果要去寫后臺進行數(shù)據(jù)操作的sql語句時,最好是把這些語句給拆解到后臺實現(xiàn)籽孙,因為這里涉及到安全問題烈评,sql不能寫select*from tablename 除了能造成性能問題外還存在一個安全問題,能過截獲這個來得知你的表結(jié)構(gòu)^_^
3關(guān)于js的作用域易錯點犯建,.js的賦值順序為自右向左
functionfoo() {
var a = b = 0;
//.. .按照js的賦值順序自右向左讲冠,首先b = 0,此時b為全局變量适瓦,然后將 var a = b 竿开;此時a為局部變量 a = 0;
//可以采用鏈式的聲明方式:即 var a ,b; a=b=0;此時a玻熙,b都為局部變量
}
4:之前在做angular開發(fā)一個項目的時候遇到了一個問題:客戶端請求到服務(wù)器然后服務(wù)器寫文件到客戶端實現(xiàn)文件的下載否彩,一開始我只是用了$http.get(url)去向后端發(fā)送一個請求,然后后端生成一個文件然后將該文件以流的形式寫入到瀏覽器嗦随,也許是第一次接觸該需求并不太了解客戶端需要進行什么操作列荔,反而把精力集中到后端的研究上(java 只是懂那么一點),花了我一整天的時間啊称杨,然后才發(fā)現(xiàn)是采用了ajax發(fā)送請求后肌毅,并沒有對返回的信息做任何處理,以至于沒有出現(xiàn)文件在瀏覽器上下載的效果姑原,最后有兩個個解決方案是:1:使用form表單提交的方式進行請求悬而,返回后的數(shù)據(jù)是由form表單根據(jù)表單結(jié)構(gòu)自動完成的并不需要用代碼來對數(shù)據(jù)進行處理,而ajax請求是需要用代碼來對返回的數(shù)據(jù)進行處理
2:仍然使用ajax的方式進行請求 不過需要對返回的數(shù)據(jù)進行處理 :$http({ method:"post",url:url,data:data,headers:{'Content-Type':'application/x-www-form-urlencoded'}}).success(function(){ console.log("success")})
}
5:當兩個span元素都設(shè)置為display:inline-block時會出現(xiàn)兩個元素水平方向沒有對齊锭汛,解決這個問題可以利用vertical-align:top 笨奠,把元素的頂端與行中最高元素的頂端對齊,不過這個屬性ie并不支持
6.當刪除數(shù)組的元素采用:users.splice(users.indexOf(user),1)進行操作就可以避免傳統(tǒng)刪除時由于數(shù)組長度變化而index仍加1而造成的刪除位置不對的錯誤
7.判斷一個變量是否為數(shù)組唤殴,對象般婆,function等類型????
Object.prototype.toString.call(param)=='[object Array]'
8.實現(xiàn)深copy的性能最快的方法
let obj 1 = json.parse(json.stringify(obj));
9.實現(xiàn)統(tǒng)計字符串的字節(jié)長度方法
function charAtLeng(str){
?var num = str.length;
?for(var i=0;i<str.length;i++){
? ? ?if(str[i].charCodeAt()>255){
? ? ? ? num++
? ? ?}
? }
?return num
}
10.使用哈希算法對數(shù)組進行去重
function temple(array){
? ? var newArray = [],object={};
? ? ?for(var i=0,lengths=array.length;i<lengths;i++){
? ? ? ? ? if(!object[array[i]]){
? ? ? ? ? ? ? object[array[i]] = 1;
? ? ? ? ? ? ? newArray.push(array[i])
? ? ? ? ? ?}
? ? ? }
? ? ?return newArray
}
11、?判斷一個字符串中出現(xiàn)次數(shù)最多的字符朵逝,統(tǒng)計這個次數(shù)
? var obj= {},index = 0,key='',count=0;
? function checkString(str){
? ? for(var i=0;i<str.length;i++){
? ? ? ? obj[str[i]]?obj[str[i]]++:obj[str[i]] = 1//如果存在就在原來的基礎(chǔ)上給value加1蔚袍,如果是第一次出現(xiàn)就賦值為1
? ? }
? ? for(var j in obj){
? ? ? ? if(obj[j]>count){
? ? ? ? ? ? count = obj[j]//如果值大就賦值給count
? ? ? ? ? ? key = j;
? ? ? ? }
? ? }
? ? ? return '出現(xiàn)頻率最高的為'+key+'其中出現(xiàn)的次數(shù)為'+count
? }
12、獲取數(shù)組或者字符串中的最大值或最小值
//最大值
Math.max.apply(null,array)//相當于直接調(diào)用Math.max() 方法配名,不過由于提供的方法不支持數(shù)組類型的參數(shù)啤咽,可以用這個方法進行規(guī)避
Math.max(string) 或Math.max.call(null,string)
//最小值
Math.min.apply(null,array)
Math.min(string) 或Math.min.call(null,string)
13.判斷瀏覽器內(nèi)核(看是否為chrome瀏覽器)
var ?ua = navigator.userAgent;
var isChrome = ua.indexOf('Chrome');
14.判斷一個值是否是數(shù)組? 使用Array.isArray(value)方法
15.Object.keys(obj).length//返回對象中有多少元素,可以用來判斷對象是否為空
16.const arr = [...new Set([0, 1, 1, null, null])]; 對數(shù)組進行去重,返回的arr為[0,1渠脉,null]