js高级程序设计第三版 第四章

1、当一个变量向另外一个变量复制引用类型的时候,这两个变量实际上是指向一个指针:

demo:

var s = new Object
undefined
s
Object {}
var s1 = s;
undefined
s1
Object {}
s.name = "ss"
"ss"
s
Object {name: "ss"}
s1
Object {name: "ss"}
2、变量在函数中的传递都是按照值传递的

不是传递引用和指针(这两个都会修改值得副本)

我们来看这几个demo:

var fun1 = function(num){
    num+=10;
    alert(num);
}
var c = 10;
fun1(c);
alert(c);

函数之类输出的是20,但是c输出还是10,说明未修改副本,参数是按照值来传递的

那我们再来看一个对象传递的例子:

    var setName = function(obj){
        obj.name = "nini";
    }
    var p = new Object();
    setName(p);
    alert(p.name);

这个会打印出nini、但是这不能说明参数不是按照值来传递的

这个影响的原因是,p指向的对象在堆内存中只有一个,是全局对象。


在来看一个demo:

    var setName = function(obj){
        obj.name = "nini";
        obj = new Object();
        obj.name = "haha";
    }
    var p = new Object();
    setName(p);
    alert(p.name);

这个打印出的还是nini。

这个可以看出,参数是按照值传递的。。在函数内部修改了参数的值,原始的引用仍然保持不变。

3、用instanceof替代typeof进行变量类型检查:

语法:result = variable instanceof constructor

person instanceof Object //变量person是Object吗

pattern instanceof RegExp //变量person是RegExp吗

4、延长作用域链:

    function fun1(){
        var m = "s";
        with(location){
            var url = href + m;
        }
        return url;
    }

with语句接收location对象,相当于在fun1中定义了一个变量,起到一个延长作用域链的作用

关键要切记,js中没有块作用域这个概念

下面两个demo很好说明了这一点

if(s){
    var t="s";
}
alert(t); //s

for(var i=0;i<10;i++){
    //xxx
}
alert(i); //10

没有声明的变量直接使用,会默认声明为全局半两


第四章总结:

引用类型的值是对象,保存在堆变量中

从一个变量向另一个变量复制引用类型的值,复制的是指针。如果复制的是基本类型的值,则复制的是这个值的副本

在进入一个新环境的时候,会创建一个用于搜索的作用域链

标记清除是目前主流的垃圾收集算法,还有的是引用计数。这两个稍微了解下意思就行

当代码中出现循环引用,那么引用计数算法就会出现问题,会导致内存无法清除。




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值