关于js的值传递和引用传递
Posted 小菜与小鸟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于js的值传递和引用传递相关的知识,希望对你有一定的参考价值。
最近在弄一个东西,明明就很简单的。
不知道为啥有个坑,双向绑定,不过当有个数组为空时,它不会发送空的数组,而是不发送。
这就坑爹了。导致老是删不掉。
处理了下,改成验证为空时,发送‘[]‘字符串。
成功。
但是avalon绑定ms-repeat时只能绑数组和对象。
所以在获取后对它操作。进行转换成空数组。
但是一直都不成功。
一直都会提示只能绑数组或对象。
参考了其他的例子,并没有什么区别。
同样是这样操作。可就是不行。
今天在调试时,突然发现,是在转换时出现了问题。
然后换成直接操作引用过来的对象,而不是赋值后我新定义的对象。
因为赋给它的值是一个字符串,而不是一个对象。
【虽然在js里,所有的都是对象 = =。但这有点坑窝,似乎。】
这样就不会出现这样的错误了。
原来,基本类型是没有引用传递的。而数组、对象、函数则可以。
之前一直搞不清,js几时的是值传递,几时是引用传递。
参考:http://blog.sina.com.cn/s/blog_52132c010102wa81.html 感觉评论比较简洁
5种基本数据类型:number/string/null/boolean/undefined
引用类型:数组/函数/对象
function chainStore()
{
var store1=‘Nike China‘;
var store2=store1;
store1=‘Nike U.S.A.‘;
alert(store2); //Nike China
}
chainStore();
基本数据类型的引用及再次赋值操作,等于是:复制了一个值,也就是内存里有两块区域,分别保存了相同的两个值。var store1=‘Nike China‘; 把Nike China赋值给了store1。而var store2=store1; 又开辟一个新内存地址,把Nike China复制,复制而不是赋值,给了store2。现在呢,内存里有两块区域:store1和store2,都保存的是Nike China。这个就好理解了吧。所以store1随便修改,store2还是保持不变。
而引用类型,举例:function chainStore() {
var store1=[‘Nike China‘];
var store2=store1;
alert(store2[0]); //Nike China
store1[0]=‘Nike U.S.A.‘;
alert(store2[0]); //Nike U.S.A.
}
chainStore();
为什么会两次输出store2结果不同呢?因为:这个是数组,属于引用类型。虽然有store1和store2两个变量,但是在内存中(引用地址)是同一个地址,这个知道指针概念的同学会很好理解。所以第一次var store2=store1; 其实只把引用地址交给了store2.所以两个store共享同一个【Nike China】,而当修改了store1的时候,那么他们共享的内容就发生了变化(因为一共就这一个东西,而不是各自有一个),导致store2输出的时候也发生了变化,变成了【Nike U.S.A.】
以上,简单举例引用类型,和基本数据类型
不知道为啥有个坑,双向绑定,不过当有个数组为空时,它不会发送空的数组,而是不发送。
这就坑爹了。导致老是删不掉。
处理了下,改成验证为空时,发送‘[]‘字符串。
成功。
但是avalon绑定ms-repeat时只能绑数组和对象。
所以在获取后对它操作。进行转换成空数组。
但是一直都不成功。
一直都会提示只能绑数组或对象。
参考了其他的例子,并没有什么区别。
同样是这样操作。可就是不行。
今天在调试时,突然发现,是在转换时出现了问题。
然后换成直接操作引用过来的对象,而不是赋值后我新定义的对象。
因为赋给它的值是一个字符串,而不是一个对象。
【虽然在js里,所有的都是对象 = =。但这有点坑窝,似乎。】
这样就不会出现这样的错误了。
原来,基本类型是没有引用传递的。而数组、对象、函数则可以。
之前一直搞不清,js几时的是值传递,几时是引用传递。
参考:http://blog.sina.com.cn/s/blog_52132c010102wa81.html 感觉评论比较简洁
5种基本数据类型:number/string/null/boolean/undefined
引用类型:数组/函数/对象
function chainStore()
{
var store1=‘Nike China‘;
var store2=store1;
store1=‘Nike U.S.A.‘;
alert(store2); //Nike China
}
chainStore();
基本数据类型的引用及再次赋值操作,等于是:复制了一个值,也就是内存里有两块区域,分别保存了相同的两个值。var store1=‘Nike China‘; 把Nike China赋值给了store1。而var store2=store1; 又开辟一个新内存地址,把Nike China复制,复制而不是赋值,给了store2。现在呢,内存里有两块区域:store1和store2,都保存的是Nike China。这个就好理解了吧。所以store1随便修改,store2还是保持不变。
而引用类型,举例:function chainStore() {
var store1=[‘Nike China‘];
var store2=store1;
alert(store2[0]); //Nike China
store1[0]=‘Nike U.S.A.‘;
alert(store2[0]); //Nike U.S.A.
}
chainStore();
为什么会两次输出store2结果不同呢?因为:这个是数组,属于引用类型。虽然有store1和store2两个变量,但是在内存中(引用地址)是同一个地址,这个知道指针概念的同学会很好理解。所以第一次var store2=store1; 其实只把引用地址交给了store2.所以两个store共享同一个【Nike China】,而当修改了store1的时候,那么他们共享的内容就发生了变化(因为一共就这一个东西,而不是各自有一个),导致store2输出的时候也发生了变化,变成了【Nike U.S.A.】
以上,简单举例引用类型,和基本数据类型
以上是关于关于js的值传递和引用传递的主要内容,如果未能解决你的问题,请参考以下文章