這兩周主要看的第一部分非凌。第一部分由5章組成,現(xiàn)看到第一部分的第四章完結(jié)。做一下讀書筆記總結(jié)韧掩。
第一章 類型
具體細(xì)節(jié):
JavaScript有7種內(nèi)置類型:空值(null)、未定義(undefined)旭等、布爾值(boolean)酌呆、數(shù)字(number)、字符串(string)搔耕、對(duì)象(object)隙袁、符號(hào)(symbol,ES6中新增)弃榨。除對(duì)象之外菩收,其他統(tǒng)稱為“基本類型”。
我們可以用typeof運(yùn)算符來查看值的類型鲸睛,它返回的是類型的字符串值娜饵。
e.g.
typeof undefined === "undefined"; //true
typeof true === "boolean";//true
typeof 42 === "number";//true
typeof "42" === "string";//true
typeof {life:42} === "object";//true
typeof Symbol === "symbol";//true
利用符合條件檢測(cè)null 值的類型;
var a=null;
(!a && typeof a=== "object"); //true
null是“假值”腊凶,也是唯一一個(gè)用typeof檢測(cè)返回“object”的基本類型值划咐。
typeof function a(){} === "function";//true
typeof [1,2,3] === "object";//true
函數(shù)、數(shù)組都是object的一個(gè)“子類型”钧萍。函數(shù)對(duì)象的length屬性是其聲明的參數(shù)的個(gè)數(shù)褐缠。數(shù)組的length屬性是其元素的個(gè)數(shù)。
JavaScript中的變量是沒有類型的风瘦,只有值才有队魏。變量可以隨時(shí)持有任何類型的值。
e.g.
typeof typeof 42万搔;//"string"
typeof 42首先返回字符串"number",然后typeof "number" 返回"string"胡桨。
已在作用域中聲明但還沒有賦值的變量,是undefined的瞬雹。還沒有在作用域中聲明過的變量昧谊,是undeclared的。
e.g.
在程序中檢查全局變量DEBUG不出現(xiàn)ReferenceError錯(cuò)誤的方法:
1.if(typeof DEBUG !== "undefined"){}
2. if(window.DEBUG){}
瀏覽器中的全局對(duì)象是window酗捌,訪問不存在的對(duì)象屬性(甚至是全局對(duì)象window上)不會(huì)產(chǎn)生ReferenceError錯(cuò)誤呢诬。
3.“依賴注入”(dependency injection)設(shè)計(jì)模式,將依賴通過參數(shù)顯示地傳遞到函數(shù)中胖缤。
e.g.
fucntion doSomethingCool(FeatureXYZ){
var helper = FeatureXYZ || function (){};
var val = helper();
}
第2章 值
具體細(xì)節(jié):
使用delete運(yùn)算符可以將單元從數(shù)組中刪除尚镰,但是請(qǐng)注意,單元?jiǎng)h除后哪廓,數(shù)組的length屬性并不會(huì)發(fā)生變化狗唉。
在創(chuàng)建“稀疏”數(shù)組(sparse array,即含有空白或空缺單元的數(shù)組)時(shí)要特別注意:
e.g.
var a =[];
a[0] =1;
a[2] =[3];
a[1];//undefined
a.length;//3
a[1]的值為undefined涡真,但這與將其顯式賦值為undefined(a[1]=undefined)還是有所區(qū)別分俯。
數(shù)組通過數(shù)字進(jìn)行索引肾筐,但它們也是對(duì)象,所以也可以包含字符串鍵值和屬性(但這些并不計(jì)算在數(shù)組長(zhǎng)度內(nèi))澳迫。
e.g.
var a=[];
a[0]=1;
a["foobar"]=2;
a.length;//1
a["foobar"];//2
a.foobar;//2
如果字符串鍵值能夠被強(qiáng)制類型轉(zhuǎn)換為十進(jìn)制數(shù)字的話局齿,它就會(huì)被當(dāng)作數(shù)字索引來處理。
e.g.
var a=[];
a["13"]=42;
a.length;//14
在數(shù)組中加入字符串鍵值/屬性并不是一個(gè)好主意橄登。建議使用對(duì)象來存放鍵值/屬性值,用數(shù)組來存放數(shù)字索引值讥此。
有時(shí)需要將類數(shù)組(一組通過數(shù)字索引的值)轉(zhuǎn)換為真正的數(shù)組拢锹。工具函數(shù)slice()經(jīng)常被用于這類轉(zhuǎn)換:
function foo(){
var arr = Array.prototype.slice.call(arguments);
are.push("bam");
console.log(are);
}
foo("bar", "baz");//["bar","baz","bam"]
用ES6中的內(nèi)置函數(shù)工具Array.from()也能實(shí)現(xiàn)同樣的功能:
var arr = Array.from(arguments);
字符串反轉(zhuǎn):
var a="foo";
var c = a
//將a的值轉(zhuǎn)換為字符數(shù)組
.split("")
//將數(shù)組中的字符進(jìn)行倒轉(zhuǎn)
.reverse()
//將數(shù)組中的字符拼接回字符串
.join("");
c;//"oof"
這種方法對(duì)簡(jiǎn)單的字符串完全適用,對(duì)于包含(Unicode萄喳,如星號(hào)卒稳、多字節(jié)字符串等)的字符串并不適用。
JavaScript中的數(shù)字常量一般用十進(jìn)制表示他巨。
e.g.
var a=42充坑;
var b=42.3;
數(shù)字前的0可以省略:
var a=0.42染突;
var b=.42捻爷;
小數(shù)點(diǎn)后小數(shù)部分最后面的0也可以省略:
var a=42.0;
var=42.份企;
42.這種寫法沒問題也榄,只是不常見,但從代碼可讀性考慮司志,不建議這樣寫甜紫。
對(duì)于.運(yùn)算符需要給予特別注意,因?yàn)樗且粋€(gè)有效的數(shù)字字符骂远,會(huì)被優(yōu)先識(shí)別為數(shù)字常量的一部分囚霸,然后才是對(duì)象屬性訪問運(yùn)算符。
//無效語法:
42.toFixed(3);//SyntaxError
//下面的語法都有效:
(42).toFixed(3);//"42.000"
0.42.toFixed(3);//"0.420"
42..toFixed(3);//"42.000"
二進(jìn)制浮點(diǎn)數(shù)最大的問題(不僅JavaScript激才,所有遵循IEEE 754規(guī)范的語言都是如此)拓型,是會(huì)出現(xiàn)如下情況:
0.1 + 0.2 === 0.3;//false
最常見的方法是設(shè)置一個(gè)誤差范圍值贸营,通常稱為“機(jī)器精度”(machine epsilon)吨述,對(duì)JavaScript的數(shù)字來說,這個(gè)值通常是2^-52(2.230446049250313e-16)钞脂。
從ES6開始揣云,該值定義在Number.EPSILON中,我們可以直接拿來用冰啃,也可以為ES6之前的版本寫polyfill:
if (Number.EPSILON){
Number.EPSILON = Math.pow(2, -52);
}
可以使用Number.EPSILON來比較兩個(gè)數(shù)字是否相等(在指定的誤差范圍內(nèi)):
function numbersCloseEnoughToEqual(n1,n2){
return Math.abs(n1-n2) < Number.EPSILON;
}
var a=0.1+0.2;
var b = 0.3;
numbersCloseEnoughToEqual(a,b);//true
numbersCloseEnoughToEqual(0.0000001,0.0000002);//false
整數(shù)檢測(cè)
if(!Number.isInteger){
Number.isInteger=function(nun){
return typeof num ="number" && num %1==0;
};
}
檢測(cè)一個(gè)值是否是安全的整數(shù)
if(!Number.isSafeInteger){
Number.isSafeInteger=function(nun){
return Number.isSafeInteger(nun) && Math.abs(nun) <=Number.MAX_SAFE_INTEGER;
};
}
undefined類型只有一個(gè)值邓夕,即undefined刘莹。null 類型也只有一個(gè)值,即null焚刚。
e.g.
null 指空值(empty value)
undefined指沒有值(missing value)
或者
undefined 指從未賦值
null指曾賦過值点弯,但是目前沒有值
null 是一個(gè)特殊關(guān)鍵字,不是標(biāo)識(shí)符矿咕,我們不能將其當(dāng)作變量來使用和賦值抢肛。然而undefined卻是一個(gè)標(biāo)識(shí)符,可以被當(dāng)作變量來使用和賦值碳柱。