ES6中常見語法規(guī)定和關鍵字
常見語法
1.定義函數(shù):不需要function也能定義一個函數(shù),更加簡便。
2.以前的js中通常用function和prototype模擬類,而新的語法可以創(chuàng)建一個類class。
3.let與const相關語法。
4.箭頭操作符=>簡化函數(shù)書寫,左邊為輸入?yún)?shù),右邊為操作及返回值。
5.允許使用`創(chuàng)建字符串,可以包含${num}這樣的變量。
6.ES6利用解構這一特性可使一個函數(shù)直接返回一個數(shù)組,值被自動解析到對應接收的變量中;還可以在定義函數(shù)的同時指定參數(shù)的默認值。
關鍵字
- let,const詳見下文
- set
一群值的集合,可變,能增刪元素(與數(shù)組區(qū)別:不會包含重復元素,重復不會產(chǎn)生效果)
經(jīng)典算法
斐波納契數(shù)列(兔子問題)
<code>function fn(n){
if(n==1|n==2) {return 1;}
else return fn(n-1)+fn(n-2);
}
var n=parseInt(promt("Please input a number"));
var f1=1,f2=1,f=0;
for(var i=2;i<=n;i++) {
f=f1+f2;
f1=f2;
f2=f;
console.log(f);
}</code>
排序
<pre>
選擇排序
var array = [2,5,8,3,6,9];
for(var j=0; j<array.length-1;j++){
var min=array[j];
var m=j;
for(var i=j+1; i<array.length;i++){
if(array[i]<min){
min=array[i];
m=i;
}
}
if(m!=j){
var t=array[m];
array[m]=array[j];
array[j]=temp;
}
}
冒泡排序
var array = [2,5,8,3,6,9];
for(var j=0; j<array.length-1;j++ ){
for(var i=0; i<array.length-j-1;i++){
if(array[i]>array[i+1])
{
var t=array[i];
array[i]=array[i+1];
array[i+1]=t;
}
}
document.write(array);
}//還應該考慮到數(shù)組本來就是升序或降序直接輸出的情況</pre>
還有素數(shù),完數(shù),數(shù)字逆置等算法(后續(xù)整理)
JavaScript中對數(shù)組的操作
1.定義
var Array=new Array() 括號內可填整數(shù)
var Array=new Array(" "," "," ") 用此形式對數(shù)組初始化
2.訪問
document.write(Array[0]) 可以訪問某個特定的元素
3.修改
Array[0]=" "; 向指定下表號添加一個新值
4.刪除
Array.pop(); 移除最后一個元素并返回該值
Array.shift(); 移除第一個元素并返回該值,數(shù)組元素自動前移
Array.splice(P,C)刪除從指定位置開始的指定數(shù)量的元素,返回移除的元素
5.添加
Array.push([item1[item2[item3[...]]]]);一個或多個元素添加到數(shù)組結尾,返回新長度
Array.unshift([item1[item2[item3[...]]]]);一個或多個元素添加到數(shù)組開頭,返回新長度,元素自動后移
Arrray.splice([item1[item2[item3[...]]]]);一個或多個元素插入到指定位置,其后元素自動后移,返回""
6.拷貝
Array.slice(0);返回數(shù)組的拷貝數(shù)組(新數(shù)組)
Array.concat();同上
7.排序
Array.reverse();反轉數(shù)組,返回數(shù)組地址
Array.sort();對數(shù)組排序,返回數(shù)組地址
8.字符串化
Array.join(s);返回字符串,將數(shù)組的每個元素值連接,用s隔開
var,let,const的區(qū)別及辨析
var
JavaScript中創(chuàng)建變量通常被稱為"聲明"變量,可以通過var語句來聲明js變量。
js變量可以用來存放數(shù)值,也可以用來保存文本值(賦予字符串),通過var語句實現(xiàn)。
let
let是ES6中新增的js命令,用法類似var。
const
const也是ES6中新增的命令,但用于聲明一個只讀的常量,聲明之后其值不能改變。
區(qū)別:
1.從用法上來說,var,let用于聲明變量,而const用于聲明一個只讀常量。
2.let所聲明的變量只在其所在的代碼塊里有效,
如for(let I=0;i<10;i++) { }或{ let a=0; }所以在塊外調用變量時會編譯器會報錯。let和var類似于c語言中的局部變量和全局變量。
3.var命令會發(fā)生"變量提升"現(xiàn)象,即變量可以在聲明前使用,值為undefined,與一般邏輯多少有些不和,而let命令所聲明的變量一定要在聲明后使用,否則報錯。
4.若在let聲明變量之前有var對同名變量的賦值等操作,編譯器就會報錯。let聲明變量的這一塊就稱為"暫時性死區(qū)"。
5.與var不同,let不允許在相同作用域內重復聲明同一個變量。
6.對于const,只聲明不賦值會報錯;const作用域與let相同;同樣不會"變量提升";不可重復聲明。(const實際上保證變量指向的內存地址不變動,不能完全控制所指向的數(shù)據(jù)結構)
JavaScript的原型繼承
(完全引用..)
說原型繼承之前還是要先說說原型和原型鏈,畢竟這是實現(xiàn)原型繼承的基礎。
在Javascript中,每個函數(shù)都有一個原型屬性prototype指向自身的原型,而由這個函數(shù)創(chuàng)建的對象也有一個proto屬性指向這個原型,而函數(shù)的原型是一個對象,所以這個對象也會有一個proto指向自己的原型,這樣逐層深入直到Object對象的原型,這樣就形成了原型鏈。下面這張圖很好的解釋了Javascript中的原型和原型鏈的關系。

原型繼承
基本模式
<code>var Parent = function(){
this.name = 'parent' ;
} ;
Parent.prototype.getName = function(){
return this.name ;
} ;
Parent.prototype.obj = {a : 1} ;
var Child = function(){
this.name = 'child' ;
} ;
Child.prototype = new Parent() ;
var parent = new Parent() ;
var child = new Child() ;
console.log(parent.getName()) ; //parent
console.log(child.getName()) ; //child</code>
原型繼承后繼內容 這部分沒看懂.....
JavaScript的this與Java中的this區(qū)別
js中的this
this是JavaScript的關鍵字,代表函數(shù)運行時,自動生成的一個內部對象,只能在函數(shù)內部使用。
<code>function test(){
this.x=1;
}</code> this的值會隨著函數(shù)使用場合不同變化,但總指向調用函數(shù)的那個對象。
- 函數(shù)全局性調用時,this就代表全局對象Global。
- 函數(shù)作為某個方法的對象調用時,this就指這個上級對象。
- 作為構造函數(shù)調用時,this就指這個生成的新對象
- apply()作為函數(shù)對象的一個方法,改變函數(shù)的調用對象,此時this就指的是改變后的這個對象。
java中的this
(查閱相關資料..并沒有理解)
java中用類名定義一個變量的時候,定義的只是一個引用,外面可以通過這個引用來訪問這個類里面的屬性和方法。類里面也有一個引用來訪問自己的屬性和方法——this對象
1.類內部當中對自己的一個引用,可以方便類中方法訪問自己的屬性;
2.可以返回對象的自己這個類的引用,同時還可以在一個構造函數(shù)當中調用另一個構造函數(shù)。
一些不好的特性
1.對全局變量的依賴性,隨代碼越來越多,程序越來越大,子程序中的變量名很有可能和全局變量名沖突。
2.沒有塊級作用域,只有函數(shù)作用域。
3.js里有許多不會使用但保留著的單詞,如class。
4.二進制浮點數(shù)不能正確處理十進制小數(shù),例0.1+0.2不等于0.3。
5.偽數(shù)組,js里的數(shù)組實際上是一個屬性名為整數(shù),具有l(wèi)ength屬性的對象。