最近做一个分页的javascript程序,需要先将tbody下面的tr标签全部删除,然后再append新的tr,使用下面的代码
for( var j=0;j<trs.length;j++){
$d("tbdoys").removeChild(trs[j]);
}
但是发现tbody在removeChild的时候,trs.length也实时的减小,导致tbody只能删除一半,bing一通,发现以下的博文,主要是讲:Javascript将字符串赋值给某变量是是值赋值,而将数组赋值给某变量时,是引用赋值,
最后采用了比较歪门邪道的方法,实现了功能。
for(var j=0;j<trs.length;j=0){
$d("tbdoys").removeChild(trs[j]);
}
以下是博文地址及博文
http://www.crazycoder.cn/Javascript/Article45710.html
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 里变量
重定义(或重新赋值)将会新开辟
块存储空间
而没有销毁原来
空间;回过头来再看例2
x[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毫秒
效率相差十几倍
好久没写这么长文章了
花了我大半天
时间