var scope = 'global'; function f(){ console.log(scope); var scope = 'local'; console.log(scope); } f(); var a = []; console.log(a == 0,a == false); var b = [6]; console.log(b + 1,b-1); var c = {}; console.log(Boolean(c)==true);
所有答對的同窗,下文可沒必要閱讀,我相信你的基礎已經很紮實了^_^javascript
沒有答對也不要灰心,本文會鞏固你的基礎知識,後續會有系列的基礎回顧知識,以饗諸君!前端
相信只要從事開發的同窗,不論前端後端或多或少的使用過javascript這門語言。但對其深刻理解的我相信並不在多數,我看過不少同窗分享過的文章,說實話乾貨太少,本身的看法微乎其微,javascript基礎知識也不多能看到有文章寫到,萬丈高樓始於平地,基礎的重要性我一直認爲不比前端框架低。主要來源於JS權威指南、網絡資料以及本身的一些「偏見」。java
JavaScript兩大類型:原始類型和對象類型後端
null數組
undefined前端框架
string網絡
number框架
boolean函數
五大原始類型:其中 null、undefined都是其類型的惟一成員,boolean成員只有true和false,number類型即爲數值(js均以浮點型表示),string即爲字符串類型(長度爲16位),原始類型均爲不可變類型,你沒法改變數字1,也沒法改變字符串h,更不可能將false改變成其它值,只有對象類型可變spa
對象類型是屬性的集合,大部分的對象都包含屬性名、屬性值(數組對象能夠當作爲從0開始的有序屬性名),也就是名/值對,但函數是一個特殊的對象
常見的對象類型:
Array,Function,Math,Date,RegExp
值 | 轉換爲字符串 | 數字 | 布爾值 | 對象 |
undefined | "undefined" | NaN | false | throws TypeError |
null | "null" | 0 | false | throws TypeError |
true | "true" | 1 | new Boolean(true) | |
false | "false" | 0 | new Boolean(false) | |
"" | 0 | false | new String(「」) | |
"1.1" | 1.1 | true | new String(「1.1」) | |
"ccy" | NaN | true | new String(「ccy」) | |
0 | "0" | false | new Number(0) | |
-0 | "0" | false | new Number(-0) | |
NaN | "NaN" | false | new Number(NaN) | |
Infinity | "Infinity " | true | new Number(Infinity) | |
-Infinity | "-Infinity " | true | new Number(-Infinity) | |
1 | "1" | true | new Number(1) | |
{} | 對象先轉換原始值, 再有原始值進一步轉化 |
同左 | true | |
[] | 0 | true | ||
[6] | "6" | 6 | true | |
['a'] | 使用join()方法 | NaN | true | |
function(){} | "function(){}" | NaN | true |
JavaScript取值類型很是靈活,當指望使用一個布爾值時,你能夠提供任意類型值,JavaScript會根據須要自行轉換類型,字符串和數字也一樣如此,原始類型的可經過對應的包裝類轉化成對象類型,具體轉化請熟悉上表。理解類型轉換,文章開頭關於a,b,c的輸出也就不在話下了。
ES5時代JavaScript還不支持塊級做用域,聲明變量採用關鍵字var
以下所示:
var i; var ccy,name;
var m = 0, k = 1,n = 'bar';
var聲明的變量若是沒有賦予初始值,則默認爲undefined,變量可爲任意數據類型。
一個變量的做用域是程序源代碼中定義這個變量的區域。全局變量擁有全局做用於,在JavaScript中任何地方都是有定義的。然而在函數內聲明的變量只有在該函數體內有效,也就是局部變量,函數參數也是局部變量。
學過Java的同窗應該知道就近原則的說法,類變量與方法中的變量同名時在該方法或者構造函數體內類變量是會被其覆蓋掉,JavaScript也遵循這一原則。
var關鍵字存在聲明提早的bug,在非嚴格模式下不會報錯。由此文章開頭關於方法的輸出等價於
function f(){ var scope; console.log(scope); var scope = 'local'; console.log(scope); }
理解變量聲明及做用域,文章開頭的輸出亦不在話下了。
JavaScript是基於詞法做用域的語言,全局變量在程序中始終有定義,局部變量在聲明的函數題內以及其所嵌套的函數內始終是有定義的。
每段JavaScript代碼都有一個與之關聯的做用域鏈(scope chain),這個做用域鏈是一個對象列表或鏈表,這組對象定義了這段代碼的「做用域中」的變量,當須要查找變量X的值時(變量解析),它會從鏈中的第一個對象開始查找,如有則直接使用,若沒有則向上查找,以此類推,若做用域鏈不存在X則拋出ReferenceError異常。
但願本文能對您有所收穫,祝好!