1.JS有兩種數(shù)據(jù)類型:
原始(基本)類型(primitive type)數(shù)字 字符串 布爾值 null undefined
對(duì)象類型(object type)
JS中不管是整數(shù)還是浮點(diǎn)數(shù) 都是數(shù)字這種類型 且都用浮點(diǎn)表示
數(shù)組 函數(shù)在JS中都屬于特殊的對(duì)象 擁有他們專用語法
2.JS在發(fā)生溢出 下溢 被零整除時(shí)不會(huì)報(bào)錯(cuò)
溢出(overflow) 即正數(shù)或負(fù)數(shù)超出JS能表示的最大最小值 最終計(jì)算結(jié)果用Infinity
或-Infinity
表示
下溢(underflow)當(dāng)一個(gè)數(shù)無限接近于0又超出JS能表示的范圍的時(shí)候 會(huì)發(fā)生下溢 此時(shí)最終計(jì)算結(jié)果用0表示
被零整除 運(yùn)算結(jié)果返回Infinity
或者-Infinity
當(dāng)零除以零的時(shí)候 返回NaN
表示非數(shù)字值
使用isNaN()
函數(shù)或者 x!=x
來判斷一個(gè)值是否為非數(shù)字 因?yàn)?code>NaN和任何值包括自己都不相等
3.字符串常用方法
s = 'Hello,world'
s.charAt(0) //=>H
s.subString(1,4) //=>ell(不包含索引為4的字符)
s.slice(1,4) //=>ell(效果同上)
s.slice(-3) //=>rld(類似于python 返回最后三個(gè)字符)
s.indexOf('l') //=>2 字符l首次出現(xiàn)的索引
s.lastIndexOf('l') //=>10 不解釋了
s.split(',') //=>['Hello', 'world'] 分割字符串 返回?cái)?shù)字
s.replace('H', 'h') //=>hello,world 全文字符替換
4.以下值在JS中會(huì)被視為false
稱為假值
undefined
null
''
NaN
0
-0
5.字符串和數(shù)字扁凛、布爾值并不是對(duì)象 但是卻可以調(diào)用諸如toString()
這樣的方法
這實(shí)際上是通過包裝對(duì)象new String()
等來創(chuàng)建一個(gè)臨時(shí)對(duì)象實(shí)現(xiàn)的 在方法調(diào)用結(jié)束后臨時(shí)對(duì)象會(huì)被銷毀
包裝對(duì)象和基本類型用==
運(yùn)算符會(huì)返回true
但是===
會(huì)返回false
6.利用Number()
局冰、Boolean()
、String()
雇庙、Object()
函數(shù)可以進(jìn)行顯式的類型轉(zhuǎn)換(不含new)
也可以用運(yùn)算符來進(jìn)行隱式類型轉(zhuǎn)換:
x + '' //=>轉(zhuǎn)換成字符串
+x //=>轉(zhuǎn)換為數(shù)字
!!x //=>轉(zhuǎn)換為布爾值
7.JS使用函數(shù)作用域
變量在聲明它們的函數(shù)體以及整個(gè)函數(shù)體嵌套的任意函數(shù)體內(nèi)都是有定義的
也就是說 只要函數(shù)體內(nèi)有這個(gè)變量 我就可以在函數(shù)體的任意位置使用它 變量在聲明之前甚至已經(jīng)可用
這特性被非正式的成為聲明提前
var scope = 'global';
function f() {
console.log(scope);// 輸出'undefined' 而不是'global'
var scope = 'local';
console.log(scope);// 輸出'local'
}
8.===
嚴(yán)格相等運(yùn)算符
比較過程中沒有類型轉(zhuǎn)換 注意以下特殊情況:
NaN
和任何值包括自己不相等 所以 NaN === NaN 返回false
如果兩個(gè)值都是null
或者 undefined
則返回false
9.&&
和 ||
稱為邏輯與和邏輯或
他們都擁有返回值(真值或者假值)
返回的值取決于其“短路“行為
例如對(duì)于邏輯與&&
如果左邊的表達(dá)式為假值 則直接返回左邊表達(dá)式的計(jì)算結(jié)果 如果左邊為真值 那么返回右邊表達(dá)式的結(jié)果
有時(shí)候會(huì)使用這種行為來做一些特殊的操作 例如:
if (a == b) stop();
(a == b) && stop();// 和上面相同
邏輯非沒有這種特性 它只會(huì)返回true
或者false
10.關(guān)于eval()函數(shù)
它接受一個(gè)參數(shù) 如果參數(shù)不是字符串 則直接返回這個(gè)參數(shù)
如果是字符串 則把其當(dāng)成JS代碼進(jìn)行編譯 如果編譯失敗則拋出一個(gè)語法錯(cuò)誤異常 否則開始執(zhí)行這段代碼
并返回最后一個(gè)表達(dá)式或語句的值 如果沒有值則返回undefined
用eval()
執(zhí)行的代碼 會(huì)使用調(diào)用它的變量環(huán)境作用域
如果執(zhí)行eval()
函數(shù)有一個(gè)局部變量x
那么eval('x = 2')
會(huì)改變這個(gè)局部變量的值
當(dāng)給eval()
函數(shù)賦予別名 并用別名調(diào)用時(shí) 會(huì)使用全局對(duì)象作為其上下文作用域 并且無法讀瞧甩、寫钉跷、定義局部變量和函數(shù)
var geval = eval;
var x = 'global';
function f(){
x = 'local';
geval('x += "changed"');
return x;
}
console.log(f(), x); //local globalchanged