JavaScript 參數 arguments深入瞭解以及javascript內置數據類型的討論

一、JavaScript函數特性簡介

在JavaScript的函數中,參數會保存在一個arguments對象中,實際上javascript不支持函數重名,後面的函數聲明會覆蓋前面的。因爲javascript的函數參數個數是完全不指定的,而且函數作爲一級公民,必須是一個名稱對應一個函數。


二、JavaScript的特殊對象arguments

>function test(){return arguments}
undefined
>test(1)
[1]
>test(1,2)
[1, 2]
>typeof test()
"object"
>test('a','b',12)
["a", "b", 12]

v = test(1,3,4)
[1, 3, 4]
Object.prototype.toString.call(v)
"[object Arguments]"


chrome瀏覽器返回值給人一種錯覺,好像arguments是個數組,但是其實他的類型就是"Arguments",它是一種擁有length屬性的特殊對象;

nodejs裏的返回就不一樣


> function test(){return arguments}
undefined
> test(1)
{ '0': 1 }
> test(1,2,3)
{ '0': 1,
  '1': 2,
  '2': 3 }
>


三、JavaScript中的值與引用

事實上,Arguments保存的不是值,而是引用;

下面給出一個例子:

function test(a,b,c){ a = 10; b = 10; c = 10; console.log(arguments);}
undefined
test(1,2,3)
[10, 10, 10] VM4229:2
undefined
從這個例子可以看出來:arguments並不是參數的拷貝,而是一個參數的引用,這和javascript內置的數組有很大的區別,再給出一個例子:

var a = 1, b = 1, c = 1;
undefined
var list = [a, b, c]
undefined
list
[1, 1, 1]
a = 10; b = 10; c = 10;
10
list
[1, 1, 1]
在這裏數組list裏面的實際上是a,b,c的值而不是引用。

var a = 'hello';
undefined
list = [a]
["hello"]
a = 'world'
"world"
list
["hello"]

說起值和引用,大家可能會想起java,java裏只有基本類型(bool, char, byte, short, int, long, float, double等)是值,其他的都是引用,但是在javascript裏面不是這樣的,javascript裏面寬泛地將有如下數據結構:

number;

string;

object;

boolean;

undefined;

【注意】null的類型是object,NaN是數字;






發佈了51 篇原創文章 · 獲贊 21 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章