數(shù)組茸塞,字符串,數(shù)字是程序的基本組成部分描沟,但也有你不知道的另一面。
數(shù)組
數(shù)組可以容納任何類型的值鞭光。
- 稀疏數(shù)組
var a = [];
a[0] = 1;
a[2] = 3;
a[1] // undefined
a.length; // 3
數(shù)組通過數(shù)字進(jìn)行索引吏廉,數(shù)組也是對(duì)象,所以也可以包含字符串鍵值和屬性惰许。
var a = [];
a[0] = 1;
a['foobar'] = 2;
a.length; //2
a.foobar //2
a['13'] = 42;
a ; //(14)[1, empty × 12, 42, foobar: 2]
- 類數(shù)組
類數(shù)組席覆,就是一組可以通過數(shù)字索引的對(duì)象⌒诼颍可以通過Array.prototype.slice.call(arguments) //返回一個(gè)數(shù)組副本
ES6的Array.from同樣可以實(shí)現(xiàn)佩伤,Array.from(arguments);
字符串
字符串 VS 字符串?dāng)?shù)組
var a = 'foo';
var b = ['f','o','o'];
字符串,字符串?dāng)?shù)組是兩碼事晦毙,字符串也有l(wèi)ength屬性以及indexOf()生巡,concat()方法。
字符串是類數(shù)組见妒。
字符串也可以借用數(shù)組的方法達(dá)到變更自己的目的孤荣。
var a = 'foo'
var b = Array.prototype.join.call(a,'-')
b //"f-o-o"
字符串的反轉(zhuǎn)(面試常見問題)
var a = 'foo'
//將字符串轉(zhuǎn)換為數(shù)組,反轉(zhuǎn),再轉(zhuǎn)換為字符串
Array.from(a).reverse().join('') // oof
a.split("").reverse().join("") //oof
join方法盐股,是將字符串?dāng)?shù)組轉(zhuǎn)化為字符串钱豁。
split()方法是將字符串分割,轉(zhuǎn)化為數(shù)組疯汁。
數(shù)字
javascript沒有真正意義上的整數(shù)牲尺,10.0等同于10。
0Xf3; //243的十六進(jìn)制幌蚊,javascript嚴(yán)格模式下將不支持
0363; //243的八進(jìn)制
0.1+0.2 === 0.3 // false
0.1+0.2 //0.30000000000000004
0.1+0.2 > 0.3 //true
0.1 + 0.2 - 0.3 = 5.551115123125783e-17
5.551115123125783e-17.toFixed(20) //"0.00000000000000005551"
Math.pow(2,-52) //表示2的-50次冪谤碳,就等于Number.EPSILON
ES6引入了Number.EPSILON,它的值是2.220446049250313e-16霹肝。表示1與大于1的最小浮點(diǎn)數(shù)之間的差估蹄。其實(shí)就是JavaScript能夠表示的最小精度,目的是為浮點(diǎn)數(shù)設(shè)置一個(gè)誤差范圍沫换。
//誤差檢查函數(shù)
function withinErrorMargin (left, right) {
return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2);
}
withinErrorMargin(0.1 + 0.2, 0.3) //true
ES6的Number.isInteger()方法檢測(cè)一個(gè)值是否為整數(shù):
Number.isInteger( 42 ); // true
Number.isInteger( 42.000 ); // true
Number.isInteger( 42.3 ); // false
特殊數(shù)值
不是值的值:
undefined臭蚁,從未賦過值
null,空值
表達(dá)式void _沒有返回值讯赏,返回結(jié)果是undefined垮兑。void并不改變表達(dá)式的結(jié)果,只是讓表達(dá)式不返回值漱挎。
var a = 42;
console.log(void a, a); //undefined 42
void 0; // undefined
按照慣例用void 0來獲取undefine(這源自C語言系枪,void true或者void 表達(dá)式也是可以的)。void 1磕谅,void 1和undefined之間沒有實(shí)質(zhì)區(qū)別私爷。
不是數(shù)字的數(shù)字NaN
NaN,不是一個(gè)數(shù)字膊夹,”無效數(shù)值“衬浑,”失敗數(shù)值“,”壞數(shù)值“
NaN是一個(gè)警戒值放刨,用于指出數(shù)字類型中的錯(cuò)誤情況工秩,”執(zhí)行數(shù)學(xué)運(yùn)算沒有成功,這是失敗返回后的結(jié)果“进统。
var a = 2 / 'foo'; //NaN
var b = 'foo';
isNaN(a) //true
isNaN(b) //true-------------暈【這是個(gè)bugV摇!C椤眉菱!】
判斷一個(gè)變量是不是NaN,方法isNaN(a); // 檢查參數(shù)是否不是NaN掉分,也不是數(shù)字倍谜。
可以利用NaN是javascript中唯一一個(gè)不等于自身的值
判斷兩個(gè)值相等
ES6新增的方法Object.is()來判斷絕對(duì)相等迈螟。
但是== 和 === 的效率要比Object.is()的效率要高,所以盡可能使用前者尔崔。
值的引用
javascript中簡單值(基本類型)總是通過值復(fù)制方式來賦值/傳遞答毫,null,undefined季春,string洗搂,number,boolean载弄,symbol耘拇。
復(fù)合值(對(duì)象和函數(shù),數(shù)組)是通過引用復(fù)制來賦值/傳遞宇攻。
引用指向的是值本身惫叛,而不是變量,所以一個(gè)引用無法更改另一個(gè)引用的指向逞刷。
var a = [1,2,3];
var b = a;
b = [4,5,6];
a //[1,2,3]
b //[4,5,6]
出個(gè)題:
function foo(x){
x.push(4);
console.log(x); //[1,2,3,4]
x = [4,5,6];
x.push(7);
console.log(x); //[4,5,6,7]
}
var a = [1,2,3];
foo(a);
console.log(a) //[1,2,3,4]
函數(shù)參數(shù)x實(shí)際上將引用a的副本賦值給x嘉涌,a指向仍然是[1,2,3]。通過引用x更改了數(shù)組的值夸浅,后又將x指向另外一個(gè)數(shù)組[4,5,6]仑最。
a.slice()//不會(huì)改變當(dāng)前數(shù)組,返回一個(gè)淺副本