目錄
1.數(shù)值
2.字符串
3.布爾值
4.undefined和null
5.對象
6.數(shù)組
7.函數(shù)
8.類型轉(zhuǎn)換
1.數(shù)值
- 數(shù)值表示:整數(shù)嘱函;小數(shù)纯衍;科學(xué)計數(shù)法亲怠;各種進(jìn)制
123//123
123E3//123000
1.222//1.222
- 數(shù)值的進(jìn)制
111//十進(jìn)制111
0b111//二進(jìn)制7
0o111//八進(jìn)制73
0x111//十六進(jìn)制273
- NaN:表示Not a Number,不是一種獨立的數(shù)據(jù)類型婶溯,而是一種特殊數(shù)值间景,它的數(shù)據(jù)類型依然屬于Number佃声,只不過數(shù)值計算時不符合計算法則
0/0//NaN
Math.sqrt(-5)//NaN
判斷NaN的方法
isNaN(NaN) // true
isNaN(123) // false
【注意】該方法只對數(shù)值有效,傳入其他值先會轉(zhuǎn)為NaN倘要,最后返回true
2.字符串
- 字符串的定義
字符串是由空字符或多個字符組合在一起的字符集合圾亏,使用時必須放在引號中,建議統(tǒng)一使用雙引號封拧,一方面既能夠和HTML語言的屬性值統(tǒng)一風(fēng)格志鹃,又能夠在在后面的JSON中匹配語法風(fēng)格的煩惱
var a="hello world"
var b='hello javascript'
- 使用'+'連接多個字符串
- 轉(zhuǎn)義字符
轉(zhuǎn)義字符是指通過反斜杠""能夠使得一些特殊字符還原成原來的意義
常見的有:
\t -> 制表符
\n -> 換行符
' -> '
" -> "
\ ->
\0 ->null
- 字符串與數(shù)組
可以使用數(shù)組的下標(biāo)去讀字符串中的特定字符,但不可以修改字符串泽西,并且下標(biāo)超過字符串長度時返回undefined
- 字符串的屬性與方法
- length屬性:返回字符串中的字符數(shù)目
var a="hello world"
console.log(a.length)//11
- split方法:把字符串分割為字符串?dāng)?shù)組
var a="1234";
a.split("")//["1","2","3","4"]
3.布爾值
布爾值存在true和false兩種值狀態(tài)曹铃,出現(xiàn)布爾值的場景有:
邏輯運算(&& || !)
相等運算(=== === == 捧杉!==)
比較運算(>∩录>=∶匮< <=)
部分語句:條件語句和循環(huán)語句
【注意】y以下值均返回false
4.undefined和null
null是一個表示"無"的對象评甜,轉(zhuǎn)為數(shù)值時為0灰粮;
undefined是一個表示"無"的原始值,轉(zhuǎn)為數(shù)值時為NaN忍坷。
也就是說:關(guān)于null和undefined的使用場景粘舟,object初始化時最好使用null,而基本數(shù)據(jù)類型最好使用undefined ,但是二者在本質(zhì)上是沒有區(qū)別的,是JS的一個bug!
5.對象
object:所謂對象承匣,就是一種無序的數(shù)據(jù)集合蓖乘,由若干個“鍵值對”(key-value)構(gòu)成
- 對象的創(chuàng)建方法
// 方法1
var hero={
name: teren;
age: 18;
skill: battle;
}
// 方法2
hero = new Object();
hero.name="teren";
hero.age="18";
hero.skill="battle";
//方法3
function hero(name,age,skill){
this.name=name;
this.age=age;
this.skill=skill;
}
var AmericanCaptain=new hero("teren",18,"battle")
console.log(AmericanCaptain)
- 創(chuàng)建對象的屬性并賦值/對象屬性的引用與修改
//創(chuàng)建對象的屬性并賦值
var hero={}
hero.name="teren";
hero.age=18;
hero["skill"]="battle";
hero["nickname"]="stone"
hero.height="";
console.log(hero)
//對象屬性的引用與修改
hero.name;
hero["age"];
hero.height=180
- 創(chuàng)建對象的方法
//創(chuàng)建對象的方法
function person(name,age){
this.name=name;
this.age=age;
this.changeName=changeName;
function changeName(name){
this.name=name;
}
}
var myMother = new person("sunny",18);
// console.log(myMother)
myMother.changeName("windy")
console.log(myMother.name)
【注】
鍵名本質(zhì)上都是字符串锤悄,實際創(chuàng)建鍵名時可以省略引號韧骗,但是為了符合JSON的語法規(guī)范,建議用上雙引號零聚,此外在使用objectName["propertyName"]必須加上引號
- 檢查屬性是否在對象中的方法
var hero = {
"name" : "teren",
"age" : 18
}
"name" in hero//true
"skill" in hero//false
【小應(yīng)用】
有這么個需求:如何檢驗一個變量是全局變量
基本知識:
- 全局變量是window的屬性
- 屬性未聲明而直接引用不報錯袍暴,而顯示undefined,但變量未聲明而使用就報錯
a//a is not defined
window.a//undefined
//檢測一個變量是否為全局變量
if (window.a === undefined){
console.log("a是全局變量")
}
- 對象的遍歷
var hero = {
"name" : "teren",
"age" : 18,
"skill" : "battle"
}
for (var key in hero){
console.log(key+":"+hero[key])
}
- 對象的valueof ()和 toStringof ()方法
6.數(shù)組
數(shù)組:一種特殊的對象隶症,是按次序排列的一組值
- 數(shù)組的創(chuàng)建并賦值
//數(shù)組的創(chuàng)建并賦值
var a=new Array(1,2,3,4,5);
var b=["a","b","c"]
- 訪問數(shù)組元素與修改
//訪問數(shù)組元素與修改
a[2]//3
b[0]//a
a[2]=8//
b[0]="hello"
- 刪除數(shù)組
var b=["a","b","c"]
b[0]="hello"
delete b[0]//b[0]顯示為undefined
- 數(shù)組與對象的關(guān)系
var a=new Array("hello",1,"world")
var b={
"0" : "hello",
"1" : 1,
"2" : "world",
"length" : 2
}
a[0]//"hello"
b[0]//"hello"
a[1]//1
b[1]//1
a.length//3
b.length//3
- 數(shù)組的遍歷
var a = new Array("hello",1,"world")
var i;
for (i=0;i<a.length;i++){
console.log("a"+"["+i+"]"+":"+a[i])
}
- 數(shù)組的常用方法
var a = new Array("hello",1,"world")
//push()方法可向數(shù)組末尾添加1個或多個元素政模,并返回新的數(shù)組長度
a.push(2)//4
//unshift()方法可以向數(shù)組開頭添加1個或多個元素,并返回新的數(shù)組長度
a.unshift(3)
//pop()方法用于刪除并返回數(shù)組最后一個元素,如果數(shù)組已經(jīng)為空蚂会,則 pop() 不改變數(shù)組淋样,并返回 undefined 值。
a.pop()//"world"
//a.shfit()方法數(shù)組的第一個元素刪除胁住,并返回第一個元素的值
a.shfit()
//a.join()方法是把數(shù)組中的所有元素放入一個字符串趁猴,并通過分隔符把所有元素隔開,分隔符的類型是可選的
a.join("---");//"3---hello---1"
a.join(".");//"3.hello.1"
//a.concat()方法是用于連接兩個以上的數(shù)組
var b=[3,3,3]
a.concat(b)//["hello", 1, "world", 3, 3, 3]
//a.reverse()方法用于顛倒數(shù)組元素的順序
a.reverse()//["world", 1, "hello"]
//a.splice(1,1,"a","b","c")方法表示從數(shù)組元素的第1個開始刪除1個元素,并緊跟著添加3個元素,并返回刪除值
a.splice(1,1,"a","b","c")//1彪见,此時數(shù)組a的元素為["hello","a","b","c","world"]
//toString()方法是把數(shù)組元素返回字符串儡司,并用逗號分隔
a.toString()//"hello,1,world"
7.函數(shù)
函數(shù)是一個特殊的對象,是代碼塊余指,可以被調(diào)用捕犬,可以輸入?yún)?shù)并返回值
- 函數(shù)的聲明
//function命令
function fn(){
var a=1;
console.log(a)
}
//函數(shù)表達(dá)式
var a = function(){
var b=1;
console.log(b)
};
【注意】函數(shù)表達(dá)式在花括號最后必須加上分號酵镜,function命令可以不用碉碉,為了統(tǒng)一起見,最好統(tǒng)一使用分號結(jié)束語句
此外淮韭,但存在var fn=function f(){};時誉裆,這個函數(shù)名f只能在函數(shù)體內(nèi)部調(diào)用,而在外部是無效的
//構(gòu)造函數(shù)
var c = new Function("x","y","return (x+y)");
fn();
a();
console.log(c(1,2))
【注意】
- 函數(shù)的聲明不能在非函數(shù)的代碼塊下
- function命令和函數(shù)表達(dá)式在變量提升層面存在一定的差異缸濒,function fn(){}是整塊跟著提升足丢,而var a=function(){}則是只提升var a
例如:下面寫法不符合規(guī)范
if(true){
function fn(){
}
}
- 函數(shù)的調(diào)用與函數(shù)的賦值
function fn(){
var a=1;
console.log(a)
}
//函數(shù)的調(diào)用:直接函數(shù)名+圓括號
fn();
//函數(shù)的賦值
var b =fn;
typeof b//function
- 函數(shù)的屬性與方法
- name屬性:返回緊跟在function關(guān)鍵字之后的函數(shù)名
function fn(){};
var fn2 = function(){};
var fn3 = function f(){};
fn.name;//fn
fn2.name;//""
fn3.name;//f
- length屬性:返回函數(shù)定義的參數(shù)個數(shù)
function fn(x,y,z){};
var fn2 = function(a1,a2){};
var fn3 = function f(name){};
fn.length//3
fn2.length//2
fn3.length//1
- toString()方法:返回函數(shù)的源碼
function fn(){
//這是函數(shù)的toString()方法
console.log(a);
}
//返回內(nèi)容為:"function fn(){
//這是函數(shù)的toString()方法
//console.log(a);
//}"
- 關(guān)于命名沖突
當(dāng)在同一個作用域內(nèi)定義了名字相同的變量和方法的話粱腻,無論其順序如何,變量的賦值會覆蓋方法的賦值
var fn = 3;
function fn(){
console.log(fn)
}; // 3
- 函數(shù)的作用域
作用域是指變量存在的范圍斩跌,可分為全局作用域和函數(shù)作用域绍些,由此可劃分變量為全局變量和局部變量
- 全局作用域:變量作用范圍是全局,直到j(luò)s運行失效
- 函數(shù)作用域:變量作用分為是函數(shù)內(nèi)部耀鸦,函數(shù)執(zhí)行完后就失效
- 作用域鏈:JavaScript語言特有的”鏈?zhǔn)阶饔糜颉苯Y(jié)構(gòu)(chain scope)柬批,子對象會一級一級地向上尋找所有父對象的變量
var a = 1;
function fn(){
var b = 2;
c=3;
console.log(a+b)
}
b//b is not defined
//a是全局變量,只要js運行都會生效袖订;
//b是局部變量氮帐,只在函數(shù)體內(nèi)部生效;
//注意如果函數(shù)內(nèi)部的變量不加var聲明洛姑,那么會當(dāng)做全局變量
- arguments對象
我們知道函數(shù)可以添加參數(shù)上沐,而arguments對象包含了函數(shù)運行時的所有參數(shù),但這個對象只能在函數(shù)體內(nèi)部使用
function fn(a,b,c,d){
console.log(arguments[0]);
console.log(arguments[1]);
console.log(arguments[2]);
console.log(arguments[3]);
}
fn(1,2,3,4);//1 2 3 4
//使用arguments.length屬性得知參數(shù)的個數(shù)
function fn2(){
console.log(arguments.length);
}
fn2(1,2,3,4)//4
【注意】與其他程序設(shè)計語言不同楞艾,ECMAScript 不會驗證傳遞給函數(shù)的參數(shù)個數(shù)是否等于函數(shù)定義的參數(shù)個數(shù)参咙。開發(fā)者定義的函數(shù)都可以接受任意個數(shù)的參數(shù)(根據(jù) Netscape 的文檔,最多可接受 255 個)硫眯,而不會引發(fā)任何錯誤蕴侧。任何遺漏的參數(shù)都會以 undefined 傳遞給函數(shù),多余的函數(shù)將忽略两入。
function fn(a,b,c){
console.log(a+b+c);
}
// 定義3個參數(shù)净宵,即便傳入超過3個參數(shù)函數(shù)還是生效
fn(1,2,3,4,5)//6
fn(1,"",3);//"13"
function fn2(a,b){
return a;
}
// fn(,3)//報錯Unexpected token
//如果需要某個中間參數(shù)缺失,需顯式傳入undefined
fn2(undefined,3)//undefined
- 立即執(zhí)行函數(shù)
-
什么是立即執(zhí)行函數(shù)
一種聲明之后就立即進(jìn)行該函數(shù)執(zhí)行操作的匿名函數(shù) -
立即執(zhí)行函數(shù)的寫法
function()前面加任意符號裹纳,告訴js引擎這是要執(zhí)行函數(shù)而不是聲明函數(shù)择葡,注意最后必須加分號 -
為什么要用立即執(zhí)行函數(shù)
消除全局變量的污染;
防止其他js文件出現(xiàn)與本文件的函數(shù)名重名情況痊夭,那么函數(shù)內(nèi)部定義的同一個變量a有可能被污染;
IIFE內(nèi)部形成了一個單獨的作用域刁岸,可以封裝一些外部無法讀取的私有變量 -
立即執(zhí)行函數(shù)應(yīng)用
待續(xù)
-
什么是立即執(zhí)行函數(shù)
- 閉包
詳情請見javaScript門道之閉包
8.類型轉(zhuǎn)換
JS是一門動態(tài)類型的語言,var不顯示數(shù)據(jù)類型她我,但是數(shù)據(jù)本身和各種運算符是有類型的
- 強制轉(zhuǎn)換
Number()方法:轉(zhuǎn)成數(shù)值
Number("333")//333
Number("333aaa")//NaN
Number(true)//1
Number(false)//0
Number("")//0
Number(undefined)//NaN
Number(null)//0
Number({a:1})//NaN
Number([1,2,3])//NaN
String()方法:轉(zhuǎn)成字符串
String(123)//"123"
String(true)//"true"
String(undefined)//"undefined"
String(null)//"null"
String({})//"[object Object]"
String([1,2,3])//"1,2,3"
Boolean()方法:轉(zhuǎn)成布爾值
除了以下5種虹曙,其他都是true
undefined
null
""
0
NaN
關(guān)于轉(zhuǎn)成布爾值的方法,也可以使用!!
!!123//true
!!undefined//false,等價于Boolean(undefined)
-
自動轉(zhuǎn)換
自動轉(zhuǎn)換的規(guī)則是這樣的:預(yù)期什么類型的值番舆,就調(diào)用該類型的轉(zhuǎn)換函數(shù)酝碳。比如,某個位置預(yù)期為字符串恨狈,就調(diào)用String函數(shù)進(jìn)行轉(zhuǎn)換疏哗。
由于自動轉(zhuǎn)換具有不確定性,而且不易除錯禾怠,建議在預(yù)期為布爾值返奉、數(shù)值贝搁、字符串的地方,全部使用Boolean芽偏、Number和String函數(shù)進(jìn)行顯式轉(zhuǎn)換雷逆。- 自動轉(zhuǎn)換為數(shù)值,常用-0將其他類型的數(shù)據(jù)轉(zhuǎn)換為數(shù)值
"1"-0//1
"hello"-0//NaN
true-0//1
//當(dāng)然任何類型數(shù)據(jù)可以和除了+以外的算術(shù)運算符都可以自動轉(zhuǎn)化為數(shù)值
"1"/2//0.5
【注意】
當(dāng)JavaScript遇到預(yù)期為數(shù)值的地方污尉,就會將參數(shù)值自動轉(zhuǎn)換為數(shù)值膀哲。系統(tǒng)內(nèi)部會自動調(diào)用Number
函數(shù)。
除了加法運算符有可能把運算子轉(zhuǎn)為字符串被碗,其他運算符都會把運算子自動轉(zhuǎn)成數(shù)值
- 自動轉(zhuǎn)換為字符串某宪,常出現(xiàn)于和運算符+
"h"+1//"h1"
"h"+true//"htrue"
"h"+undefined//"hundefined"
"h"+null//"hnull"
"h"+NaN//"hNaN"
"t"+{}//"t[object Object]"
"t"+[]//"t"
"t"+function(){}//"tfunction(){}"
【注意】
當(dāng)JavaScript遇到預(yù)期為字符串的地方,就會將非字符串的數(shù)據(jù)自動轉(zhuǎn)為字符串锐朴。系統(tǒng)內(nèi)部會自動調(diào)用String
函數(shù)兴喂。
可以利用這一特性,將任何數(shù)據(jù)類型轉(zhuǎn)換為字符串,""+數(shù)據(jù)類型值
- 自動轉(zhuǎn)換為布爾值:常見于條件語句
var a;
if (undefined){
console.log(a=1);
}else {
console.log(a=2)
}//2
!!null ? a=1 : a=2;//a=2
【注】以上內(nèi)容整理主要出自阮一峰的技術(shù)博客包颁、饑人谷導(dǎo)師的教學(xué)資源以及一些網(wǎng)絡(luò)資料