亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

重走JAVA編程路,還是熟悉的那個入門道路-js(javascript)最接近前后端的語言回顧

2019-11-06 07:40:04
字體:
來源:轉載
供稿:網友

JS學習小結:

學習javaScript腳本語言,首先我們要知道Javascript是什么?

Javascript是什么,簡稱Js,Js是一種基于對象(Object)和事件驅動(Event Driven)并具有安全性能的腳本語言,使用它的目的是與HTML超文本標記語言、Java 腳本語言(Java小程序)一起實現在一個Web頁面中鏈接多個對象,與Web客戶交互作用。從而可以開發客戶端的應用程序等。

當前什么越來越強調溝通,而Js是最接近前后端的語言,越來越多的前后端框架的支持,使他的前途很明朗,作為一種解釋型語言,Js強調實時,在線。

 

先看下Js的特性:腳本編寫語言,基于對象的語言,簡單性,安全性,動態性和跨平臺特性。

Js的命名規范:有兩種常用的命名規則

  匈牙利命名法的原則:變量名=屬性+類型+對象描述。他的關鍵是:以一個或多個小寫字母作為前綴,前綴之后是一個或多個首字母大寫的單詞組合,該單詞指明變量的用途。

駝峰命名法的原則:第一個單詞以小寫字母開始,之后每一個單詞的首字母大寫。例如:myFirstName、myLastName,這樣的變量名看上去就像駝峰一樣此起彼伏,因此得名。駝峰法的關鍵是:除第一個單詞外,其他單詞首字母大小,混合使用大小寫字母來構成變量名和函數名,還可以使用下劃線來形成邏輯斷點,這樣更能增強代碼的可讀性。

JS的注釋規范:

JS中單行注釋用“ // 注釋內容” 標識,多行注釋使用“  /* 注釋內容 */  “標識。注釋的作用是提高代碼的可讀性,不僅自己以后用著方便,也有助于別人閱讀和理解你所編寫的JS代碼,注釋中的內容不會在網頁中顯示。為了方便閱讀,注釋一般放在需要解釋的語句結尾處或者周圍。

在JavaScript中四種基本的數據類型:數值(整數和實數)、字符串型(用“”號或‘’括起來的字符或數值)、布爾型(使True或False表示)和空值。在JavaScript的基本類型中的數據可以是常量,也可以變量。由于JavaScript采用弱類型的形式,因而一個數據的變量或常量不必首先作聲明,而是在使用或賦值時確定其數據的類型的。當然也可以先聲明該數據的類型,它是通過在賦值時自動說明其數據類型的。

Js還有一種拓展類型,那就是:Undefined 數據類型

一個為 undefined 的值就是指在變量被創建后,但未給該變量賦值以前所具有的值。

--------------------------------------------------------------------------------------------------------------------

 

 

下面是一下常用語法:

1.對象定義方式

 

空對象:沒有任何屬性和方法

var obj = {};

定義對象的屬性:

obj.xx = "123";

定義對象的方法:

obj.function = function(){};

--------------------------------------------------------------------------------------------------------------------

 

2.函數的定義方式:

 

JavaScript函數定義Function 函數名 (參數,變元){函數體;.Return 表達式;}說明: 當調用函數時,所用變量或字面量均可作為變元傳遞?!『瘮涤申P鍵字Function定義?!『瘮得憾x自己函數的名字?!当?,是傳遞給函數使用或操作的值,其值可以是常量 ,變量或其它表達式。 通過指定函數名(實參)來調用一個函數?!”仨毷褂肦eturn將值返回?!『瘮得麑Υ笮懯敲舾械?。

函數中的形式參數:  在函數的定義中,我們看到函數名后有參數表,這些參數變量可能是一個或幾個。那么怎樣才能確定參數變量的個數呢?在JavaScript中可通過arguments .Length來檢查參數的個數。例:Function function_Name(exp1,exp2,exp3,exp4)Number =function _Name . arguments .length;if (Number>1)document.wrile(exp2);if (Number>2)document.write(exp3);if(Number>3)document.write(exp4);...

 

--------------------------------------------------------------------------------------------------------------------

 

 

3  對象的引用傳遞

 

var person={name:'anker',age:100};

var x = person;

x.age = 19;

console.log(x.age);//19

console.log(person.age);//19

說明js中對象的賦值也是采用引用的方式,同時指向同一個對象。

 

function changebj(obj)  {obj.age = 10};

changebj(person);

 

console.log(person.age);

 

10//打印結果也是10,說明函數傳遞的也是對象的引用。修改的是同一個對象。

 

person.sex = '男';//若該屬性不存在則添加,若存在則覆蓋。

 

訪問對象的方式:

 

obj.name

obj["name"]或者obj['name']//必須采用雙引號或者單引號括起來

 

--------------------------------------------------------------------------------------------------------------------

4.匿名函數

(function(){//代碼 })();  //可立即執行的匿名函數

 

解釋:,包圍函數(function(){})的第一對括號向腳本返回未命名的函數,隨后一對空括號立即執行返回的未命名函數,括號內為匿名函數的參數。  

例子:(function(arg){ alert(arg+100); })(20); 

這個例子返回120。

 

匿名函數,就是沒有引用直接加上()進行執行的函數。

 

 

var addFunc = function(a,b){

 cosole.log(a+b);

};

--調用方式

addFunc(1,2);

 

 

--匿名函數

(function(a,b){console.log(a+b)})(1,2);

 

上面兩個函數的產生的結果是一樣的.只不過addFunc為函數對象的引用,而匿名函數不存在引用.

 

--來看個復雜的利用匿名函數的例子

 

var add = (function(){

var sum = 0 ;

return function(){

for(var i=0;l=arguments.length,i<l;i++){

sum+=arguments[i];

}

return  sum;

};

})(); --加上括號為匿名函數的寫法,可以理解為直接執行了此函數,函數的執行結果返回

 

add(1,2,3,4);

add(2);

--等價于

var func1 = function(){

var sum = 0 ;

return function(){

for(var i=0;l=arguments.length,i<l;i++){

sum+=arguments[i];

}

return  sum;

};

};

var add = func1();

add(1,2,3,4);

add(2);

 

 

//現在有一個場景,需要設計一個函數,前面每次調用,不會真正去計算,而是把參數保存下來,等到需要計算的再一起計算

 

var currying = function(fn){

var args = [] ;

return function(){

if(arguments.length === 0){

return fn.apply(this,args);

}else {

Array.PRototype.push.apply(args,arguments);

return arguments.callee;

}

};

}

var add = (function(){

var sum = 0 ;

return function(){

for(var i=0;l=arguments.length,i<l;i++){

sum+=arguments[i];

}

return  sum;

};

})();

 

var add  = currying(add);

add(1);

add(2);

add(3);

 

add();

---------------------------------------------------------------------------------------------------------------------

5.閉包

可以理解成一個函數內的內部函數,它被創建在一個函數內部,引用這其外部函數的變量值。

 

 

var a = function(){

  var x = 1;

  return function(y){

console.log(x+=y);//外部函數的x值就被包裹在引用對象中

  }

}

 

var b = a();//實際上是返回function(y){...}的引用

b();//執行上面的引用,此時的x值變成了private的屬性

閉包的兩個作用:

1.可以讀取函數體所在外部函數的局部變量

2.就是讓這些變量的值始終保持在內存中

 

------------------------------------------------------------------------------------------------------------------------

6.constructor

 

constructor 屬性返回對創建此對象的數組函數的引用。

var test=new Array();

 

if (test.constructor==Array)//判斷test的構造函數是否是Array

{

document.write("This is an Array");

}

 

 

var createPerson = function(name,sex,age){

 this.name = name;

 this.sex = sex;

 this.age = age;

};

//undefined

 

var p1 = new createPerson('z1',19,'男');

//undefined

p1.constructor

//輸出

function (name,sex,age){

 this.name = name;

 this.sex = sex;

 this.age = age;

}

p1.constructor == createPerson

//輸出:true

 

createPerson.constructor

//Function() { [native code] } //createPerson構造函數為Function,從一個側面說明function也是對象

 

 

------------------------------------------------------------------------------------------------------------------------

7.js ==與 ===的區別

 

一個等號是賦值操作,==先轉換類型再比較,進行值的對比。

而===先判斷類型,如果不是同一類型直接為false,只有類型和值全部都相等,才相等。

------------------------------------------------------------------------------------------------------------------------

8.JS中一切皆對象

JS中基本數據類型,也存在著對象封裝,比如下面數字123的構造函數是Number,test的構造函數是String,包含length的屬性

(123).constructor

//輸出:function Number() { [native code] }

 

'test'.constructor

//輸出:String() { [native code] }

'test'.length;

//輸出:4

 

//擴展Number的函數

Number.prototype.toString = function(){

alert('hi,I/'m a number ');

};

(123).toString();

//輸出:hi,I/'m a number 

Number.prototype

Number {toString: null, [[PrimitiveValue]]: 0}

------------------------------------------------------------------------------------------------------------------------

9.prototype原型

 

每個對象都連接到一個原型對象,并且可以從中繼承屬性。所有通過{}或者構造函數創建的對象都連接到Object{}

對象通過(對象名稱.__proto__)可以查看原型

或者通過(對象名稱.constructor.prototype)查看原型

 

 

var createPerson = function(name,sex,age){

 this.name = name;

 this.sex = sex;

 this.age = age;

};

 

var p1 = new createPerson('z1',19,'男');

 

p1.constructor

//輸出:

fucntion(name,sex,age){

 this.name = name;

 this.sex = sex;

 this.age = age;

}

p1.constructor.prototype

//輸出:

Object {}

createPerson.prototype

//輸出:

Object {}

 

p1.constructor.prototype === createPerson.prototype

true

 

 

 

var p2 = {sex:'男'};

 

p2.constructor.prototype

//輸出:Object {}

 

 

/*

在javascript中,創建一個新對象時,可以選擇某個對象作為它的原型,比如

*/

 

var person = {name:'z3',age:18,sex:'男'};

Object.create = function(o){

var F = function(){};

F.prototype = o ;

return new F();

};

 

var anotherPerson = Object.create(person);

anotherPerson.name;//z3

//對原型對象進行更新,發現已創建的對象值也隨著變化

person.name = 'z4';

"z4"

anotherPerson.name

//輸出:"z4"

 

//但當對象增加相同的屬性后,原型對象的屬性變化,不影響對象的屬性值。因為對象讀取值首先讀取本身對象的值,后讀取原型的值

anotherPerson.name = 'z5';

 

person.name = 'z6';

//輸出:"z6"

anotherPerson.name

//輸出:"z5"

 

delete anotherPerson.name 

//輸出:true

anotherPerson.name//輸出對象本身的屬性值,原型對象的屬性值不會被刪除,除非通過delete 原型對象.屬性輸出.

//輸出:"z6"

 

delete person.name

//輸出:true

anotherPerson.name

//輸出:undefined

 

//原型連接什么時候起作用呢?只有在檢索值的時候才被用到

//如果嘗試者去獲取對象的某個屬性值,但該對象沒有此屬性名,那么JAVASCRIPT會嘗試著從原型對象中獲取屬性值。

//如果原型對象也沒有該屬性值則再從它的原型找,直到該過程最后達到終點Object.prototype。Object

//如果想要的屬性完全不存在于原型鏈中,那么結果就是undefined。

 

person.age = 18;

anotherPerson.age//顯示什么?

 

//原型關系是一種動態的關系。如果添加一個新的屬性到原型中,該屬性會立即對所有基于該原型創建的對象可見。

 

anotherPerson.__proto__===person;//true

__proto__顯示對象的原型鏈

 

 

 

//可以使用hasOwnProperty方法來判斷對像是否含有某個屬性,如果對象擁有獨有的屬性,則返回true

//這個方法不會去檢查原型鏈

 

------------------------------------------------------------------------------------------------------------------

10. arguments

 

arguments 對象是函數內部的本地變量;arguments 已經不再是函數的屬性了。

你可以在函數內部通過使用 arguments 對象來獲取函數的所有參數。這個對象為傳遞給函數的每個參數建立一個條目,

條目的索引號從 0 開始。例如,如果一個函數有三個參數,你可以通過以下方式獲取參數:

 

arguments[0]

arguments[1]

arguments[2]

 

參數也可以被重新賦值:

arguments[1] = 'new value';

 

 

arguments 對象并不是一個真正的Array。它類似于數組,但沒有數組所特有的屬性和方法,除了 length。

例如,它沒有 pop 方法。不過可以將其轉換成數組

------------------------------------------------------------------------------------------------------------------------

11.利用JS特性實現AOP

AOP就是面向切面編程,主要作用是把一些核心業務邏輯模塊無關的功能抽離出來,這些跟業務邏輯無關的功能

 通常包括日志統計,安全控制,異常處理等。把這些功能抽離出來后,又通過動態織入的方式滲入到業務邏輯模塊中

 

  在JAVA中,可以通過反射和動態代理機制來實現AOP。但對于javascript這種動態語言,AOP的實現更加簡單

  

  在javascript中實現AOP,都是指把一個函數動態織入到另外一個函數中。我們可以通過擴展Function.prototype來做到這一點

*/

 

Function.prototype.before = function(beforefn){

 var that = this ;

 return function(){

 beforefn.apply(this,arguments);

 return that.apply(this,arguments);

 };

};

 

Function.prototype.after = function(afterfn){

 var that = this ;

 return function(){

 var ret =that.apply(this,arguments);

 afterfn.apply(this,arguments);

 return ret ;

 };

};

 

var func = function(){

console.log(2);

};

func = func.before(function(){

console.log(1);

}).after(function(){

console.log(3);

});

func();

 

var func1 = document.getElementById;

undefined

func1('nt-contents');

//報錯信息如下, 是由于document.getElementById函數中的this指向為windows對象,而windows對象不存在這些變量。

VM245:1 Uncaught TypeError: Illegal invocation(…)

 

 

//寫那么復雜主要是將this的指向還是定位到document上面

 

var getElementById1 = (function(func){

return function(){

return func.apply(document,arguments);

}

})(document.getElementById);   

 

------------------------------------------------------------------------------------------------------------------------

12.利用JS特性實現一些有趣的Function

var getId = document.getElementById1; //返回 這個對象 function(){return func.apply(document,arguments);}

var div = getId('ntp-contents');//返回func.apply(document,arguments)的對象,arguments參數值div1,func執行閉包中的document.getElementById函數

alert(div.id);

 

//我們上節課講到,怎么在一個內部函數中保持外層的this上下使用了一個變量that來保存外,還可以使用以下方法

Function.prototype.bind =function(context){

var self = this ;

return function(){

alert(self);

alert(context);

return self.apply(context,arguments);

}

};

 

var obj ={name : 'steven'};

var func = (function(){

alert(this.name)

}).bind(obj);

 

 

var isType =function(type){

return  function(obj){

return  Object.prototype.toString.call(obj)==='[object '+type+']';

};

};

 

var isString = isType('String');

isString('hello world');

 

var isArray = isType('Array');

 

isArray([2,3]);

 

13.call、apply的使用

語法

 

function.call(thisObj,param1,param2,param3...);

function.apply(thisObj,[param1,param2,param3...]);

 

用法是改變function的作用域,將參數的上下文作用域修改成thisObj對象, 也可以說this對象為thisObj.

默認的function的作用域是window,this相當于window.function

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩一区二区三区在线免费观看| 亚洲精品二三区| 中文字幕亚洲欧美日韩高清| 日韩亚洲欧美中文在线| 国产亚洲欧洲高清一区| 成人深夜直播免费观看| 成人午夜激情免费视频| 亚洲一区二区三| 日韩成人在线网站| 欧美激情精品久久久久久大尺度| 国产精品久久久久aaaa九色| 在线观看成人黄色| 亚洲人在线观看| 亚洲人在线视频| 色偷偷88888欧美精品久久久| 亚洲经典中文字幕| 国产成人精品一区二区三区| 国产成人精品最新| 欧美裸体xxxx极品少妇| 日韩电影在线观看中文字幕| 国产精品成人品| 亚洲丝袜av一区| 成人av在线天堂| 日韩视频一区在线| 成人在线中文字幕| 欧美性猛交xxxx乱大交极品| 日本精品va在线观看| 欧美乱大交xxxxx| 亚洲国产精彩中文乱码av| 国产婷婷97碰碰久久人人蜜臀| 91精品一区二区| 国产精品免费一区二区三区都可以| 亚洲加勒比久久88色综合| 亚洲最大av网站| 国产精品中文字幕久久久| 久久亚洲影音av资源网| 精品视频在线播放免| 亚洲国产精品高清久久久| 亚洲欧美综合图区| 亚洲美女av黄| 亚洲第一页自拍| 美女久久久久久久久久久| 国产成人av网| www亚洲精品| 亚洲欧美色婷婷| 久久久www成人免费精品| 亚洲美女av在线| 狠狠躁夜夜躁人人躁婷婷91| 77777少妇光屁股久久一区| 精品欧美国产一区二区三区| 日韩在线免费观看视频| 国产综合在线观看视频| 欧美最猛性xxxxx亚洲精品| 中文字幕日韩有码| 国产成+人+综合+亚洲欧美丁香花| 亚洲xxxx视频| 日韩女优人人人人射在线视频| 亚洲理论在线a中文字幕| 欧美第一页在线| 亚洲精品视频播放| 国内精品一区二区三区四区| 国产99在线|中文| 亚洲精品v天堂中文字幕| 亚洲精选一区二区| 欧美电影免费观看电视剧大全| 久久av红桃一区二区小说| 亚洲性线免费观看视频成熟| 日韩在线激情视频| 国产午夜精品免费一区二区三区| 国产精品日韩电影| 一个色综合导航| 国产精品丝袜久久久久久不卡| 欧美一级淫片播放口| 国产精品高潮呻吟久久av无限| 成人免费黄色网| 亚洲成年人在线播放| 亚洲韩国日本中文字幕| 欧美成人精品xxx| 久久久久免费视频| 高清欧美一区二区三区| 日韩视频在线免费观看| 亚洲一区国产精品| 欧美一级淫片播放口| 精品久久久久人成| 亚洲自拍偷拍区| 伊人久久综合97精品| 久久综合久久美利坚合众国| 日韩欧美一区二区三区久久| 日韩av电影在线播放| 欧美在线播放视频| 日韩欧美黄色动漫| 国产中文字幕日韩| 亚洲精品国产成人| 成人黄色av网站| 国产精品69久久| 亚洲视频免费一区| 成人妇女淫片aaaa视频| 这里只有精品久久| 亚洲女人天堂视频| 国产精品嫩草视频| 综合久久五月天| 亚洲精品资源美女情侣酒店| 亚洲国产高清自拍| 97视频在线观看亚洲| 国产精品9999| 在线观看亚洲区| 欧美乱妇40p| 国内精品一区二区三区四区| 亚洲综合在线做性| 911国产网站尤物在线观看| 992tv在线成人免费观看| 欧美一区二区大胆人体摄影专业网站| 日韩欧美国产激情| 国产精品国产福利国产秒拍| 国产精品高精视频免费| 91精品视频观看| 亚洲一级黄色片| 国产一区二区在线播放| 中文字幕不卡在线视频极品| 久久久国产一区二区| 国产美女精彩久久| 欧美人成在线视频| 日韩中文理论片| 亚洲sss综合天堂久久| 久久综合亚洲社区| 国产97色在线| 日韩在线视频免费观看| 国产精品日韩电影| 91日本视频在线| 日韩免费在线免费观看| 亚洲人a成www在线影院| 精品偷拍各种wc美女嘘嘘| 日韩大胆人体377p| 精品国产一区久久久| 亚洲白拍色综合图区| 久久精品成人欧美大片| 国产中文欧美精品| 欧美性xxxx极品高清hd直播| 欧美高清videos高潮hd| 78色国产精品| 亚洲精品视频二区| 亚洲欧美日韩综合| 色综合久综合久久综合久鬼88| 日韩中文视频免费在线观看| 欧美日韩裸体免费视频| 久久久久久久999| 91av在线不卡| 亚洲欧美一区二区三区在线| 97av在线视频免费播放| 亚洲乱码av中文一区二区| 久久久精品影院| 国产一区视频在线| 国产日韩欧美在线看| 最近2019中文免费高清视频观看www99| 亚洲欧美激情在线视频| 欧美最猛性xxxxx亚洲精品| 国产精品一区二区久久久久| 色综合色综合网色综合| 午夜精品福利电影| 国产成人一区三区| 国产精品流白浆视频| 日韩av在线免费观看一区| 国产69久久精品成人看| 中文字幕亚洲欧美一区二区三区|