Javascript字符串及数组赋值区别
最近做一個分頁的javascript程序,需要先將tbody下面的tr標簽全部刪除,然后再append新的tr,使用下面的代碼
var?trs=$d("tbdoys").getElementsByTagName("tr");????for(var?j=0;j<trs.length;j++){
????????$d("tbdoys").removeChild(trs[j]);
}?
但是發現tbody在removeChild的時候,trs.length也實時的減小,導致tbody只能刪除一半,bing一通,發現以下的博文,主要是講:Javascript將字符串賦值給某變量是是值賦值,而將數組賦值給某變量時,是引用賦值,
最后采用了比較歪門邪道的方法,實現了功能。
var?trs=$d("tbdoys").getElementsByTagName("tr");? ??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 里變量重定義(或重新賦值)將會新開辟塊存儲空間而沒有銷毀原來空間;回過頭來再看例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毫秒效率相差十幾倍?
好久沒寫這么長文章了花了我大半天時間?
轉載于:https://www.cnblogs.com/zhanghw0354/archive/2012/01/18/2325754.html
總結
以上是生活随笔為你收集整理的Javascript字符串及数组赋值区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一路走多久是哪首歌啊?
- 下一篇: 电费多少钱一度?