一、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是數字;