[課程筆記]克服JS的奇怪部分-CH6 雜談
本篇筆記目錄:
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引擎的嚴謹模式都一樣,所以這是額外的 你不能百分之百依賴他!