[課程筆記]克服JS的奇怪部分-CH6 雜談

Udemy課程連結
課程總目錄

本篇筆記目錄:

U1 初始化
U2 「typeof」、「instanceof」與搞清楚這是什麼
U3 嚴謹模式

U1 初始化

初始化資料

var people=[
	{
		//the 'john' object
		firstname:'John',
		lastname:'Doe',
		addresses:[
			'111 Main St.',
			'222 Third st'
		]
	},
	{	//the 'jane' object
		firstname:'Jane',
		lastname:'Doe',
		addresses:[
			'111 Main St.',
			'222 Third st'
		]
	}
]

不要被嚇到,這很簡潔,也很有效的初始化資料,這也對做出原型很有幫助,所以當你打造一些軟體,還沒串接到資料庫或API時,你可以輕易的做出假資料供介面使用,當你準備好後,你可以讓物件得到資料,像是透過API拿到json資料,而你的介面也準備好面對此類型的資料了。

當你在用這樣大量的初始化時,逗號是最容易忘記的,你很容易看到錯誤訊息像 unexpected token 、unexpected string or number,這表示語法解析器發現一些特定錯誤,看到一些沒預料到的東西,像是漏掉逗號,他沒有預期到會用大括號開頭,所以它會顯示unexpected。

另外一個常犯的錯誤是將firstname:'John'寫成firstname='John',你就會再次得到 unexpected token。


U2 「typeof」、「instanceof」與搞清楚這是什麼

我們已經看到JavaScript的動態型別,讓我們可以做一些有趣的事,但也可能有點危險,如果我有個變數,而你想要知道它的型別,JavaScript 的確有一些功能幫助我們做到,但不完美。

var a=3;
console.log(typeof a);
//number

var b="3";
console.log(typeof b);
//string

var c={};
console.log(typeof c);
//object

var z=function(){};
console.log(typeod z);
//function

上面都很正常,下面會看起來有一點奇怪

var d =[];
console.log(typeof d);
//object

console.log(Object.prototype.toString.call(d)); 
//[object Array]

當我對陣列用typeof, 我會得到object,這不是很有用。這時候就必須使用 Obejct 的原型來做驗證,在基本物件上(object),有個toString屬性在它的原型上,我們可以用 .call.call 會呼叫.tostring這個函數,然後告訴他d要指向哪裡,所以我們可以用這個方法知道他是陣列

接著我們來看 Person 函數建構子

function Person(name){
	this.name=name;
}

var e =new Person('Jane');
console.log(typeof e)
//object

Instanceof

console.log(e instanceOf Person)
//true

這裡有另一個關鍵字叫作instanceof,A instance of B 可以用來判斷 A 是否為 B 的實例,這告訴我物件是否在原型鏈上,如果有的話我可以找到 Person 物件,第一個參數是它的instance,所以e會回傳true,我們可以在原型鏈上找到person,當你想要知道傳入的東西之型別時instanceof很有用

undefined、null

console.log(typeof undefined);
//undefined
console.log(typeof null);
//object

undefined不是任何東西 所以它的型別就是undefined,這蠻合理的,最後一個東西是JavaScript的萬年bug,如果你試著在typeof後面接一個null的東西,你會得到一個物件,我知道這很可怕 但這是個bug,已經太久了,所以不能修正了。


U3 嚴謹模式

JavaScript對於許多事情蠻自由的,既然很有彈性,那有時候就缺少一些規範,嚴謹模式(strict mode)可以幫你避免某些情況的錯誤

var person;
persom={};
console.log(persom);

//Object{}

persom 在全域物件上 window.persom.,這可能會產生一些很怪的錯誤,JavaScript給你選擇,你可以告訴引擎要嚴謹一點

"use strict"

var person;
persom={};
console.log(persom);

//persom is not defined

use strict 用更多的規範檢查程式碼,它一定要在檔案最上面,或是函數最上面,你可以讓一個函數使用嚴謹模式,讓一個新的執行環境是嚴謹模式

要注意的是,不是每個JavaScript引擎的嚴謹模式都一樣,所以這是額外的 你不能百分之百依賴他!