JavaScript高级程序设计读书笔记(第四章)(一)

变量的基本类型和引用类型

ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值。基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。但在为对象添加属性时,操作的是实际的对象。
而基本数据类型:Undefined、Null、Boolean、Number 和String。这5 种基本数据类型是按值访问的,他们都保存在栈内存中。

动态的属性:

对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法。引用类型保存在堆内存中。

var person  = {};
person.name = 'xxx';
alert(person.name);//xxx

复制变量值:

基本数据类型值:从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。新变量和原变量是完全独立的两个值。

var a= 1;
var b = a;//a和b完全独立,这两个变量可以参与任何操作而不会相互影响

引用类型的值:当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。

var a = {};
var b = a;
a.name = 'xxx';
alert(b.name);//xxx

其实a和b指向的是同一个对象。

传递参数:

ECMAScript 中所有函数的参数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。

function add(num){
    return num +10;
}
var a= 10;
var r = add(a);
alert(a);//10,a的值不会发生变化
alert(r);//20

对象参数:

function setName(obj){
    obj.name = 'xxx';
}
var a = {};
setName(a);
alert(a.name);//xxx

a这个变量被传递到setName()函数中之后就被复制给了obj。在这个函数内部,obj 和 a引用的是同一个对象。所以,对象在传递参数时也是按值传递的。

使用instanceof检测变量类型

result = variable instanceof constructor
如果变量是给定引用类型,可以使用下面的方法检测:

alert(person instanceof Object); // 变量person 是Object 吗?
alert(colors instanceof Array); // 变量colors 是Array 吗?
alert(pattern instanceof RegExp); // 变量pattern 是RegExp 吗?
alert(pattern instanceof Function); // 变量pattern 是Function吗?

根据规定,所有引用类型的值都是Object 的实例。因此,在检测一个引用类型值和Object 构造函数时,instanceof 操作符始终会返回true。

没有块级作用域

if (true) {
    var color = "blue";
}
alert(color); //"blue"

在上面的代码中,if语句内部声明了变量color,但是在if语句外部还是可以访问,在JavaScript 中,if 语句中的变量声明会将变量添加到当前的执行环境(在这里是全局环境)中。

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

for循环结束后还是可以在全局中访问其声明的变量i。

查询标识符:

当在某个环境中为了读取或写入而引用一个标识符时,必须通过搜索来确定该标识符实际代表什么。搜索过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符。如果在局部环境中找到了该标识符,搜索过程停止,变量就绪。如果在局部环境中没有找到该变量名,则继续沿作用域链向上搜索。搜索过程将一直追溯到全局环境的变量对象。如果在全局环境中也没有找到这个标识符,则意味着该变量尚未声明。

var color = "blue";
function getColor(){
    return color;
}
alert(getColor()); //在全局变量中找到color的值'blue'
var color = "blue";
function getColor(){
    var color = "red";
    return color;
}
alert(getColor()); //先找到局部变量中的color并返回该值'red'

查询标识符过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员青戈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值