如果学习javaScript之前已经学过其他编程语言,在学习javaScript就会和之前观念冲突。如何学接受javaScript,然后在学习其他编程语言。学习其他语言时候也是会冲突。不过其他编程语言比如C#,java 这种语言,规则更合理,更好理解,既然学javaScript,我们只需要学习不同之处牢记心中,不然就会容易出错,今天我们现象了解一下javaScript函数与c#,java不同。
参数规则
JavaScript 函数参数与大多数语言函数参数是规则不同,参数没有个数要求,没有类型要求。
javaScript | C# | Java | |
---|---|---|---|
参数类型 | 没有要求 | 要求 | 要求 |
参数个数 | 没有要求 | 要求 | 要求 |
重载 | 不支持 | 支持 | 支持 |
function Add (num1,num2)
{
return num1 + 1;
}
console.log(Add(1));//结果是2 一个参数也可以调用成功
console.log(Add("hi", 2));//结果是hi1 类型可以随便输入
console.log(Add("1", 2, 3));//结果是11 多个参数还是可以调用成功的
--------------------------------------------------------------------------------------
function Add (num1,num2,num3)
{
return num1 + 1;
}
function Add() {
if (arguments.length == 2) {
return arguments[0] + arguments[1];
}
return "sadas";
}
console.log(Add(1, 2));//结果是3 ,函数名称相同的,后面函数覆盖签名函数,函数所有参数都可以通过arguments对象来接受,arguments是个数组
console.log(Add());//结果是sadas ,函数名称相同的,
参数规则
ECMAScript 中所有的函数的参数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就是把值从一个变量复制到另一个变量一样。基本类型值的传递如同基本类型变量的复制一样,而引用类型值的传递,则如同引用类型变量的复制一样。下面分开例子介绍两种不同类型为什么是按值传递。
基本类型值
本类型这个按值传递比较好理解,直接复制变量的值传递:
function addTen(num){
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
console.log(result); // 30
console.log(count); // 20 ,没有变化哈
引用类型值
有些人认为引用类型的传参是按照引用来传的,那暂且认为他们的理解是正确的,那下面的示例结果怎么解析呢?
function setName(obj){
obj.name = '嘉明';
obj = new Object();
obj.name = '庞嘉明';
}
var person = new Object();
setName(person);
console.log(person.name); // '嘉明',为啥不是'庞嘉明'呢?
如果是按照引用传的话,那么新建的对象obj = new Object()应该是指向堆内容的对象啊,那么改变它本有的name属性值应该生效,然而并没有生效。所以它也是按值传递滴。
第一步:
var person = new Object();
第二步:
setName(person);
把创建一个obj对象person内存空间
第三步:
obj.name = ‘嘉明’;
第四步:
第五步
obj.name = ‘庞嘉明’;
在js中所有的传递都是值传递,这个值可以是个指向引用类型的指针,所以等号并不意味着修改这个引用对象,而是切换了原来的引用关系。(第一步到三步我觉得可以算引用传递吧,只是后续obj新开辟空间,没有覆盖原来内存,所有就归类值传递,其实也不是很合理,如果完成是值传递,第三步就应该新开辟空间)
函数声明与函数表达式
解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁。解析器会率先读取函数声明,并使其执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解析
console.log(sum(10 , 10)); // 20
function sum(num1 , num2){
return num1 + num2;
}
console.log(sum(10 , 10)); //TypeError: sum is not a function
var sum = function(num1 , num2){
return num1 + num2;
}