重溫Javascript(一)

來源:互聯網
上載者:User

標籤:訪問   終端   cal   作用   通過   class   編碼   執行個體   pes   

   工作中要用到JavaScript,一組複習筆記。

 

一些看法

  1. 想想JavaScript目前最常用的宿主環境,瀏覽器或者服務端V8,都是單線程,所以不用過多的考慮並發的問題,如果是協程來實現非同步方法,反正就是不用考慮竟態條件了。

  2. 開發方式。又是OOP,又是OOF,對獨立開發來說就是盡情發揮了。對協作開發來說,有時規範不是很好統一,可以實現的方式太過靈活,暈頭轉向是常有的事,要想通俗易懂,命名比寫C# JAVA這類語言有更高的要求。反正經常看不明白this,鬼知道是被丟到哪個環境中被調用了。我想TypeScript也是無奈之下出來的解決方案了。

  3. 效能,每個終端有每個終端的環境也羅列不全,套的越深,越是坑。

  

  簡單想想,最需要關注的還是JavaScript的OOP文法模型,畢竟不管是在瀏覽器或是伺服器,其他的對象都封裝好了,更多的考慮是實現功能的資訊模型。

 

Object類型

 

  Object類型是所有對象執行個體的基類。

  hasOwnProperty(propertyName):用於檢查給定的屬性在當前對象執行個體中(不是原型)是否存在。參數propertyName必須是字串。

  isPrototypeOf(object):object的原型鏈具有當前執行個體的原型鏈,則返回true。

 

全等操作符

 

  除了在比較值錢不轉換運算元之外,全等和不全等操作符沒什麼區別。全等操作符由3個等號表示,只在兩個運算元未經轉換就相等的情況下返回。

 

函數arguments

 

  函數的agruments對象類似數組,可是使用索引來訪問,arguments[0],也有length屬性

 

值傳遞和引用傳遞

 

  其實這點有點像C#。

  1.基本類型值的複製    

var num1=5;var num2=num1;

  

  2.引用複製

var obj1=new Object();var obj2=obj1;obj1.name="peter";alert(obj2.name); //peter

  

 

  3.傳遞參數

  基本類型值的傳遞如同基本類型變數的複製,參考型別值得傳遞,如同參考型別變數的複製。

  

function addTem(num){  num+=10;  return num;    }var count=20;var result=addTen(count);alert(count); //20 沒有變化alert(result); //30

  

function setName(obj){  obj.name=“peter”;  }var person=new Object();setName(person);alert(person.name); //peter

  

坑一 變數喜歡亂跳域

 

for(var i=0;i<10;i++){  doSomething(i);  }alert(i); //10

 

Function類型

 

  每個函數都是Function類型的執行個體,都與其他參考型別一樣具有屬性和方法。由於函數是對象,函數名實際上是一個指向函數對象的指標,不會與某個函數綁定。

function sum(num1,num2){}var sum=function(num1,num2){};

  

坑二 函數指標變化

 

function factorial(num){    if (num <=1) {        return 1;    } else {        return num * factorial(num-1)    }}            

  根據上面函數指標的說法,factorial這個名字是可以指向另外的函數的,所以這個函數有可能在運行時被動態改變。

  出坑的方法

function factorial(num){    if (num <=1) {        return 1;        } else {            return num * arguments.callee(num-1)        }}

  arguments.callee是一個指標,指向擁有這個arguments對象的函數

var trueFactorial = factorial;factorial = function(){    return 0;};alert(trueFactorial(5)); //120alert(factorial(5)); //0

  

this

  如果層級很繞,很難看清楚。

  總結就是,誰調用該函數,this就指向誰

window.color = "red";var o = { color: "blue" };function sayColor(){    alert(this.color);}sayColor(); //"red"o.sayColor = sayColor;o.sayColor(); //"blue"

 

apply和call方法

 

  在特定的範圍中調用函數,設定函數體內this對象的值

  call與apply第一個參數都是範圍,後面的參數call必須一一列舉,apply可以使用數組

function sum(num1, num2){    return num1 + num2;}function callSum(num1, num2){    return sum.call(this, num1, num2);}alert(callSum(10,10)); //20

 

bind方法

  會建立一個函數的執行個體,this值會被綁定到傳給bind函數的值

window.color = "red";var o = { color: "blue" };function sayColor(){    alert(this.color);}var objectSayColor = sayColor.bind(o);objectSayColor(); //blue

  

encodeURI和encodeURIComponent的區別

 

  encodeURI不會對本身屬於URI的特殊字元進行編碼,例如冒號、正斜杠、問號和#;encodeURIComponent會對它發現的任何非標準字元進行編碼

var uri = "http://www.wrox.com/illegal value.htm#start";//"http://www.wrox.com/illegal%20value.htm#start"alert(encodeURI(uri));//"http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start"alert(encodeURIComponent(uri));

  

eval方法

 

  當解析器發現代碼中調用eval()方法時,會將傳入的參數當做實際的ECMAScript語句來解析,把執行結果插入原位置。通過eval執行的代碼被認為是包含該次調用的執行環境的一部分,因此被執行的代碼具有與該執行環境相同的範圍鏈。通過eval執行的代碼可以引用在包含環境中定義的變數

var msg = "hello world";eval("alert(msg)"); //"hello world"

  

eval("function sayHi() { alert(‘hi‘); }");sayHi();

  

eval("var msg = ‘hello world‘; ");alert(msg); //"hello world"

  

 

重溫Javascript(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.