var str = "string...."; var arr = ["this","is","array"]; var obj = {name:"caizhongqi",age:26,sex:"male"}; 這些 " /> 中文日产无乱码AV在线观,777久久人妻少妇嫩草AV,亚洲人成电影网站在线观看

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

分析 JavaScript 中令人困惑的變量賦值

Javascript是一門弱類型的語言,聲明變量不需要聲明其類型,var x 就可以等于任何類型的值。
比如:

var str = "string....";
var arr = ["this","is","array"];
var obj = {name:"caizhongqi",age:26,sex:"male"};
這些都是正確的,這似乎非常簡單方便,但是這種方便也會帶來一些令人難于捉摸的意外,看看下面的例子(例1):

<script> var x = "this is string";
 var y = x;
 x="ni hao";
 alert(y)
</script>

你可能一下子知道alert出來的就是“this is string”,沒錯,但對于用Java語言的程序員來說,var y=x 應(yīng)該是把x在存儲器中的地址(指針)賦給y變量才對,因此他們覺得應(yīng)該alert出“ni hao”才會更符合Java語言的習(xí)慣,但JavaScript語言不是這樣,字符串的賦值是直接量操作,直接把數(shù)據(jù)copy給y的存儲空間。

再看看下面的例子(例2):

<script>
var x = ["hello"]  // 這是一個數(shù)組,只有一個元素,并且該元素為字符串類型
var y = x;
x[0] = "world";
alert(y[0]);
</script>

如果你還以為alert出來的是“hello”,那就錯了。當 var y = x 時,x不是已經(jīng)把它的數(shù)組給了y嗎?但事實上卻不是這樣, 當 var y = x 時,x傳的是它在存儲器中的地址(指針)!x[0]="world" 修改了在原存儲位置上的數(shù)據(jù),因此alert(y[0])就是拿x的新值出來alert。混亂了吧?怎么一會兒是直接量一會兒是引用量呢?
不急,下面的例子將更加混亂(例3):

<script>
var x = ["hello"]  // 這是一個數(shù)組,只有一個元素,并且該元素為字符串類型
var y = x;
x = ["ni","hao"];  // x 將變成一個新的數(shù)組了。
alert(y[0]);
</script>

你的眼睛告訴你,alert出來的是“hello”!這讓人捉摸不透古靈精怪的JavaScript!

周星馳的《國產(chǎn)零零漆》中有類似的一幕:
當星爺剛從深圳到香港執(zhí)行任務(wù)時,袁詠儀從他的行李中發(fā)現(xiàn)一個吹頭發(fā)的風(fēng)筒,星爺說這其實是個須刨,把皮鞋拿出來一看卻是一個風(fēng)筒,一個貌似大哥大電話的玩意其實又是一個須刨。須刨與風(fēng)筒把袁詠儀與觀眾都搞混亂了,哈哈哈哈,這是我很喜歡的一部片,第一次看時肚子都笑痛了。

回過頭來再看看剛才的變量賦值,直接量與引用量的使用,就好像須刨與風(fēng)筒換來換去,把我們都搞暈了。
其實問題出在對x的第二次賦值 x = ["ni","hao"] 上,我們看看變量在存儲器上變化以及JavaScript在對待字符串類型與對象類型的不同:

我們觀察下面兩種情況:
var x = "this is string...";
var y = ["this","is","string"];

x與y不同之處在于類型,Javascript的解析器把字符串直接賦值(其實就是copy)給x(直接量),卻把數(shù)組的指針賦給y(引用量),這一切都是瞬間全自動的!結(jié)合下面的圖,可能會更好地理解:



圖中p1、p2...就是變量的指針,上面的 var y 中的y存的就是Object類型變量的指針p1(假設(shè)),而x存放的就是字符串本身。再分析一下例3,執(zhí)行 var x = ["hello"] 時,解析器就在內(nèi)存上開辟一塊存儲空間放這個數(shù)組,而 x 就拿到了這個空間的地址(指針),再執(zhí)行 x = ["ni","hao"] 時,解析器又新開辟一塊存儲空間放這個新數(shù)組,而x就是這個新存儲空間的指針,這也就是說,JavaScript 里變量的重定義(或重新賦值)將會新開辟一塊存儲空間,而沒有銷毀原來的空間;回過頭來再看例2,x[0] = "world",這句沒有給x新定義值,沒有新開辟存儲空間,只是修改了它存儲空間里面的數(shù)據(jù),因此例2最后alert出來的就是“world”;例1是字符串賦值,全過程是直接量操作。

從上面的分析可以看出,JavaScript 的變量可以存儲直接量也可以存儲指針,這是沒辦法被人工干擾的,因此,在日常的編碼中,就需要注意這些問題,比如大字符串連接,循環(huán)里面賦值等細節(jié)就能直接影響到程序的執(zhí)行效率。

看看兩個例子:

var _tmpStr="";
var str = "this is big string...";
for (i=0; i<100; i++){
    _tmpStr += a;
}
a = _tmpStr;

因為是字符串操作,使用直接量,每次循環(huán)都要操作大字符串,非常笨重,效率低下。如果改用引用量操作,即通過數(shù)組:

var str = "this is big string...";
var _tmpArray = [];
for (i=0; i<100; i++){
    _tmpArray[i]=str;
}
str = _tmpArray.join("");

做個測試,假如有個100k的字符串,用直接量連接操作,我的機器上需要約2600毫秒,如果用數(shù)組連接,則需要150毫秒,效率相差十幾倍。

好久沒寫這么長的文章了,花了我大半天的時間。

JavaScript技術(shù)分析 JavaScript 中令人困惑的變量賦值,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 99久久婷婷国产综合精品青草 | 久久综合丁香激情久久 | 红尘影院手机在线观看 | 在线观看成人免费 | 99久久精品久久久久久清纯 | 久久亚洲高清观看 | 奶头从情趣内衣下露了出来AV | 一个人在线观看免费高清视频在线观看 | 快播在线电影网站 | 共妻肉多荤文高h一女n男 | 蜜桃精品成人影片 | 熟女人妻水多爽中文字幕 | 99re精品视频在线播放视频 | 欧美精品亚洲精品日韩专区一 | 色吧.com | 在线天天看片视频免费观看 | 亚洲乱码一区二区三区香蕉 | 国产老师开裆丝袜喷水漫画 | yellow高清免费观看日本 | 大桥未久与黑人中出视频 | 亚洲人成影院在线播放 | 人与人特黄一级 | 国产视频这里只有精品 | 成人动漫百度影音 | 成人免费视频在线 | 青青伊人国产 | 处破女免费播放 | 国产精品玖玖玖影院 | 久久国产乱子伦精品免费不卡 | 高h浪荡文辣文神奇宝贝 | 妻子的妹妹在线 | 中文成人在线视频 | 影音先锋电影资源av | 免费高清毛片 | 亚洲在线中文无码首页 | 久久亚洲欧美国产综合 | 一本道dvd久久综合高清免费 | 国产精品97久久久久久AV色戒 | 国产偷国产偷亚州清高 | 美女露100%全身无遮挡 | 亚洲另类欧美综合在线 |