We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
javascript中,变量不想其他的编译型语言有严格的类型,而是采用的比较松散的类型,这样的好处是比较灵活,即便是在整个生命周期,也可以改变变量的类型,带来的缺点附带了更加复杂的情况,容易出问题。
基本类型主要就是Undefined、Null、Boolean、Number和String。引用类型是对象Object,在引用类型中,我们可以在其中动态的添加属性。
Undefined
Null
Boolean
Number
String
Object
var obj = new Object(); obj.name = 'John' console.log(obj.name)
当多个变量指向同一个变量的时候,是把值的副本分别赋给了所有的变量,需要注意的是基本类型和引用类型复制的目标的不同。基本类型复制的是值本身,而引用类型复制的是引用指针的副本。我们来看具体的例子,外加对内存进行辅助分析。
var n = 5; var m = n;
以上的代码在内存中的是这个样子的,基本类型直接保存在栈内存中,多个变量相互引用同一个基本类型,就是在栈内存中复制该变量。
var obj = { value: 1 } var foo = obj
当obj赋值一个引用对象的时候,栈内存里保存的是这个引用对象的地址指针值,堆内存里保存的实际的对象。
obj
当运行完var foor = obj的时候,内存示意图如下,变量foo实际是指向的一份obj的副本,也就是另一份{value:1}和obj一样的指针
var foor = obj
foo
{value:1}
以上就后面要讲的按值传递的基础,有了这些知识,再看下面就很简单了。
在下面的这段代码中,foo函数内部修改外部obj的属性value的值,并且我们通过验证发现外部的obj的属性确实被修改了。
value
var obj = { value: 1 } function foo(obj) { obj.value = 2 console.log(obj, 'foo') // {value: 2} "foo" } console.log(obj, 'global') // {value: 2} "global"
这段代码的关系图可以表示成下图,也就是说外部的obj和foo函数的内的obj都通过各自的指针,指向了同一个对象,然后foo内对obj进行属性操作其实就是对真实对象进行操作,看起来就好像obj就是真实的对象。
obj ---> refence ---->{value: 1} <---- refence <-------obj(foo中)
The text was updated successfully, but these errors were encountered:
No branches or pull requests
javascript中,变量不想其他的编译型语言有严格的类型,而是采用的比较松散的类型,这样的好处是比较灵活,即便是在整个生命周期,也可以改变变量的类型,带来的缺点附带了更加复杂的情况,容易出问题。
前置知识——基本类型和变量类型
基本类型主要就是
Undefined
、Null
、Boolean
、Number
和String
。引用类型是对象Object
,在引用类型中,我们可以在其中动态的添加属性。复制变量值
当多个变量指向同一个变量的时候,是把值的副本分别赋给了所有的变量,需要注意的是基本类型和引用类型复制的目标的不同。基本类型复制的是值本身,而引用类型复制的是引用指针的副本。我们来看具体的例子,外加对内存进行辅助分析。
以上的代码在内存中的是这个样子的,基本类型直接保存在栈内存中,多个变量相互引用同一个基本类型,就是在栈内存中复制该变量。
当
obj
赋值一个引用对象的时候,栈内存里保存的是这个引用对象的地址指针值,堆内存里保存的实际的对象。当运行完
var foor = obj
的时候,内存示意图如下,变量foo
实际是指向的一份obj
的副本,也就是另一份{value:1}
和obj
一样的指针以上就后面要讲的按值传递的基础,有了这些知识,再看下面就很简单了。
函数参数传递
在下面的这段代码中,
foo
函数内部修改外部obj
的属性value
的值,并且我们通过验证发现外部的obj
的属性确实被修改了。这段代码的关系图可以表示成下图,也就是说外部的
obj
和foo
函数的内的obj
都通过各自的指针,指向了同一个对象,然后foo
内对obj
进行属性操作其实就是对真实对象进行操作,看起来就好像obj就是真实的对象。The text was updated successfully, but these errors were encountered: