<<^^>>努力不一定有回报,不努力一定没有回报。

信息展示

昵称:aliveto 邮箱:some_body@foxmail.com

js函数传值,及引用值的透析

一.JS的值类型:

原始值:

  1. number(数字类型天生就是浮点型)
  2. string
  3. boolean
  4. undefined
  5. null

引用值:

  1. array
  2. object
  3. function
  4. date(日期对象)
  5. regexp(正则)

区别:原始值是放到栈中(stack);引用值放到堆里(heap),栈中存放的是这个地址的引用。


var arr = [1,2,3];
//创建一个数组[1,2,3],然后变量arr指向这个数组所在的地址,arr只是一个引用

二.思考


<script>
function trans(obj){
   obj = {
      age:13,
      name:'li'
   }
}
var obj = {
    age:13
}
trans(obj)
console.log(obj) // {age:13}
</script>

上面的代码为什么将obj当参数传进去后,改变它的值,外面在打印obj却没有改变。这是怎么回事?

解析:对于这个题目我们得先理解引用值的概念,当函数的参数传的是引用值时,它传进来的只是一个址的引用符号而已,而不是将地址直接传进来。这就意味着,函数trans参数obj是指向{age:13}的一个引用符号。在函数里分两种情况:一种就是在函数里直接对值地址进行相应的操作,另一种就是在函数里将这个引用指向另一个空间(这种产生的这个空间会随着函数执行结束而被释放)

在函数里将这个引用指向另一个空间的例子就如同上面的程序,里面怎么变,外面的obj还是不会改变(地址不同)。

在函数里直接对传进来的地址进行相应的操作如下面的程序:


<script>
function trans(obj){
    obj.name = "li"
}
var obj = {
    age:13
}
trans(obj)
console.log(obj) // {age:13,obj:"li"}
</script>

总结:对于引用值,要特别的注意,当一个引用符号另辟空间的时候很容易让人误解。