面向對象的JavaScript 二 ----- Javascript高級知識

本文主要講解javascript的高級知識。只是指出一些可能讓人產生誤解的知識。
1.js內置函數
parseInt()
parseFloat()
isNaN()
isFinite()
encodeURI()
decodeURI()
encodeURIComponent()
decodeURIComponent()
eval()
以上多是js標準囊括的函數,你可能會問爲什麼沒有alert,其實alert只是瀏覽器實現的,但是不屬於js核心標準。

2.變量作用域
關於變量作用域的問題,大家都理解一些基礎的概念,那麼看看如下代碼:
var a = 123;
function f() {
  alert(a);
  var a = 1;
  alert(a);
}
f();
你也許認爲第一個輸出是123,第二個輸出是1.其實,第一個輸出是undefined,第二個輸出是1
因爲局部定義的變量會覆蓋全局的變量,即使調用這個變量在定義這個變量之前(即只要在這個作用域內,局部變量就會覆蓋全局變量)。

3.functions
注意js裏面functions也是變量。所以可以將變量作爲參數傳入,以實現回調機制。同樣函數還可以自調用,如下:
(
  function(){
    alert('boo');
  }
)()

在函數內部可以定義函數,作爲private函數,會有一下好處:
1.保持全局作用域的乾淨
2.保持私有性.

4.Object
定義object和定義functions,比如定義book對象:
var book = {
  name: 'Catch-22',
  published: 1961,
  author: {
    firstname: 'Joseph',
    lastname: 'Heller'
  }
};

然後可以通過[]或者.訪問屬性。object中還可以定義函數(之前已經說個函數就是變量),實例如下:
var hero = {
  breed: 'Turtle',
  occupation: 'Ninja',
  say: function() {
    return 'I am ' + hero.occupation;
  }
}

而我們一般使用的定義object的方法是使用構造函數,比如:
function Hero() {
  this.occupation = 'Ninja';
}
>>> var hero = new Hero();
注意new關鍵字不能省略,否則
>>> var h = Hero('Leonardo');
>>> typeof h
"undefned"
這個結果肯定不是你想要的,如果省略了new, 則h實際上是Hero函數的返回值。

比較兩種構建對象的方法,構造函數更好。因爲使用構造函數可以使得在初始化的時候傳入參數,如果沒這個需求,也就不用使用構造函數了,比如json。

5.全局對象
如果js是在瀏覽器中運行,那麼全局對象就是window。比如,你可以通過window[a]來訪問到全局變量a。

6.構造器屬性
每個對象由一個constructor屬性,指向構造函數
>>> var h2 = Hero('Leonardo');
>>> h2.constructor
Hero(name)

7.instanceof
一下是使用instanceof的實例以及返回值:
>>> function Hero(){}
>>> var h = new Hero();
>>> var o = {};
>>> h instanceof Hero;
      true
>>> h instanceof Object;
      false
>>> o instanceof Object;
      true
可以很容易理解instanceof的作用

8.js內置對象
內建對象可以分爲三類:
1.Data wrapper object 如: object array function boolean number string
2.utility object 如: Math,Date Regexp
3.error object 如:Error
之前已經詳細介紹了第一類中的部分數據類型,本次介紹其他幾個對象

Object是所有其它對象的父類,創建一個空對象:
>>> var o = {};
>>> var o = new Object();
一個空對象有三個properties:
o.constructor 指向這個對象的構造函數
o.toString() 返回表述這個對象的string
o.valueOf() 返回這個對象的值

array也是內建對象,類型爲object,構造函數爲Array(),另外比起空的對象,多了length這個屬性
array還有內建方法:pop push sort join slice splice
主要介紹一下Join。join可以帶個參數,表示join時候的連接字符串:
>>> var a = [3, 5, 1, 7, 'test'];
>>> a.join(' is not ');
       "1 is not 3 is not 5 is not 7 is not test"

function
function的內建屬性有:
constructuor,length(函數參數的個數)
caller
propotype(關於這個在下一篇文章中會詳細介紹)

string的內建方法:
toUpperCase()
toLowerCAse()
charAt()
indexOf()
lastIndexOf()
slice()
substring()

MathDate這裏就不論述了,使用的時候查一下就可以了。

RegExp
創建方法:
 var re = new RegExp("j.*t");
或者是
var re = /j.*t/;
參數作用:
"g" for global
"i" for ignoreCase
"m" for multiline
比如:
>>> var re = new RegExp('j.*t', 'gmi');
另外這幾個參數是可以動態修改的.
比如:
>>> re.global = false
這裏提供幾個簡單的調用(詳細內容不論述了):
 /j.*t/.test("Javascript");
    false
>>> /j.*t/i.exec("Javascript")[0]
    "Javascript"

Error Object
主要的關鍵字是:try catch finally,作用和java類似,給一個實例:
try {
  iDontExist();
  throw new Error('Division by zero!');
} catch (e){
  alert(e.name + ': ' + e.message);
} finally {
  alert('Finally!');
}
內建的error有:
ReferenceError TypeError Error

throw語句有更跟好的寫法:
throw {
  name: "MyError",
  message: "OMG! Something terrible has happened"
}

本文就介紹到這裏,寫一篇文章將介紹最重要的prototype屬性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章