摘要:如果為假值,不傳或者傳入,函數都會返回但是,傳入這個值是完全有可能的,所以這種判斷形勢是不正確的或者使用來判斷也可以原始類型優于封裝類型對象擁有六個原始值基本類型布爾值,數字,字符串,,和對象。
作為一個前端新人,多讀書讀好書,夯實基礎是十分重要的,正如蓋樓房一樣,底層穩固了,才能越壘越高。從開始學習到現在,基礎的讀了紅寶書《JavaScript高級程序設計》,犀牛書《JavaScript權威指南》,特別是紅寶書,是把我領進js領域的一本書?,F在到了進階階段(可能紅寶書還會回去繼續翻),準備開始讀《Effective JavaScript》,剛拿到手,很薄的一本書,也把讀書筆記整理下來,希望養成一個良好的讀書習慣。
讓自己習慣JavaScript 了解JavaScript的版本目前主流JavaScript版本任然是ES5,在ES5開始引入嚴格模式
use strict;//在文件頭或者函數體頂部使用,就是嚴格模式
一般來說,我們如果想編寫一個通用型插件,都需要使用嚴格模式來進行開發,但是在使用嚴格模式開發時會出現一個問題,工程先后引入兩個文件file1.js和file2.js,file1.js使用的嚴格模式進行開發,file2是非嚴格模式,那么下面的代碼會出問題。
// 這么引入兩個文件,file2也會按照嚴格模式運行,那么如果file2.js出現了非嚴格模式的行為,程序就會報錯 因此,在嚴格模式下開發通用插件的時候需要注意這個問題
解決辦法:使用立即執行函數IIFE進行開發。
(function(){ "use strict"; function foo(){ //你的插件內容 } })();理解JavaScript浮點數
JavaScript中只有一種數值類型,無論是整數還是浮點數,都被表示為Number類型,可以使用typeof關鍵字查看它們。
typeof 17.2;//"number" typeof 26;//"number"
JavaScript中的浮點數是不精確的JavaScript之中所有的數字類型都是雙精度浮點數,整數也可以用雙精度浮點數來表示,如JavaScript之中所能表示的整數范圍是(2e-53~2e53).
其中最著名的例子就是:0.1+0.2;//0.30000000000000004
當心隱式的強制轉換JavaScript中的數字類型在表示浮點數上不一定精確,使用時要慎重
終于到了JavaScript強大的飲食轉換了,先來看一個簡單的例子
(([][[]]+[])[+!![]]+([]+{})[!+[]+!![]]).toUpperCase();
猜猜上面的代碼的結果是什么?答案是:NB,沒錯,JavaScript就是這么NB。根本毫不相關的東西,這也正是體現了JavaScript隱式轉換的強大之處,感興趣的可以百度一下上面為什么會出現這樣的結果。
隱式轉換的一些原則
布爾型與數字類型相互轉換
其中,true對應1,false對應0.
3+true; // 4 while(1){ //相當于while(true) //無限循環 }
字符串與數字相互轉換
在這里不得不提的就是JavaScript對運算符加號“+”的重載,JavaScript的加號不僅可以進行數字相加,還可以進行字符串的拼接工作,還可以進行數字與字符串的隱式轉換工作。例如下面的幾行代碼
2 + 3; // 5 "hello" + " world";// "hello world" 2 + "3"; // "23" // 這里還有個十分重要的,數字字符串之前如果只存在一個加號,會將字符串隱式轉換成數字類型 +"3";// 3 +"3fsdf"; //NaN 1+(+"3");// 4,必須有括號,否則JavaScript會把兩個加號編程自加運算,從而報錯表達式不合法 // 需要注意的是,對于加法來說,隱式轉換的優先級字符串高于數字類型,而位運算和乘法除法運算數字類型高于字符串類型 "17" * 3; // 51 "8" | "1";// 9
強制轉換的隱藏錯誤
null會在運算中隱式轉換成0 一個未被定義的變量(undefined)會被隱式轉換成浮點類型的NaN。 //關于NaN的幾點注意 var x = NaN; x === NaN;//false isNaN(NaN);// true //但是isNaN對于其他不是浮點類型的數來說,也會隱式轉換成NaN,因此這個API存在問題 isNaN("string");//true isNaN(undefined);//true isNaN({});//true //因此如果想判斷是不是正正的NaN,我們可以寫一個函數來判斷 function isReallyIsNaN(number) { return number !=== number; //利用NaN不等于自身這一特性 }
對象的隱式轉換
默認來說,對象也會被隱式轉換成字符串
"the Math object: "+ Math;//"the Math object: [object Math]",Math對象被隱式轉換為字符串 // valueOf方法是真正為那些代表數值的對象(Number)而設計的 var obj = { toString: function() { return "[object Object]"; }, valueOf : function() { return 26; } } "the obj true value is:"+obj;//"the obj true value is:26",
真值運算
JavaScript中的邏輯運算if、||和&&理論上是可以接受任何值的,因為JavaScript中
所有類型都會在邏輯運算中轉換成布爾值
JavaScript中有7個假值:false、0,-0、""、NaN、null、undefined
由于數字和字符串可能為假值,所以,使用針織運算檢查函數參數或者對象屬性是否已經存在不是絕對安全的。
function point(x){ if(!x){ return 26;//如果x為假值,不傳或者傳入0,函數都會返回26 } } point(0);//x:26 //但是,傳入0這個值是完全有可能的,所以這種判斷形勢是不正確的 function point(x){ if(typeof x === "undefined"){ return 26; } //或者使用if(x === undefined)來判斷也可以 }原始類型優于封裝類型
JavaScript對象擁有六個原始值基本類型: 布爾值,數字,字符串,null,undefined和對象。
創建原始類型與創建基本類型需要注意的是,使用typeof對null判斷得到的結果是"object",ECMAScript標準描述null是一個獨特的類型
//創建一個String對象,內部封裝一個字符串值 var s = new String("hello"); s + " world";// "hello world" //創建一個原始類型 var str = "string"; //封裝類型本質是一個對象,原始類型才是基本類型,可以使用typeof來查看 typeof s;// "object" typeof str;// "string" //由于封裝類型自身是一個對象,因此即使內部封裝的值相同,兩個對象也是不相等的 var s1 = new String("string"); var s2 = new String("string"); s1 === s2;//false s1 == s2;//false
總體來講,一般不需要使用封裝類型來代替基本類型,因為基本類型無論是從聲明還是使用都較為方便。而且,基本類型本身是沒有任何方法的,不過可以隱式轉換成String對象來執行其內部方法:
var s = "hello";//基本類型 s.toUpperCase();//HELLO,將s隱式轉換成String對象
【注】隱式封裝的類型有一點需要特別注意:每一次隱式封裝都會產生一個新的String對象,原來的對象會被拋棄,也就是說新產生的隱式封裝對象生命周期就是所在行代碼執行完成。
"string".value = 26; "string".value;//undefined 第二行代碼隱式封裝形成了新的String對象,新的String對象內部沒有value這個屬性值,因此是undefined
避免對回合類型使用 == 運算符對JavaScript原始類型值設置屬性是沒有意義的
由于JavaScript隱式轉換的存在,因此,在使用 == 運算符的時候,有時候可能不會得到我們所預期的結果。
"1.0e0" == { valueOf: function(){ return true } }; //結果是true,因為右側valueOf結果是true,會被隱式轉換成數字1,根據隱式轉換法則,左側字符串也會被隱式轉換成1,因此比較是相等的。
// 使用==運算符比較時一些特殊情況 null == undefined;//true,這種情況永遠是true null/undefined == string/number/boolean;//false,這種情況永遠是false string/number/boolean == string/number/boolean;// 將原始類型轉換為數字進行比較 string/number/boolean == Date對象;// 先將原始類型轉化成數字,再將date類型轉化成原始類型(優先嘗試toString,其次嘗試valueOf) string/number/boolean == 非Date對象;// 先將原始類型轉化成數字,再將date類型轉化成原始類型(優先嘗試valueOf,其次嘗試toString)
// 關于Date對象比較問題
var date = new Date("1993/07/11"); date == "1993/07/11";//false
這是因為Date對象調用toString方法之后轉換的不是我們所熟知的字符串形式。
在瀏覽器中調用date.toString(),結果是"Sun Jul 11 1993 00:00:00 GMT+0800 (中國標準時間)"
//將Date類型字符串轉換成我們定義格式的字符串 function toYMD(date){ var y = date.getYear() + 1, m = date.getMonth() + 1, d = date.getDate(); return y + "/" + (m < 10 ? "0" + m : m) + "/" + (d < 10 ? "0" + d : d); } toYMD(new Date("1993/07/11")); //"1993/07/11"
了解分號插入的局限在比較的時候,最好使用嚴格相等運算符 ===,這是一個良好的習慣
JavaScript語法對于分號沒有硬性的規定,其語言機制自身會自動添加分號而區分開語句,了解分號插入的規則,對于提高JavaScript代碼的嚴謹性有著巨大的幫助。
分好僅在 } 標記之前、一個或多個換行符之后和程序的輸入結尾被插入換而言之,我們只可以在一行、一個代碼塊和一段程序結束的地方省略分號,其他任何地方省略分好都有可能出現錯誤。
function foo1(r){ r += r; return r };//合法 function foo2(r){ r += r return r };//不合法分好僅在隨后的輸入標記不能被解析時插入
換句話說,分好是JavaScript為我們提供的一種錯誤校正機制
a = b (f()); // 上面這段代碼會被解析成 a = b(f());//這是一條合法語句 a = b f();//下面這段代碼會被解析成兩條獨立的語句,因為 a = b f()是不合法的語句
換句話說,其實JavaScript只是為我們機械化的解決了語法問題而已,如果解析不合法,就會為我們通過插入分號來解決問題,但是,可能不是我們所預期的,因此,規范化的代碼才是重中之重,盡量不要省略分號。
另一個比較重要的情況是:return語句,在return關鍵字和其可選參數之間一定不可以包含換行符。
return {}; //一條語句,返回一個空對象 return {}; //上面語句等價于 return ; {} ; 也就是會自動在return后面的換行符前插入一個分號
另外一種特殊情況就是++運算符和--運算符
a ++ b; //會被解析成 a; ++b;
分號不會作為分隔符在for循環空語句的頭部被自動插入在return、throw、break、continue、++、--的參數之前不可以換行
也就是說,for循環體內必須顯式的包含分號,否則會出錯
for(var i = 0, total = 1 // 解析出錯 i < n i++)視字符串為16位的代碼單元序列
幾種流行的Unicode編碼:utf-8、utf-16、utf-32
JavaScript字符串是由16位代碼單元組成,而不是由Unicode代碼點組成
JavaScript使用兩個代碼單元表示2e16及以上的Unicode代碼點。這兩個代碼單元被稱為代碼對。
代理對甩開了字符串元素計數,length、charAt、charCodeAt方法以及正則表達式模式受到了影響
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/89723.html
摘要:盡可能的使用局部變量,少用全局變量。正確的實現就是在函數體內部使用將聲明成局部變量。在新特性中,引入了塊級作用域這個概念,因此還可以使用,來聲明局部變量。它們共享外部變量,并且閉包還可以更新的值。 變量作用域 作用域,對于JavaScript語言來說無處不在,變量作用域,函數作用域(運行時上下文和定義時上下文),作用域污染等等都跟作用域息息相關,掌握JavaScript作用于規則,可以...
摘要:第條盡量少使用全局對象避免聲明全局變量盡量聲明局部變量避免對全局變量增加屬性第條始終聲明局部變量第條避免使用語句第條熟練使用閉包的函數值包含了比調用他們時執行所需要的代碼還要更多的信息。那些在其所涵蓋的作用域內跟蹤變量的函數稱為閉包。 書還沒看完。一遍看,一遍寫讀書筆記。 這本書的序是JavaScript之父Brendan Eich寫的,作者是JavaScript標準化委員會專家??上?..
摘要:模式的讀書筆記,個人向更新進度隨我的閱讀進度基本技巧盡量少用全局變量防止變量污染注意變量提升問題盡量使用單一模式,只使用一個在函數頂部進行變量聲明函數體循環優化循環條件優化對進行操作上面那種循環,將作為循環條件,每次循環時都要訪問數據的長度 《JavaScript模式》的讀書筆記,個人向!更新進度隨我的閱讀進度 基本技巧 盡量少用全局變量 防止變量污染 注意JS變量提升問題 盡量使用...
閱讀 1660·2021-09-28 09:35
閱讀 1131·2019-08-30 15:54
閱讀 1656·2019-08-30 15:44
閱讀 3363·2019-08-30 14:09
閱讀 488·2019-08-29 14:05
閱讀 2661·2019-08-28 17:53
閱讀 1978·2019-08-26 13:41
閱讀 1710·2019-08-26 13:26