JavaScript門道之?dāng)?shù)據(jù)類型

目錄
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ù)
  • 閉包
    詳情請見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ò)資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞻想,一起剝皮案震驚了整個濱河市压真,隨后出現(xiàn)的幾起案子娩嚼,更是在濱河造成了極大的恐慌,老刑警劉巖滴肿,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岳悟,死亡現(xiàn)場離奇詭異,居然都是意外死亡泼差,警方通過查閱死者的電腦和手機贵少,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堆缘,“玉大人滔灶,你說我怎么就攤上這事『鸱剩” “怎么了录平?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缀皱。 經(jīng)常有香客問我斗这,道長,這世上最難降的妖魔是什么啤斗? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任表箭,我火速辦了婚禮,結(jié)果婚禮上钮莲,老公的妹妹穿的比我還像新娘免钻。我一直安慰自己彼水,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布极舔。 她就那樣靜靜地躺著猿涨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姆怪。 梳的紋絲不亂的頭發(fā)上叛赚,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音稽揭,去河邊找鬼俺附。 笑死,一個胖子當(dāng)著我的面吹牛溪掀,可吹牛的內(nèi)容都是我干的事镣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼揪胃,長吁一口氣:“原來是場噩夢啊……” “哼璃哟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起喊递,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤随闪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后骚勘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铐伴,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年俏讹,在試婚紗的時候發(fā)現(xiàn)自己被綠了当宴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡泽疆,死狀恐怖户矢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情殉疼,我是刑警寧澤梯浪,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站株依,受9級特大地震影響驱证,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恋腕,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一抹锄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦伙单、人聲如沸获高。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽念秧。三九已至,卻和暖如春布疼,著一層夾襖步出監(jiān)牢的瞬間摊趾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工游两, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留砾层,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓贱案,卻偏偏與公主長得像肛炮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宝踪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品侨糟,去做同樣的事情,實現(xiàn)同樣的效果;這時候需要使用工廠模式瘩燥。簡單...
    舟漁行舟閱讀 7,761評論 2 17
  • 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*)解析器會率先讀取函數(shù)聲明秕重,并使其在執(zhí)行任何代碼之前可以訪問;函數(shù)表達(dá)式則必須...
    coolheadedY閱讀 388評論 0 1
  • 原文: https://github.com/ecomfe/spec/blob/master/javascript...
    zock閱讀 3,372評論 2 36
  • 每個人的外表 沒什么太大的區(qū)別 總會被認(rèn)出是人類 也總會被認(rèn)錯職業(yè)形形色色的我們 其實頭腦里的東西 才是最讓人看不...
    想睡懶覺的老少女閱讀 183評論 0 0
  • (如需轉(zhuǎn)載颤芬,請?zhí)崆案嬷?有雪的地方就有關(guān)于雪的種種傳說悲幅,過去的人并不知道這只是一種氣象現(xiàn)象套鹅,四季中只有冬季會出現(xiàn)...
    阿爾法醬閱讀 3,802評論 14 96