javascript的对象和变量之间的区分

发布网友 发布时间:2022-04-22 06:11

我来回答

4个回答

热心网友 时间:2022-04-07 11:01

0, JavaScript的变量有几种类型: number, string, boolean, function, object, 对象就是变量的一种类型.

1,var request = createRequest();
我可以吧request当作一个变量,由createRequest方法来赋值;
这个说法有歧义, 不是由方法对变量赋值, 而是使用createRequest的返回值为变量赋值.

2, 我也可以把它当作一个object,于是request.xxx可以访问createRequest方法里面的xxx。
这个理解是错的, 从外部不能访问到方法内部定义的变量. 有一种特殊的情况:

function closure(){
var a = 1;
return function() {
return a++;
}
}
var fn = closure();
alert(fn()); //1;
alert(fn()); //2; 函数内部的变量被改变了

这个是JavaScript的闭包机制, 可以在方法外部修改方法的内部变更量. 类似于.Net的委托机制(Java的Callback); 并且这个内部变量的行为类似强制类型语言中的实例私有成员, 参考下面的代码:
//接上面的代码
var fn2 = closure();
alert(fn2()); //1, 创建了新的闭包
alert(fn()); //3, 原有闭包并未释放,
fn = null; //将对闭包内部变量的引用释放(将fn赋其它值也一样, fn = 1;), 则该闭包将会被gc回收

3, 对象, JavaScript对象一定是使用new关键字创建.
var a = {}; //简化写法等价于 var a = new Object();
var b = []; //简化写法等价于 var a = new Array();

4, 实例, javascript不是面向对象的语言, 但是对象有默认的constructor属性, 引用创建对象的function(可以理解为某类型的实例). 但是, 因为javascript是弱类型动态语言, 可以动态修改对象的结构或使用其它类型的引用为变量赋值, 所以并不能在语言层面确保对象的封装, 参考下面的代码:
function class(){
this.a = 1;
this.b = 'a';
}
function somethingElse() {
return 1;
}
//创建3个class的实例
var a = new class();
var b = new class();
var c = new class();
//此时 a.constructor === b.constructor === c.constructor === class;

a.constructor = somethingElse; //覆盖constructor属性, 这样a就和class没有任何关联了, 虽然有一个instanceof二元操作符, 但是其实现是比较prototype, 本例中都没有指定prototype(默认{}), 所以instanceof是无效的, a instanceof class == true, a instanceof somethingElse == true, a instanceof Object == true,

b = new somethingElse(); //这时b就变成somethingElse的实例了(b.constructor === somethingElse), 但是somethingElse方法没有为实例添加任何成员, 所以b = {};

delete c.b; //删除对象的成员, c = {a: 1}, 这样虽然c.constructor === class(还是class的实例), 但是与其它由class创建的实例外观就不同了.

热心网友 时间:2022-04-07 12:19

当然有区别 只不过javaScript的变量不能自己定义类型所以所有类型的值都可以赋给同一个变量
你的例子
var request=createRequest();
如果这是一个普通的函数返回一个值的话request就是一个普通的变量
如果createRequest()是一个对象的构造方法的话那 request就是一个对象的引用
记住是引用而不是对象本身
这个时候你当然可以request.xxx可以访问createRequest方法里面的xxx追问引用不是对象本身。。。嗯。。。问一下那个“实例”(instance)又是什么呢?request算是一个实例吗?

追答还是这个var request=createRequest();
假设createRequest()是一个对象的构造方法 上边的语句就是创建了一个对象赋给了requset
这个时候 var sss=requset
这个时候sss和requset就是同一个实例的引用
比如这个对象里有一个int的值的话 你在requset里改变了那个值的话那sss的同一个值也会改变
明白了把

热心网友 时间:2022-04-07 13:54

javascript 是动态脚本语言。
任何变量都有 .prototype属性
所有对象的属性都映射在.prototype下
这样就能动态给变量赋予属性。
所以使用起来是没有区别,只是内部实现不同

热心网友 时间:2022-04-07 15:45

这是不同的概念,变量可以是整数,浮点数,也可以是一个对象的引用。两者不能等同。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com