专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Javascript教程 » javascript数组赋值:分析 JavaScript 中令人困惑的变量赋值 »正文

javascript数组赋值:分析 JavaScript 中令人困惑的变量赋值

来源: 发布时间:星期六, 2008年12月27日 浏览:38次 评论:0
Javascript是门弱类型语言声明变量不需要声明其类型var x 就可以等于任何类型
比如:
var str = "....";
var arr = ["this","is",".gif' />"];
var obj = {name:"caizhongqi",age:26,sex:"male"};
这些都是正确这似乎非常简单方便但是这种方便也会带来些令人难于捉摸意外看看下面例子(例1):
<script> var x = "this is ";
var y = x;
x="ni hao";
alert(y)
</script>
你可能下子知道alert出来就是“this is 没错但对于用Java语言员来说var y=x 应该是把x在存储器中地址(指针)赋给y变量才对因此他们觉得应该alert出“ni hao”才会更符合Java语言习惯但JavaScript语言不是这样赋值是直接量操作直接把数据copy给y存储空间
再看看下面例子(例2):
<script>
var x = ["hello"] // 这是只有个元素并且该元素为串类型
var y = x;
x[0] = "world";
alert(y[0]);
</script>
如果你还以为alert出来是“hello”那就错了当 var y = x 时x不是已经把它给了y吗?但事实上却不是这样 当 var y = x 时x传是它在存储器中地址(指针)!x[0]="world" 修改了在原存储位置上数据因此alert(y[0])就是拿x新值出来alert混乱了吧?如何会儿是直接量会儿是引用量呢?
不急下面例子将更加混乱(例3):
<script>
var x = ["hello"] // 这是只有个元素并且该元素为串类型
var y = x;
x = ["ni","hao"]; // x 将变成个新
alert(y[0]);
</script>
眼睛告诉你alert出来是“hello”!这让人捉摸不透古灵精怪JavaScript!
周星驰国产零零漆中有类似幕:
当星爷刚从深圳到香港执行任务时袁咏仪从他行李中发现个吹头发风筒星爷说这其实是个须刨把皮鞋拿出来看却是个风筒个貌似大哥大电话玩意其实又是个须刨须刨和风筒把袁咏仪和观众都搞混乱了哈哈哈哈这是我很喜欢部片次看时肚子都笑痛了
回过头来再看看刚才变量赋值直接量和引用量使用就好像须刨和风筒换来换去把我们都搞晕了
其实问题出在对x第 2次赋值 x = ["ni","hao"] 上我们看看变量在存储器上变化以及JavaScript在对待串类型和对象类型区别:
我们观察下面两种情况:
var x = "this is ...";
var y = ["this","is",""];
x和y区别的处在于类型javascript解析器把串直接赋值(其实就是copy)给x(直接量)却把指针赋给y(引用量)切都是瞬间全自动!结合下面可能会更好地理解:

图中p1、p2...就是变量指针上面 var y 中y存就是Object类型变量指针p1(假设)而x存放就是串本身再分析下例3执行 var x = ["hello"] 时解析器就在内存上开辟块存储空间放这个而 x 就拿到了这个空间地址(指针)再执行 x = ["ni","hao"] 时解析器又新开辟块存储空间放这个新而x就是这个新存储空间指针这也就是说JavaScript 里变量重定义(或重新赋值)将会新开辟块存储空间而没有销毁原来空间;回过头来再看例2x[0] = "world"这句没有给x新定义值没有新开辟存储空间只是修改了它存储空间里面数据因此例2最后alert出来就是“world”;例1是串赋值全过程是直接量操作
从上面分析可以看出JavaScript 变量可以存储直接量也可以存储指针这是没办法被人工干扰因此在日常编码中就需要注意这些问题比如大串连接循环里面赋值等细节就能直接影响到执行效率
看看两个例子:
var _tmpStr="";
var str = "this is big ...";
for (i=0; i<100; i){
_tmpStr a;
}
a = _tmpStr;
串操作使用直接量每次循环都要操作大非常笨重效率低下如果改用引用量操作即通过:
var str = "this is big ...";
var _tmpArray = ;
for (i=0; i<100; i){
_tmpArray[i]=str;
}
str = _tmpArray.join("");
做个测试假如有个100k用直接量连接操作机器上需要约2600毫秒如果用连接则需要150毫秒效率相差十几倍
好久没写这么长文章了花了我大半天时间

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: