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