一 概述
JavaScript數組同後端語言同樣,具備它本身的數據結構,歸根結底,這種數據結構,本質就是一種集合。
在後端語言中(如java,.net等),數組是這樣定義的:數組是用來存儲相同數據類型的集合。這個定義,「相同數據類型」6個字限制了數據只能存儲相同的數據類型,如int[]數組只能存儲數字,而不能存儲字符串,以下定義方式,是錯誤的,由於string
不屬於整型
int[] arr = { 10, 20,"string" };
然而,在JavaScript中,數組的定義倒是很是寬鬆的,這也決定了其能存儲一切數據的特色。JavaScript數組具備以下特色
特色1:存儲相同基本數據類型的數據;
特色2:存儲不一樣基本數據類型的數據;
特色3:存儲對象
這三個特色,咱們可歸結爲一句話:JavaScript存儲一切對象,而不像後端語言那樣,只能存儲相同數據類型。除此以外,JavaScript數組還提供了不少豐富的操做方法。以下爲經常使用的操做方法。
本篇文章將主要結合代碼來論述JavaScript數組。
二 對數組的基本操做
(一)建立數組
第一種方式:構造函數方式
//第一種建立數組的方式:構造函數方式
var colors = new Array();//未知數組長度
//var colors = new Array(4);//已知數組長度
//var colors = new Array('green', 'yellow', 'white', 'red');//建立數組同時,給數組賦值
//var colors = Array();//在建立時,能夠省略new關鍵字
第二種方式:字面量方式
//第二種建立數組方式:使用數組字面量
var colors = ['green', 'yellow', 'white', 'red'];
var name = [];//建立空數組
(二)訪問數組
訪問數組,經過數組的下標來訪問
//建立數組
var colors = ['green', 'yellow', 'white', 'red'];
//輸出索引值
for (var i = 0; i < colors.length; i++) {
alert(colors[i]);//green,yellow,white,red
}
提示:for...in...訪問數組屬性(索引),而不是數組屬性值
//建立數組
var colors = ['green', 'yellow', 'white', 'red'];
//輸出數組索引
for (var propAttr in colors) {
alert(propAttr);//0,1,2,3
}
(三)爲數組添加元素
第一種方式:棧方式(後進先出,從數組尾部加入數據)
//建立數組
var colors = ['green', 'yellow', 'white', 'red'];
//第一種方式:棧方式
colors.push("orange");
for (var i = 0; i < colors.length; i++) {
alert(colors[i]);//green,yellow,white,red,orange
}
第二種方式:隊列方式(先進先出,從數組頭部加入數據)
var colors = ['green', 'yellow', 'white', 'red'];
colors.unshift('orange');
for (var i = 0; i < colors.length; i++) {
alert(colors[i]);//orange,green,yellow,white,red
}
(四)移除數組元素
第一種方式:棧方式(後進先出,從數組尾部移除數據)
//建立數組
var colors = ['green', 'yellow', 'white', 'red'];
//從尾部彈出數據
colors.pop();
for (var i = 0; i < colors.length; i++) {
alert(colors[i]);//green,yellow,white
}
第二種方式:隊列方式(先進先出,從數據頭部移除數據)
//建立數組
var colors = ['green', 'yellow', 'white', 'red'];
//從頭部移除數據
colors.shift();
for (var i = 0; i < colors.length; i++) {
alert(colors[i]);//yellow,white,red
}
第三種方式:length方式(藉助length屬性可訪問性來操做)
//建立數組
var colors = ['green', 'yellow', 'white', 'red'];
//從尾部移除數據,與pop()同樣
colors.length = 3;
for (var i = 0; i < colors.length; i++) {
alert(colors[i]);//green,yellow,white
}
三 數組方法
(一)檢測方法
數組檢測方式,可經過typeof,instranceof和Array.isArray()來檢測。
(二)轉換方法
全部對象都具備toLocaleString(),toString()和valueOf()三個方法,數組也如此。
1.toString()
toString()將數據的每一個屬性值轉化爲對應的字符串,而後再輸出轉換後的字符串值。
var colors = ['red','green','yellow'];
alert(colors.toString());//red,green,yellow
而下列代碼與如上代碼是同樣的,由於alert()接收的是字符串,因此會在後臺調用toString()方法
var colors = ['red','green','yellow'];
alert(colors);//red,green,yellow
2.valueOf()
valueOf()方法同toString()方法同樣,也是返回數組的字符串
var colors = ['red', 'green', 'yellow'];
alert(colors.valueOf());//red,green,yellow
3.toLocaleString()
toLocaleString()返回數組的字符串形式。
var colors = ['red', 'green', 'yellow'];
alert(colors.toLocaleString());//red,green,yellow
4 三者之間關係
關係1:當不顯示指出調用哪一個方法時(toString(),toLocaleString()和valueOf()),默認調用每一個屬性的toString();
關係2:當顯示地指出調用哪一個方法時,就調用每一個屬性的該方法;
關係3:關於valueOf問題,暫留
var person1 = {
toString: function () {
return "Alan";
},
toLocaleString: function () {
return "Alan_beijing";
},
valueOf: function () {
return "valueOf1";
}
};
var person2 = {
toString: function () {
return "Alan1";
},
toLocaleString: function () {
return "Alan_beijing1";
}
}
var people = [person1, person2];
alert(people.toString());//Alan,Alan1
alert(people.toLocaleString());//Alan_beijing,Alan_beijing1
alert(people.valueOf());//Alan,Alan1
alert(people);//Alan,Alan1
(三)棧方法
棧是一種數據結構,其算法爲:LIFO(Last input First out)後進先出,其兩個核心方法爲push()和pop();
1.push()
push()表示將數據壓入棧中,且放在棧的最後位置,即從棧的尾部壓入數據。對於數組,則在數組的尾部加入數據,操做的順序爲:先把數組length+1,再壓入數據。
var arr = [10, 20, 30];
arr.push('新加入的數據');
alert(arr.toString());//10,20,30,新加入的數據
2.pop()
push()表示將數據從棧中彈出,且從棧的最後位置彈出。對於數組,則在數組的尾部彈出數據,操做的順序爲:先彈出數據,再數組length-1
var arr = [10, 20, 30];
arr.pop();
alert(arr.toString());//10,20
(四)隊列
隊列是一種數據結構,其算法爲:FIFO(First input First out)後進先出,其兩個核心方法爲unshift()()和shift();
1.unshift()
unshift()表示從隊列頭部加入數據。對於數組,則從數組索引最小位置加入數據,操做順序爲:先將數length+1,再將當前數組屬性值日後移動1個位置,最後將新數據添加到索引0處。
var arr = [10, 20, 30];
arr.unshift(40);
alert(arr.toString());//40,10,20,30
2.shift()
shift()表示從隊列頭部移除數據。對於數組,則從數組索引最小位置移除數據。
var arr = [20, 30];
arr.shift();
alert(arr.toString());//30
(五)排序方法
在js數組中,兩個重要的重排序方法:reverse()和sort()
1.reverse()
reverse(),顧名思義,逆序方法。
var arr = [1,2,3,4,5];
alert(arr.reverse());//5,4,3,2,1
2.sort()
sort()是比較靈活的排序方法了,支持自定義排序規則,默認排序爲升序
默認爲升序
var arr = [3, 1, 2, 5, 4];
alert(arr.sort());//1,2,3,4,5
自定義排序規則
var arr = [3, 1, 2, 5, 4];
alert(arr.sort(Compare));//1,2,3,4,5
//自定義排序規則:正序
function Compare(value1, value2) {
if (value1 > value2) {
return 1;
} else if (value1 < value2) {
return -1;
} else {
return 0;
}
}
(六)位置方法
js數組提供了兩個位置方法:indexof()和lastIndexOf()
indexOf()表示首次知足條件的位置;而lastIndexOf()則表示最後知足條件的位置
var arr = [20, 30,20,40,10];
alert(arr.indexOf(20)); //0
alert(arr.lastIndexOf(20));//2
(七)迭代方法
ECMAScript5提供了5個迭代方法:every(),filter(),forEach(),map()和some()
這個五個方法,均接收2個參數。
1.every()
對數組中的每項運行給定函數,若是該函數對每一項都返回ture,則返回true,不然返回false.
//every
var num = [1, 2, 3, 4, 5, 4, 3, 2, 1];
var everyResult = num.every(function (item, index,array) {
return item>2
});
alert(everyResult);//fasle
2.some
對數組中的每項運行給定函數,若是該函數對任意一項返回ture,則返回true,不然返回false
//some
var num = [1, 2, 3, 4, 5, 4, 3, 2, 1];
var someResult = num.some(function (item, index, array) {
return item > 2;
});
alert(someResult);//true
3.filter
對數組中的每項運行給定函數,返回該函數會返回true的項組成的數組
//filter
var num = [1, 2, 3, 4, 5, 4, 3, 2, 1];
var filterResult = num.filter(function (item, index, array) {
return item > 2;
});
alert(filterResult);//3,4,5,4,3
4.map
對數組中的每項運行給定函數,返回每次函數調用的結果組成的數組
//map
var num = [1, 2, 3, 4, 5, 4, 3, 2, 1];
var mapResult = num.map(function (item, index, array) {
return item * 2;
});
alert(mapResult);//2,4,6,8,10,8,6,4,2
5.forEach
對數組中的每項運行給定函數。注意,該方法沒返回值
//forEach
num.forEach(function (item, index, array) {
//執行想要執行的操做
});
(八)求和方法
ECMAScript提供了2個縮減方法:reduce()和reduceRight()
reduce和reduceRight,至關於.net的斐波拉列數列,計算算法爲:f(n)=f(n-1)+f(n-2);
1.reduce
reduce計算數組時,按照從左到右的順序
var values = [1, 2, 3, 4, 5];
var sum = values.reduce(function (prev, cur, index, array) {
return prev + cur;
});
alert(sum);//15
2.reduceRight
reduceTight計算數組時,從右到左順序
var values = [1, 2, 3, 4, 5];
var sum1 = values.reduceRight(function (prev, cur, index, array) {
return prev + cur;
});
alert(sum1);//15
(九)其餘方法
ECMAScript爲數組操做提供了不少方法,如concat()和slice()
1.concat()
concat()方法是將兩個對象合併,從而生成新對象,合併同時,不會改變原來對象的值,只是作簡單的拷貝
var color1 = ['red', 'green', 'yellow'];
var color2 = ['white', 'blue'];
//添加數組
var concatColor = color1.concat(color2);
alert(concatColor);//red,green,yellow,white,blue
//添加單個值
var concatSingelColor = color1.concat('orange');
alert(concatSingelColor);//red,green,yellow,orange
//不添加值,只是簡單copy
var concatColor1 = color1.concat();
alert(concatColor1);//red,green,yellow
2.slice
slice()方法用於從目標數據中截取新數據,不會改變被截取對象的值。
var color1 = ['red', 'green', 'yellow'];
//不傳遞參數:表示截取整個數組
var color2 = color1.slice();
alert(color2);//red,green,yellow
//傳遞一個參數:表示從該位置處開始截取數據,直到數組最後一個數
var color3 = color1.slice(1);
alert(color3);//green,yellow
//傳遞2個參數:第一個參數表示從該位置開始截取,第二個參數減1表示所截數據的最後位置
var color4 = color1.slice(1, color1.length);
alert(color4);//green,yellow
在編程語言中,不管是面向過程的C,兼備面過程和對象的c++,仍是面向對象的編程語言,如java,.net,php等,函數均扮演着重要的角色。固然,在面向對象編程語言JavaScript中(嚴格來講,JS屬於弱面向對象編程語言),函數(function)更扮演着極其重要的角色和佔有極其重要的地位。在本篇文章中,不論述什麼是JS,JS解決什麼問題等之類問題,而是重點闡述JS中的函數(function)。
一 JavaScript函數
(一)何爲函數
關於函數的定義,咱們先從兩個角度來思考:數學角度和編程語言角度。
1.數學角度:在數學領域,關於「函數」二字,再熟悉不過,如三角函數,反三角函數,冪函數,對數函數,指數函數,微積分函數等;
2.編程角度:在編程領域,你們最熟悉且最早接觸的應該是"Main函數"了,除此外,如日期函數(Date),數學函數(Math)等,固然除了內置函數外,還包括用戶自定義函數;
綜合1,2點,能夠將函數定義以下:
函數是解決某類問題的集合,是某類問題的高度抽象,它具備必定的通用性和複用性。
(二)定義函數
在Javascript中,存在三種經典的函數定義方式:函數聲明式,函數表達式和函數構造式
1.函數聲明式
1 //定義兩個數相加函數
2 function AddNum(num1, num2) {
3 return num1 + num2;
4 }
注意:函數聲明式,不能用匿名函數,以下方式定義錯誤的
1 function (num1, num2) {
2 return num1 + num2;
3 }
2.函數表達式
1 //定義兩個數相加函數
2 var AddFun=function AddNum(num1, num2) {
3 return num1 + num2;
4 }
注意:函數表達式通常用匿名函數,由於調用時,不用函數名,所以,如上調用也可寫成以下:
1 var AddFun = function(num1, num2) {
2 return num1 + num2;
3 }
3.函數構造式
1 var sum = new Function('num1', 'num2', 'return num1 + num2')
2 console.log(sum(10,20));//30
(三)函數調用
在JavaScript中,函數的調用採用「函數名(參數)」的格式來進行調用。
須要注意的是,JavaScript函數調用與後端語言函數調用(如java,.net等)存在細微差異,即JavaScript沒有函數重載,參數的參數個數,由實參決定,而不是由形參決定。
1.聲明式調用
調用方式一:通常調用
1 //定義兩個數相加函數
2 function AddNum(num1, num2) {
3 return num1 + num2;
4 }
5
6
7 console.log(Add(10,20));//30
調用方式二:自調用
1 (function AddNum(num1, num2) {
2 console.log(num1 + num2);
3 })(10,20);//30
注意:自調用通常用匿名函數,由於在調用時,不須要函數名,所以,也可寫成以下方式:
1 (function (num1, num2) {
2 return num1 + num2;
3 })(10, 20);//30
2.表達式調用
1 //定義兩個數相加函數
2 var AddFun = function (num1, num2){
3 return num1 + num2;
4 }
5
6 console.log(AddFun(10, 20));//30
二 函數變量
在JavaScript編程語言中,變量的定義是經過var關鍵字來定義的(若變量不經過var定義,則爲全局變量,但不推薦這麼作),與其餘編程語言同樣,變量也分爲兩大類,即局部變量和全局變量。
(1)局部變量:做用域爲其所在的函數;
(2)全局變量:做用域爲整個過程;
(3)變量做用域:JS中的變量做用域是經過this指針,從當前的做用域開始,從當前做用域由內向外查找,直到找到位置,這裏分爲幾個邏輯:
a.從當前做用域由內向外查找,若找到,就中止查找,不然,繼續查找,直到查到window全局做用域爲止;
b.當內部做用域變量名與外部做用域變量名相同時,內部做用域的覆蓋外部做用域。
咱們來看一個例子:
1 var dateTime='2018-09-16';
2 function GetUserInfo(){
3 var age=120;
4 var name="Alan_beijing";
5 function Say(){
6 var name="老王";
7 var address="shanghai";
8 console.log(address+"-"+name+"-"+age+"-"+dateTime);//shanghai-老王-2018-06-05
9 }
10 return Say();
11 }
12
13
14 GetUserInfo();//shanghai-老王-120-2018-09-16
來分析一下變量及其做用域:
如上圖,有4個做用域,當函數執行以下語句時,發生以下過程:
1 console.log(address+"-"+name+"-"+age+"-"+dateTime);
a.js當前this環境做用域爲4做用域;
b.this指針尋找變量:addresss,name,age,dateTime,從當前做用域向外做用域逐層尋找,直到尋找到變量爲止,若尋找到最外層做用域任然沒找到,則會出錯,提示該變量未聲明;
c.當內外層變量相同時,內層變量覆蓋外層變量,如4做用域的name覆蓋3做用域的name;
三 函數聲明式定義存在的問題
在js中,存在聲明提早問題,看看以下例子。
1 var globleName="Alan_beijing";
2 function Say(){
3 console.log(localName); // undefined,不報錯,是由於變量聲明提早
4 var localName="Alan";
5 console.log(localName);// Alan
6 }
看過如上代碼,你可能會問,函數執行到console.log(localName); 時,應該報錯,由於localName未定義。
若是在後端語言,如java,.net中,可能會報錯,可是在js中,卻不會,不報錯的緣由是:在js中存在聲明提早。
如上代碼至關於以下代碼:
1 var globleName="Alan_beijing";
2 function Say(){
3 var localName;
4 console.log(localName);
5 localName="Alan";
6 console.log(localName);
7 }
四 函數幾大關鍵點
1.匿名函數
匿名函數,顧名思義,就是沒名字的的函數,咱們來看看以下兩個例子:
函數表達式
1 //定義兩個數相加函數
2 var AddFun=function (num1, num2) {
3 return num1 + num2;
4 }
當即執行函數
(function AddNum(num1, num2) {
console.log(num1 + num2);
})(10,20);//30
從如上,不難看出,匿名函數主要用域函數表達式和當即執行函數。
2.閉包
閉包的根源在於變量的做用域問題。
咱們先來考慮這樣一個問題,假設在面向對象編程語言中,某個方法的變量被定義爲私有變量,其餘函數要獲取訪問該變量,.net怎麼處理?
方法一:構造函數
方法二:單例模式
一樣地,在js中,一樣存在外部函數調用內部函數變量問題,js運用的技術就叫作閉包。
所謂閉包,就是將不可訪問的變量做爲函數返回值的形式返回來,從而實現函數外部訪問函數內部變量目的。
1 //閉包
2 function GetName() {
3 var name = "Alan_beijing";
4 var age = function () {
5 var age = 30;
6 return age;
7 }
8 return name + age;
9 }
3.js多態問題(重載問題)
在面向對象編程語言,如.net中,實現多態的方式大體有以下:
a.接口
b.抽象類
c.虛方法
d.方法重載
然而,在js中,沒有面向對象之說(OO),那麼js是如何實現多態的呢?根據方法實際傳遞的參數來決定。
1 //重載
2 function SetUserInfo(userName, age, address, tel, sex) {
3 console.log(arguments.length);//4
4 }
5
6 SetUserInfo('Alan_beijing',44,'china-shanghai','xxxx');
從如上能夠看出,傳遞多少個參數,就接收多個參數,若是在現象對象編程語言中實現該功能,至少須要寫一堆代碼,這也是體現js強大之一。
4.遞歸
來看看一個遞歸階乘函數
1 //遞歸
2 function factorial(num) {
3 if (num < 1) {
4 return 1;
5 } else {
6 return num * arguments.callee(num-1);
7 }
8 }
若是是.net,咱們通常會這樣寫
1 //遞歸
2 function factorial(num) {
3 if (num < 1) {
4 return 1;
5 } else {
6 return num * factorial(num-1);
7 }
8 }
然而,這樣寫,卻會存在異常狀況
1 var factorial1 = factorial;
2 factorial = null;//將factorial變量設置爲null
3 console.log(factorial1(4));//出錯
5.原型和原型鏈
面向對象編程語言的顯著特徵之一是面向對象,然而,在js中,沒有對象,那麼js是如何面向對象的功能的呢(封裝,繼承,多態)?固然是經過原型和原型鏈來實現的。
這是我第一次發表博客。之前常常到博客園查找相關技術和代碼,今天在寫一段小程序時出現了問題,
但在網上沒能找到理想的解決方法。故註冊了博客園,想與新手分享(由於本人也不是什麼高手)。
vb.net和C#操做Oracle數據庫已經用了N多年了。因爲是作工程自動化項目的,業主只對軟件的功能和
界面是否友好來斷定成果的好壞。因此一直都是採用直接OracleCommand.ExecuteNonQuery(sqlString,conn)
的方式很直白的Insert、update和delete數據庫表的。因爲工程項目並無很高的實時性,因此......
最近手頭沒太多事情,就在博客園逛逛。看到了ODP.NET,發現了本身有點落伍了,因而照貓畫虎的練練。
在Insert時順風順水的,但Update時出現了「ORA-01722: 無效數字」。各類找問題,網上查資料無果。
測試表只有兩個字段,varchar2和number。問題代碼以下:
using Oracle.ManagedDataAccess.Client;
private void UpdateTable()
{
int valueStart = (int)NudStartValue.Value;
int valueCount = (int)NudValueCount.Value;
int returnValue = 0;
int[] columnValue = new int[valueCount];
string[] columnStr = new string[valueCount];
string sql = string.Empty;
OracleParameter[] parameters = new OracleParameter[]
{
new OracleParameter(":sname", OracleDbType.Varchar2),
new OracleParameter(":svalue",OracleDbType.Int32)
};
parameters[0].Direction = ParameterDirection.Input;
parameters[1].Direction = ParameterDirection.Input;
for ( int i = 0 ; i < valueCount ; i++ )
{
columnStr[i] = "No:" + ( i + valueStart ).ToString();
columnValue[i] = i + valueStart + 100;
}
parameters[0].Value = columnStr;
parameters[1].Value = columnValue;
sql = "update DIST_TEST set SVALUE=:svalue where SNAME=:sname";
returnValue = db.RunUpdateSQL(sql, parameters, valueCount);
MessageBox.Show(returnValue.ToString());
}
public int RunUpdateSQL(string sqlStr,OracleParameter[] parameters,int paraCount)
{
int returnValue = 0;
try
{
Open();
OracleCommand cmd = new OracleCommand()
{
Connection = Conn,
ArrayBindCount=paraCount,
CommandText=sqlStr,
CommandTimeout=240
};
cmd.Parameters.AddRange(parameters);
returnValue=cmd.ExecuteNonQuery();
cmd.Dispose();
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
return returnValue;
}
解決方法:將parameters的元素按sqlStr的順序更改一下OK了。
private void UpdateTable()
{
int valueStart = (int)NudStartValue.Value;
int valueCount = (int)NudValueCount.Value;
int returnValue = 0;
int[] columnValue = new int[valueCount];
string[] columnStr = new string[valueCount];
string sql = string.Empty;
OracleParameter[] parameters = new OracleParameter[]
{
new OracleParameter(":svalue",OracleDbType.Int32),
new OracleParameter(":sname", OracleDbType.Varchar2)
};
parameters[0].Direction = ParameterDirection.Input;
parameters[1].Direction = ParameterDirection.Input;
for ( int i = 0 ; i < valueCount ; i++ )
{
columnStr[i] = "No:" + ( i + valueStart ).ToString();
columnValue[i] = i + valueStart + 100;
}
parameters[0].Value = columnValue;
parameters[1].Value = columnStr;
sql = "update DIST_TEST set SVALUE=:svalue where SNAME=:sname";
returnValue = db.RunUpdateSQL(sql, parameters, valueCount);
MessageBox.Show(returnValue.ToString());
}
注意上面的代碼,第一個出現的是:svalue,第二個出現的是:sname。OracleParameter[]按這個順序添加就OK了。
其實如今問題是解決了,但還沒能理解,:sname和:svalue是對應的parameter.value的,爲什麼必定要按照update語句中
變量的順序呢。但願高手提示一下,多謝!
但願能幫到遇到一樣問題的童鞋們。
生成解決方案 F6,生成項目Shift+F6
調試執行F5,終止調試執行Shift+F5
執行調試Ctrl+F5
查找下一個F3,查找上一個Shift+F3
附加到進程Ctrl+Alt+P,逐過程F10,逐語句執行F11
切換斷點F9(添加或取消斷點)
運行至光標處Ctrl+F10
跳出當前方法Shift+F11
新建解決方案:Ctrl+Shift+N
打開解決方案:Ctrl+Shift+O
保存文件Ctrl+S,保存全部文件Ctrl+Shift+S
查看解決方案窗口Ctrl+W,Ctrl+S
查看屬性窗口Ctrl+W,Ctrl+P
錯誤列表顯示Ctrl+W,Ctrl+E
輸出列表顯示Ctrl+W,Ctrl+O
書籤窗口Ctrl+W,B
切換書籤Ctrl+B,T
切換到下一個書籤Ctrl+B,N
切換到上一個書籤Ctrl+B,P
清除書籤Ctrl+B,C
活動窗口切換Ctrl+Tab
瀏覽器窗口Ctrl+W,W
斷點窗口Ctrl+D,B
即便窗口Ctrl+D,I
工具箱Ctrl+W,Ctrl+X
全屏切換Shift+Alt+Enter,向後導航Ctrl+-,向前導航Ctrl+Shift+-
項目中添加類Shift+Alt+C
項目中添加新項Ctrl+Shift+A
項目中添加現有項Shift+Alt+A
查找Ctrl+F,在文件中查找Ctrl+Shift+F
漸進式搜索Ctrl+I,反式漸進式搜索Ctrl+Shift+I
替換Ctrl+H,在文件中替換Ctrl+Shift+H
轉到行號Ctrl+G
剪切板循環Ctrl+Shift+V 注:在剪貼板中能夠循環保存20項,您能夠任意的調用你剪切過的內容,只要不斷的按Ctrl+Shift+V鍵直到找到須要的那一項
遊標移動一個單詞 Ctrl+左右箭頭
滾動代碼屏幕,但不移動光標位置Ctrl+上下箭頭
刪除當前行Ctrl+Shift+L
隱藏或展開當前嵌套的摺疊狀態 Ctrl+M,M
全部隱藏或展開嵌套Ctrl+M,L
摺疊到定義Ctrl+M,O
切換顯示空白Ctrl+E,S
選擇矩形文本Shift+Alt+方向鍵
全變爲大寫:Ctrl+Shift+U 全變爲小寫Ctrl+U
強制智能感知 Ctrl+J
查看方法參數信息Ctrl+Shift+空格
查看當前代碼快速信息Ctrl+K,I
註釋選中行Ctrl+K,C或Ctrl+E,C
取消註釋行Ctrl+K,U或者Ctrl+E,U
插入代碼段Ctrl+K,X
插入外側代碼段Ctrl+K,S
轉到定義F12
生成方法存根,光標定位在調用的方法上,按Shift+Alt+F10
顯示查看實現接口方法,光標定位在類要實現的接口上,按Shift+Alt+F10
查看全部引用,Ctrl+K,R
查看調用層次Ctrl+K,T
除上述這些經常使用的快捷鍵外,若是開發人員想查看系統快捷或擴展本身的快捷鍵,能夠打開vs-【工具】-【選項】
在窗口中選中【環境】-【鍵盤】
搜索想要添加的快捷鍵功能。
出處:http://www.cnblogs.com/xuwendong/