js高级程序设计第三版 第四章
2014-05-14 01:30
281 查看
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:
函数之类输出的是20,但是c输出还是10,说明未修改副本,参数是按照值来传递的
那我们再来看一个对象传递的例子:
这个会打印出nini、但是这不能说明参数不是按照值来传递的
这个影响的原因是,p指向的对象在堆内存中只有一个,是全局对象。
在来看一个demo:
这个打印出的还是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很好说明了这一点
没有声明的变量直接使用,会默认声明为全局半两
第四章总结:
引用类型的值是对象,保存在堆变量中
从一个变量向另一个变量复制引用类型的值,复制的是指针。如果复制的是基本类型的值,则复制的是这个值的副本
在进入一个新环境的时候,会创建一个用于搜索的作用域链
标记清除是目前主流的垃圾收集算法,还有的是引用计数。这两个稍微了解下意思就行
当代码中出现循环引用,那么引用计数算法就会出现问题,会导致内存无法清除。
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
没有声明的变量直接使用,会默认声明为全局半两
第四章总结:
引用类型的值是对象,保存在堆变量中
从一个变量向另一个变量复制引用类型的值,复制的是指针。如果复制的是基本类型的值,则复制的是这个值的副本
在进入一个新环境的时候,会创建一个用于搜索的作用域链
标记清除是目前主流的垃圾收集算法,还有的是引用计数。这两个稍微了解下意思就行
当代码中出现循环引用,那么引用计数算法就会出现问题,会导致内存无法清除。
相关文章推荐
- js高级程序设计(第三版)学习笔记(第一版)
- JS高级程序设计第三版——变量、作用域和内存问题
- js高级程序设计(第三版)这一遍的总结——第二章在html中使用js
- 笔记:js高级程序设计第四章
- js高级程序设计(第三版)总结--检测数组(判断数组的方法)
- js高级程序设计(第三版)这一遍的总结——第三章基本概念
- js高级程序设计(第三版)总结--数组重排序方法 reverse() 和 sort()的用法
- JS高级程序设计第三版——在HTML中使用JavaScript
- js高级程序设计(第三版)--元操作符递增和递减操作符(前置型和后置型)详解
- 读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题
- js高级程序设计(第三版)总结——第五章引用类型(RegExp类和Function类)
- JS自学(一)--javaScript高级程序设计(第三版)----人民邮电出版社
- JS高级程序设计第三版——基本概念
- javascript高级程序设计第三版 第四章 变量、作用域和内存问题
- 《js高级程序设计(第三版)》第五章学习笔记
- js高级程序设计(第三版)总结——第六章面向对象的程序设计
- js高级程序设计(第三版)总结--函数声明与函数表达式区别
- js高级程序设计(第三版)总结--数组栈方法
- js高级程序设计(第三版)第二章
- JS高级程序设计第四章笔记作用域&作用域链