[高手看过来]有关eval的怪事

Apq001 2006-11-04 02:49:29
这个问题请先不要运行,想想自己认为的解答,再运行看效果,明白后请详解一下。

var a = "abc";
var b = new String(a);
var abc = "567";
alert( eval(a) ); // 这会是多少?
alert( eval(b) ); // 再来一个呢?


希望高手给个解释,我是偶然发现的,我花了两小时才发现是这里的问题,本来是1点睡的,结果搞到现在……
哎~~~调的眼睛都乱跳了,睡觉先,明白看看大家的讨论。
...全文
565 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mingxuan3000 2006-11-04
  • 打赏
  • 举报
回复
//就是这个结果,这就是eval的基本用法呀

alert(eval(a)) = alert(eval("abc")) = alert(abc)
alert(eval(b)) = alert(eval("a")) = alert(a)

alert(eval("abc"))
alert(eval("a"))

那个和这个不一样
muxrwc 2006-11-04
  • 打赏
  • 举报
回复
<script type="text/javascript">
var a = "abc";
var b = new String(a);
//b = String(b); //如果加上这句话的话就得到你想要的效果了
var abc = "567";
alert( eval(a) ); // 而这里的eval执行了字符串
alert( eval(b) ); //这里的eval只是执行了对象,所以取对象里的内容。
</script>
Apq001 2006-11-04
  • 打赏
  • 举报
回复
昨晚睡着前我想到了一些,感觉不是你说这样的。
问题的根本应该在于JavaScript传参的时候,对于引用类型,只是复制了一份引用,并不改变实参的特征性状。

其实我是希望两者都为"567"的,调试的时候可以看到,a 就是字符串"abc",监视窗口并不显示其各种各样的从原型得到的成员,而b跟a的不同就是显示了从原型得到的各种成员。
姑且这么理解:
a为值类型字符串,其值为"abc" //具有值类型变量的特征
b为引用型字符串,其值为"abc" //具有引用型变量的特征
eval在处理的时候,
对于a这种类型是取其值,即相当于eval( "abc" ),//取变量abc
对于b这种类型是取其引用,即相当于b;//取变量b

如此说来,则Number,Boolean也应有类通之处,事实上,也确有。
还记得“TT是什么”那个题吗?new Boolean(false)跟这里的b就有相似之处。

====
睡觉的时候思维才清晰,容易想通。
descreekert 2006-11-04
  • 打赏
  • 举报
回复
alert( eval(a) ); // 这会是多少?
567

alert( eval(b) ); // 再来一个呢?
abc

eval(a),这句只是动态执行 eval(abc = "567"),跟a变量没有关系,所以这时a还是"abc"这个串,而eval(b),相当于eval(b = new String(a));由于这时a还是"abc",所以这句的运行结果就是"abc".

如果想要执行eval(a)时a的值也跟着变化,则这样 alert( a = eval(a) ); 即可
mingxuan3000 2006-11-04
  • 打赏
  • 举报
回复
昨晚数据库有问题,我也是这样
hansonboy 2006-11-04
  • 打赏
  • 举报
回复
昨晚就想回复这个贴了, 不过不知干嘛, 我以到晚上就不能回复的, 真是奇怪,看就可以, 白到又可以,想不通, 难道CSDN晚上不给回复你
  • 打赏
  • 举报
回复
alert( eval(a) );
这个是567,因为a为字符串abc,eval之后就相当于eval("abc"),就改变为abc这个变量了

b=new String(a);这个就好像.net讲 string实际也是一个引用类型一样,虽然value也是abc,但是实际新产生了一个对象,指向了不同的地址,所以alert( eval(b) )这个仍然是abc
mingxuan3000 2006-11-04
  • 打赏
  • 举报
回复
var a = "abc";
var b = new String(a);
var abc = "567";
alert( eval(b) ); // 这会是多少?

alert( eval(b) )的结果是abc,

var b = new String(a);
var b = "a";结果是一样的

muxrwc 2006-11-04
  • 打赏
  • 举报
回复
eval后第一个还是对象只是把它的值拿出来了而已。
但是第二个则成了变量abc把abc的值拿出来了。
打错了。寒
不好意思。
muxrwc 2006-11-04
  • 打赏
  • 举报
回复
LZ不明白的就是new啊
因为
var b = new String(a);
var b = "a";
eval前可是不一样的
只不过是eval后的结果是一样的。
eval后第一个还是对象只是把它的值拿出来了而已。
但是第二个则成了变量a把a的值拿出来了。
他们虽然结果是一样的。
但是操作的方式是不一样的。
另外。。
我想问个问题呢。。。
谁能帮我解答下啊。。
msn:muxrwc@hotmail.com
mingxuan3000 2006-11-04
  • 打赏
  • 举报
回复
和new有什么关系

var b = "a";

一样的结果呀
alert( eval(eval(b)) ) //看看这个
btbtd 2006-11-04
  • 打赏
  • 举报
回复
关键在 new.
mingxuan3000 2006-11-04
  • 打赏
  • 举报
回复
eval我的理解就是把字符串变成一个变量或obj

eval("document.getELementB"+"yId('aa').value")
上面是2个字符串相连,结果等于document.getELementById('aa').value后的结果
var a = "abc";
eval(a)就相当于eval("abc"),
eval("abc")后的结果是变量abc,
而变量abc的值是567
最后结果相当于alert(abc)

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧