請看代碼並思考輸出結果 對比答案 全部答對的同學,下文可不必閱讀,我相信你的基礎已經很扎實了^_^ 沒有答對也不要灰心,本文會鞏固你的基礎知識,後續會有系列的基礎回顧知識,以饗諸君! 緣由 相信只要從事開發的同學,不論前端後端或多或少的使用過javascript這門語言。但對其深入理解的我相信並不在 ...
請看代碼並思考輸出結果
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基礎知識也很少能看到有文章寫到,萬丈高樓始於平地,基礎的重要性我一直認為不比前端框架低。主要來源於JS權威指南、網路資料以及自己的一些“偏見”。
數據類型
JavaScript兩大類型:原始類型和對象類型
原始類型(primitive type)
null
undefined
string
number
boolean
五大原始類型:其中 null、undefined都是其類型的唯一成員,boolean成員只有true和false,number類型即為數值(js均以浮點型表示),string即為字元串類型(長度為16位),原始類型均為不可變類型,你無法改變數字1,也無法改變字元串h,更不可能將false改變成其它值,只有對象類型可變
對象類型(object type)
對象類型是屬性的集合,大部分的對象都包含屬性名、屬性值(數組對象可以看成為從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異常。
希望本文能對您有所收穫,祝好!