JavaScript之作用域和引用类型
学习js高级程序设计第四、五章
4.1基本类型和引用类型的值:基本类型值指的是简单的数据段,引用类型值指可能由多个值构成的对象。
引用类型的值是保存在内存中的对象,不能直接访问,而是按引用访问(类似指针?)
复制变量值:基本类型值会在复制的变量对象上创建一个新值,两个变量的任何操作互不影响。而引用类型实际是复制引用,指向同一个对象,所以一个个边,另一个也随之变化。
传递参数:所有参数均按值传递,传递基本类型值,值被复制给一个局部变量(命名参数,arguments对象中的一个元素),传递引用类型的值时,会把这个值在内存中的地址复制给局部变量,因此这个局部变量的变化会反映在函数的外部,而不是传递了引用。
function setName(obj){
obj.name='kaka';
obj=new Object();
obj.name='dodo';
}
var person=new Object();
setName(person);
alert(person.name); //'kaka'
上面的例子中对象person的地址传递给setName,执行obj.name='kaka'会添加到person中,而obj=new Object()这行代码重新添加(指向)了一个新对象地址,和person无关,所以之后改变name属性person。name任然是kaka,假设是按引用传递的,那么就会使person指向新的对象name属性随之改变。
检测类型:typeof var a='aa';console.log(typeof(a)) //String
instanceof console.log(person instanceof Object)判断是否是某种类型的对象
本章重点:执行环境及作用域
对于局部变量和全局变量在其他语言中我有点了解,但是牵扯到作用域链,执行环境,甚至闭包函数等问题,还是得重点关注下作用域链的问题
这个最好环视画一画图比较好理解,纯文字看起来有点费劲,作用域链这部分在第七章闭包中讲的很详细,第七章的学习中进一步巩固。摘抄一下原文,写的很精辟。
执行环境(execution context)定义了变量或函数有权访问其他数据,每个执行环境都有一个与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存在这个对象中。某个执行汗巾中的所有代码执行完毕后,该环境被销毁,保存在其中的变量和函数定义也随之销毁(全局执行环境知道应用陈谷退出--例如关闭网页或浏览器时才被销毁)。
当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的前端,始终都是当前执行的代码虽在环境的变量对象。如果这个环境是函数,则将其活动对象作为变量对象。作用域链中的下一个变量对象来自包含(外部)环境,再下一个变量对象则来自下一个包含环境。全局执行环境的变量对象是中毒是作用域链中的最后一个对象。
标识符解析(搜索变量的说法跟贴近些?)是沿作用域链一级一级的搜索标识符的过程。始终从作用域链的前端开始,然后逐级的回溯,知道找到为止。
建议先看闭包,再回过头来看这一章节,就很清晰了,我之前扫到这的时候是晕的,看完闭包那一章节之后再看这段就很简单了,例子跳过。。。
延长作用域链:1try-catch语句的catch块
2with语句
垃圾收集
1:标记清除。常用方法。垃圾收集器 给所有内存中的变量添加标记-->去掉环境中的变量以及被环境中变量引用的变量的标记-->然后那些有标记的变量就可以销毁了。
2引用计数。
第五章 引用类型
相当于Java中的类,描述的是一类对象所具有的属性和方法。
原生引用类型,便于开发应用:Object,Array,Date,RegEXP,Function类型
Object类型
创建方法 1:varperson=new Object(); person.name='aa';..
2:使用对象字面量表示法:var person={name:'aa',...}
可以使用方括号访问对象属性,优点:可以通过变量来访问属性 e:var propertyName=’blabla’;alert(person[propertyName])
Arrayl类型
检测方法 Array.isArray(var ..)
length属性不是只读的,可以通过设置这个属性,改变数组。
常用的数组方法:
join()方法,只接受一个参数(用作分隔符的字符串),返回包含所有数组项的字符串e:var colors=[‘red’,’green’,’blue’] alert(colors.join(‘||’);=>返回字符串‘red||green||blue’
栈方法:push() pop()
push方法接收任意数量的参数,把他们逐个添加到数组末尾,并返回数组长度(返回值为数组长度),
pop方法从数组末尾移除最后一项,然后返回移除的项
队列方法:shift()移除数组中第一个项,并返回该项
Unshifth()在数组前端添加任意个项,并返回新数组的长度
重排序方法:reverse() 反转数组项的顺序,sort()
concat()基于当前数组所有项创建一个新数组,将参数添加到新数组末尾,返回新数组。
slice(i,j)返回第i项到第j项(不包括j项,不改变原数组)
splice()
splice(i,j)删除数组中的i到j项,返回删除项
solice(i,j,k,l...) i起始位置,j要删除的项数,k插入项。返回被删除的项
indexOf(i) 正序查找数组中元素i所在的角标
lastIndexOF(i) 倒序查找数组中元素i所在角标
迭代方法:arr.map(func(item,index,array){})
map():返回一个新的Array,每个元素为调用func的结果--->新数组,数组每一项为函数运行结果
filter():返回一个符合func条件的元素数组会返回true的项组成的数组。--->数组,满足条件的arr元素组成的数组,对数组中的每一项运行给定函数,返回该函数
some():返回一个boolean,判断是否有元素是否符合func条件--->true/false逻辑或
every():返回一个boolean,判断每个元素是否符合func条件--->true/false逻辑与
forEach():没有返回值,只是针对每个元素调用func--->
缩小:reduce()/reduceRight()
RegExp: 正则表达式 var a=new RegExp("");a.test(bla) true/false
var expression=/parttern/flags
flags: g-->全局模式
i-->忽略大小写
m-->多行模式
Math对象
Math.random()返回介于0和1之间一个随机数,不包括0和1
Math.floor(Math.random()*52+1) 返回一个1到52的随机整数
Date对象
1 var date=new Date()
2 var date=new Date(Date.parse(‘2016-11-10’))
3 var date=new Date(Date.UTC(2016,0,…)) 1月份->0
Function类型(对象)
函数实际上是对象,函数名是指向函数对象的指针。解析器先读取函数声明,使其在执行任何代码之前可用,所以代码中先调用后写函数是可以的。
重点:函数作为值的调用
function callSomeFunction(someFunction,someArgument){
return someFunction(someArgument);
}
函数内部属性
arguments对象,callee属性:指针,指向拥有这儿arguments对象的函数
function factorial(num){
if(num<=1){
return num*arguments.callee(num-1)
}
}
arguments.callee=factorial 解耦
this对象:
this引用的是函数执行环境的对象
caller保存着调用当前函数的的函数引用 arguments。callee.caller
函数的属性和方法:
每个函数都包含两个属性:length和prototype
Length表示函数希望收的到参数的个数
prototype保存引用类型所有实例方法的真正所在。主要用于创建自定义引用类型和实现继承(第六章讲述)。
每个函数都包含两个非继承而来的方法 :apply() call() 用途:在特定的作用与众调用函数,等于设置函数体内this对象的值。区别:fun.apply(this,arguments)/fun.apply(this,[arg1,arg2])/fun.call(this,arg1,arg2).
单体内置对象:1URI编码
encodeURI()和encodeURIComponent() 分别编空格(%20) 非数字字母
2 eval()方法,接收参数为要执行的js字符串,在字符串转json格式时候很有用 eval("("+data+")")
JavaScript之作用域和引用类型的更多相关文章
- 第一百零六节,JavaScript变量作用域及内存
JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只 ...
- 浅谈JavaScript的作用域
前段时间学了下JavaScript作用域,这个东西在JavaScript非常重要,也是JavaScript很基础的东西,正如少林里面基础武功,有了基础,才能学绝世武功. 作用域的作用是啥?一套设计良好 ...
- JavaScript变量作用域
全部变量拥有全局作用域,局部变量拥有局部作用域(这里注意函数的参数也是局部变量) 1.在函数体内,局部变量的优先级高于同名的全局变量. 我的理解就是当你同时定义了同名的局部变量和全局变量时,函数体内返 ...
- 初探JavaScript(四)——作用域链和声明提前
前言:最近恰逢毕业季,千千万万的学生党开始步入社会,告别象牙塔似的学校生活.往往在人生的各个拐点的时候,情感丰富,感触颇深,各种对过去的美好的总结,对未来的展望.与此同时,也让诸多的老“园”工看完这些 ...
- JavaScript的作用域与作用域链
作用域 作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期.可以说,变量和函数在什么时候可以用,什么时候被摧毁,这都与作用域有关. JavaScript中,变量的作用域有全局 ...
- JavaScript的作用域和提升机制
JavaScript的作用域和提升机制 你知道下面的JavaScript代码执行时会输出什么吗? 1 2 3 4 5 6 7 8 var foo = 1; function bar() { i ...
- Javascript的作用域、作用域链以及闭包
一.javascript中的作用域 ①全局变量-函数体外部进行声明 ②局部变量-函数体内部进行声明 1)函数级作用域 javascript语言中局部变量不同于C#.Java等高级语言,在这些高级语言内 ...
- 深入理解Javascript变量作用域
在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数 ...
- 【转】javascript变量作用域、匿名函数及闭包
下面这段话为摘抄,看到网上大多数人使用的是变量在使用的时候声明而不是在顶端声明,也可能考虑到js查找变量影响性能的问题,哪里用就在哪里声明,也很好. 在Javascript中,我们在写函数的时候往往需 ...
随机推荐
- SqlServer实现先将所有数据排好序再进行分页
平时,我们对数据进行分页,然后将分页后的数据再进行排序输出.这样做只是针对每次请求,也就是前TOP个数据进行了排序,并不是将数据库中的所有的数据进行了排序.当我们需要将数据库中的所有数据排序后在进行分 ...
- android windows
获取当前设备的分辨率 DisplayMetrics dm=new DisplayMetrics(); //新建一个分辨对象 WindowManager wm=this.getWindowManager ...
- 安装和使用elasticsearch
环境: win7 64位 jdk1.8.0 elasticsearch2.3.3 在官网下载elasticsearch2.3.3:https://www.elastic.co/thank-you? ...
- CSS3 动画实现 animation 和 transition 比较
在 CSS3 中有两种方式实现动画, 分别是 animation 和 transition, 他们都有以下功能 根据特定 CSS 属性进行动画 设定属性变化的 timing function 设定动画 ...
- prototype数组方法的实现
数组插入元素push Array.prototype.push=function(){ for(var i=0;i<arguments.length;i++){ this[this.length ...
- Windows程序设再读笔记02-Unicode
1.ASCII,7位编码,共128个编码,1950年ansi提出. 2.变种的Ascii,0x40等10个代码保留各个国家单独使用,1967年由iso提出.旨在解决重音符号,英镑符号的问题. 3.扩展 ...
- publish/subscribe
Pub/Sub功能 Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能.基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供 ...
- windowsxp设置开机不需密码,但是锁定后打开需要密码
方法一: 1.先设置好密码2.设置不输入密码自动登陆系统 在cmd下运行rundll32 netplwiz.dll,UsersRunDll,在打开的窗口中,取消“要使用本机,用户必须输入用户名和密码” ...
- 为什么C语言中的数组序号都是从0开始
这个规则并不是在所有计算机语言上通行的,例如Matlab上就是从1开始. 这个规则是从内存寻址设计上继承来的,因为在如100个元素的数组对应的内存单元中,从内存地址位0开始到内存地址为99,总共记录9 ...
- genymotion启动虚拟机遇到问题解决方法步骤
通过在不做任务设置时启动genymotion,会遇到一些问题: 会弹出类似如下问题: 要解决这样问题,首先要知道是什么问题,一般按提示在VitualBox中启动虚拟机就可以知道是什么问题. “To f ...