標籤:訪問 終端 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(一)