1. 程式人生 > >一些小的總結

一些小的總結

中午用csdn還沒有改版,晚上這就改版了,這效率還真是快啊,有點不太習慣哈哈。
最近秋招真的每天都忙的要死,昨天去面試走太多路,晚上回去發現腳底都磨出水泡了,今天早上六點就醒了,9點到11點做了去哪兒的筆試,又是賽碼網,賽碼網真的跟我相剋啊,我每次用本地編譯能通過,但是賽碼線上編譯就是通不過,心塞。中午午覺沒睡,下午一點半鬥魚的筆試,可是北森網又出了問題,題目一直進不去,跑到牛客底下去給鬥魚校招留言,然後3點左右接到電話問我進去沒,說是現在可以進去了。120分鐘的題我快速的用了不到一個小時做完了。。。因為還約了4點半的電話面試。。。
現在總結一下我沒答上了還有忽略的地方。

關於let和const

let和const是ES6語法中新增的,跟var相比,主要存在以下特性:
1、let和const不能變數提升,存在暫時性死區;

console.log(b);//undefined
console.log(a);//報錯,Uncaught ReferenceError: a is not defined
let a = 1;
var b = 2;

2、let和const有塊級作用域,而var沒有;

var i = 1;
if(i==1){
	let b = 2;  //若是var b = 2;就不會報錯
}
console.log(b);//報錯,Uncaught ReferenceError: b is not defined

3、let和const不允許重複宣告;

var a = 1;
var a = 2; //不會報錯
let b = 3;
let b = 4;  //報錯,Uncaught SyntaxError: Identifier 'b' has already been declared
const c = 5;
const c = 6; //報錯,Uncaught SyntaxError: Identifier 'c' has already been declared

4、let和const之間也存在一些區別
這一點是我之前沒有注意到的
(1)、let可以宣告之後不初始化,const宣告的變數,必須立即初始化,不能留到以後賦值;

let a;
console.log(a); //undefined
const b;//報錯,Uncaught SyntaxError: Missing initializer in const declaration,就是說const的宣告缺少初始化
console.log(b);

(2)、let宣告之後可以重複賦值,而const不可以
const宣告的是一個只讀常量,一旦聲明瞭,常量的值就不能改變。

let a = 1;
a = 2;
console.log(a);  //2

const b = 2;
b = 3;
console.log(b); //報錯,Uncaught TypeError: Assignment to constant variable.

(3)、結合(2)關於const再補充
這一點是我所忽略的:

const實際上保證的,並不是變數的值不得改動,而是變數指向的那個記憶體地址所儲存的資料不得改動。對於簡單型別的資料(數值、字串、布林值),值就儲存在變數指向的那個記憶體地址,因此等同於常量。但對於複合型別的資料(主要是物件和陣列),變數指向的記憶體地址,儲存的只是一個指向實際資料的指標,const只能保證這個指標是固定的(即總是指向另一個固定的地址),至於它指向的資料結構是不是可變的,就完全不能控制了。因此,將一個物件宣告為常量必須非常小心。

若const宣告的是一個數組或是物件,是可以對陣列或物件進行操作的。

const arr = [1,2,3];
arr.push(4);
console.log(arr); //[1,2,3,4]

const obj = {};
obj.name = "dbb";
console.log(obj.name); //dbb

關於怎麼新增class的問題

這個問題我平時真的沒有注意過哎,明天要來好好看一下,今天到此為止,明天再來總結。
來了,新版的這個csdn編輯貌似有bug哎,不知道他們的程式設計師發現了沒,修改上面的內容的時候,一打字頁面就會自動跳轉到下面。
關於新增class的問題,我之前還真的沒有注意過,剛才好好百度了一下,發現了很多隱藏知識,哈哈,看來我的知識面還是不夠廣啊。下面來總結一下:

1、使用setAttribute()方法

通過setAttribute()方法既可以操作HTML特性也可以操作自定義特性。通過這個方法設定的特性名會被統一轉換為小寫形式,也就是說就算你寫的是‘CLASS’也會被轉換成‘class’;
setAttribute()接受兩個引數:要設定的特性名和值;

var div1 = document.getElementsByTagName('div')[0];
div1.setAttribute('class','one');

在這裡插入圖片描述
問題:只能新增一個class,後面再次會覆蓋

2、直接使用className這個屬性

className,與元素的class特性對應,即為元素指定的CSS類。沒有將這個屬性命名為class,是因為class是ECMAScript的保留字。可用於設定或返回元素的class屬性。

var div1 = document.getElementsByTagName('div')[0];
div1.className = 'one';  //直接使用className屬性
div1.className += ' two'; //在後面追加一個,這裡two前面要加一個空格,否則會跟前一個連在一起

在這裡插入圖片描述
3、使用HTML DOM classList屬性

classList屬性返回元素的類名,作為DOMTokenList物件,該元素用於在元素中新增、移除及切換CSS類,classList屬性是隻讀的,但你可以使用add()和remove()方法修改它。

classList的屬性:length;返回列表中類的數量;
classList的方法:
add(class1,class2,…)在元素中新增一個或多個類名,若指定的類名已存在則不新增。 contains(class) 返回布林值,判斷指定的類名是否存在。
item(index) 返回類名在元素中的索引值,索引值從0開始,若索引值在區間範圍外則返回null;
remove(class1,class2,…) 移除一個或多個類名,若移除不存在的類名,也不會報錯;
toggle(class,true|false) 在元素中切換類名,第一個引數為要在元素中移除的類名,並返回false;若該類名不存在則會在元素中新增類名,並返回true;第二個是可選引數,是個布林值,用於設定元素是否強制新增或移除類,不管該類名是否存在。

var div1 = document.getElementsByTagName('div')[0];
div1.classList.add('one','two'); //一次新增多個類
div1.classList.add('three');//可以在後面追加
console.log(div1.classList.contains('one')); //true
console.log(div1.classList.length); //3

在這裡插入圖片描述

關於事件委託中的target的一些相關問題

經典問題:新增10個li標籤,給這10個li標籤新增點選事件
解決:動態新增li標籤,可以先建立一個臨時容器,先將li標籤新增到臨時容器中,再將臨時容器新增到DOM結構中,這樣就減少了DOM渲染;10個點選事件的新增使用事件委託,將點選事件繫結在父級元素上,利用事件冒泡的原理,以達到只繫結一個事件而能監聽到所有子級元素的目的,從而大大提升效能。

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>事件委託</title>
</head>
<body>
	<div>事件委託
		<ul id="list"></ul>
	</div>
	<script type="text/javascript">
		var Ul = document.getElementById('list');
		var flag = document.createDocumentFragment();//建立臨時容器
		var Li = null;
		for(var i=0;i<10;i++){
			Li = document.createElement('li');
			Li.innerHTML = "新增li " + (i+1);
			flag.appendChild(Li);
		}
		Ul.appendChild(flag);
		Ul.addEventListener('click',function(event){//點選事件繫結在li標籤的父級元素Ul上
			var e = event || window.event;
			var target = e.target || e.srcElement;
			if(target && target.nodeName.toLowerCase() == 'li'){ //通過target找到事件目標
				console.log('li');
			}
		})
	</script>
</body>
</html>

event.target和event.currentTarget區別:

event.target表示事件發生點選的元素;
this表示的是註冊點選事件的元素,this始終等於event.currentTarget;
若是直接將事件處理程式指定給了目標元素,則this、currentTarget和target包含相同的值。