JS 变量

93 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情

JS 变量

JS 变量是松散类型的,即没有对变量设定必须是什么数据类型,这样就会脚本的生命周期中变量的值和类型都可能胡发生变化。当然这样会可能会引起问题。今天主要是深入学习JS 中的变量。

原始值和引用值

ES中有2种不同类型的数据:原始值和引用值。

  • 原始值,就是值的本身。常见的原始值类型:Number、Boolean、String、Undefined、Null 和 symbol 。

注意点:string 的值是原始值不是引用类型,这个和我们遇到其他语言是有区别的。

  • 引用值,值是保存在内存中,当操作访问时都是对该对象的引用操作。

注意点:JS 是不允许直接访问内存位置,所以我们是无法直接操作对象所在的内存空间。

复制值

当进行数据复制的时候,变量是原始值和引用值也是有区别的。如果变量是原始值,两个变量互相都是独立的,即改变一个值不会影响另外一个值。但是对于引用类型可能就会遇到改遍一个值另外一个值也会发生变化,这因为它们都是操作同一个内存地址存在的值导致。这就涉及深拷贝和浅拷贝的问题。

参数传递

ES 中所有函数的参数都是按值传递的。

function Add(count){
 count += 3
  return count
}
let sum=20;
let result = Add(sum,0)
console.log(count) // 输出结果 20 
console.log(result) // 输出结果 23

在 Add 方法中,count 是在当前函数内的局部变量,和外部的count 是互不影响。在调用Add 方法时只是将count 变量复制给方法的参数。

function setName(obj){
  obj.name="Tommy";
  obj = new Object();
  obj.name="Grance";
}

let person=new Object();
setName(person)
console.log(person.name) //输出结果:“Tommy”

看上面的例子,传入的参数是个对象,是引用类型。输出的结果还是 Tommy,这就是因为按值传递的原因。如果是按引用传递的话,setName 修改了name 就会影响输出结果。但因为在setName 方法中重新定义了一个新的对象,是一个局部变量不会影响外部的结果,而引用对象传给setName 它还是保持和外部一样的,所以给name 赋值后就会有结果。