關於javascript把元素賦值給變量的問題——DOM裏元素的獨一無二

前言

這個問題困擾了我超級久,因爲寫c++好幾年了所以學js情不自禁拿他和c++類比學習,真的難受==所以爲什麼要拿腳本語言和編程語言對比,可能我對c++愛的深沉,我想如果讓我寫一篇c++和js有什麼區別我一定能侃侃而談
對於js的學習路線:先看視頻入門——>再看文檔深入——>做大綱圖+對難點做筆記 看視頻確實費時間,但是直觀,跟着寫寫代碼再看文檔深入就比較容易。接下來react,mobx,redux的學習我大概都是這個路線。

關於js

最近學js,總得理解通過DOM操控html元素,通過BOM和瀏覽器打交道。
這兩個其實簡單來說就是用已經實現的document這個對象的各種屬性和方法對html元素做一系列操作
window這個全局對象已經實現的屬性方法提供一些幫助

在學習DOM的時候,網上一個demo真的讓我鑽了好幾天牛角尖,實際上寫在這裏的也是我淺顯的理解,不一定對。當然我覺得他是對的,我就打算這麼理解,直到有更好的理解出現。

描述問題

let lis=document.getElementsByTagName("li");//應該hTMLCollection
let btn=document.getElementById("mybtn");
let arr=[];
btn.onclick=function(){
   for(let i=0;i<lis.length;i++){
      arr[i]=lis[i];
      arr[i].innerHTML+="   三國  ";
   }
}

簡單描述一下用lis這個對象獲取了所有的li標籤,這些東西裝在HTMLCollection這個結構裏,不是數組,有點類似數組。
現在要對他們排序,第一步是先把他們放在數組裏,用數組已經實現的sort方法去排序,然後再用appendChild這個方法把他們放回自己的父節點裏也就是ul。這就需要數組裏裝的這些就是我們的li標籤。我當時自己實現用的push,一個空數組裏push進去元素,肯定還是這些元素。
其實在c++裏,不論你是push還是賦值這些都是生成了新的變量(值相同,開闢另一塊內存),所以他們只有值還有關係,這個時候改這個另一個不會動,包括值傳遞參數,這些都是隱式的(進行賦值,新的變量,進去)
其實js裏的編程思想也是一樣的,經過代碼測試,正常的情況下同c++,你改你的,不會動我的,比如

 let a=[10,12,14];
 let b=[];
 for(let i=0;i<3;i++) {
     b.push(a[i]);
 }
 b[0]=100;
 console.log(a);
 console.log(b);

結果

10 12 14
100 12 14

這兩個互不相干!這真的很自然!!!但是DOM不是這樣的,因爲html元素很重要,獨一無二。一個是賦值一個是引用!這是最大的區別
拿最開始的代碼來說

let lis=document.getElementsByTagName("li");//應該hTMLCollection
let btn=document.getElementById("mybtn");
let arr=[];
btn.onclick=function(){
   for(let i=0;i<lis.length;i++){
      arr[i]=lis[i];
      arr[i].innerHTML+="   三國  ";
   }
}

結果:所有的li真的加上了三國這兩個字

這個地方裝的是元素,所以給變量賦值,其實就是多個變量都裝着這個元素。在dom裏裝元素的變量是真的容器,一定要理解!所以多幾個容器裝,還都這個東西,通過哪個變量操控這個元素,都還是這個元素。所以改他的innerHTML確實變了!這就是DOM!!!

總結

這個和平時的編程思維真的容易混(可能我已經太定式了)。總之正常寫js我們該怎麼寫怎麼寫,和c++其實還是有很多相似之處的,起碼這些編程思維是一樣的,賦值就是賦值,我們值一樣,但是不同的變量,各走各的
但是在DOM裏一定記住元素的獨一無二,這個時候用變量去裝元素,就是容器,多少個裝也只有這個元素,所以改變就是牽一髮而動全身,分角度去看!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章