首頁 web前端 js教程 JavaScript高階程式設計(第3版)學習筆記3 js簡單資料型別_基礎知識

JavaScript高階程式設計(第3版)學習筆記3 js簡單資料型別_基礎知識

May 16, 2016 pm 05:49 PM

ECMAScript是一种动态类型的语言,构建于5种简单数据类型(Undefined、Null、Boolean、Number、String)和一种复杂数据类型(Object)的基础之上。这篇文章就来复习一下简单数据类型,我会尽量从编程实践的角度来描述,下面代码运行环境为FireFox 14.0.1。

简单数据类型

简单数据类型 取值
Undefined undefined(只有一个值)
Null null(只有一个值)
Boolean true|false(只有两个值)
Number 数值
String 字符串

  首先需要說明的是,在ECMAScript中,上述5種簡單資料類型,其中Boolean、Number、String都有同名的內建包裝對象,而簡單資料類型的字面值(變數)會根據情況自動包箱,因此可以直接呼叫方法,至於具體可以呼叫哪些方法,在討論內建物件時再詳細說明:

複製程式碼 程式碼如下:

console.info(true.toString());//true,相當於使用Boolean()包裝之後再呼叫
console.info(Boolean(false).toString( ));//false,將false轉換為Boolean類型值
console.info(new Boolean(false).toString());//false,false使用Boolean()包裝
console.info( false.toString());//false,相當於使用Boolean()包裝之後再呼叫
console.info('test'.toString());//test,相當於使用String()包裝之後再呼叫

try{
console.info(undefined.toString());//沒有對應包裝類型,拋出例外
}catch(e){
console.info(e );//TypeError
}
try{
console.info(null.toString());//沒有對應包裝類型,拋出例外
}catch(e){
console.info(e);//TypeError
}

var num = 4;
console.info(num.toString());//4,可以直接在簡單數值變數上呼叫方法,相當於使用Number()包裝之後再呼叫
//console.info(3.toString());//SyntaxError,語法錯誤不能使用try捕獲,說明不能直接在數值字面量上呼叫

其次說一下實際用的最多的資料轉換:
  (1)轉換為Boolean:!!value
  (2)轉換為Number:value
 (3)為String:'' value
  下面再具體說明5種簡單資料類型:
1、Undefined類型
  Undefined資料類型只有一個取值:undefined。
(1)所有未初始化的值都預設為undefined(也就沒有必要把一個變數顯示初始化為undefined了)。
(2)在函數作用域中,沒有傳入實際參數的函數形參為undefined。
(3)函數沒有明確回傳或return;的時候,回傳值為undefined。
(4)在ECMAScript中,規定null==undefined回傳true,而null===undefined回傳false。
(5)undefined對應的Boolean值為false。
(6)使用typeof作用於undefiend時,傳回字串'undefined',作用於一個從未宣告的「變數」時,也會傳回'undefined'。
(7)undefined轉換數值為NaN,轉換字串為'undefined'。
複製程式碼 程式碼如下:

console.info(undefined===undefined===undefined); /true
console.info(typeof undefined);//undefined
console.info(typeof noDefined);//undefined,未定義的標識符,使用typeof也傳回undefined,這也是未定義的標識符唯一可用的的運算子
console.info(!undefined);//true,這裡傳回true,正是許多條件語句中判斷變數是否初始化的基礎
console.info(!!undefined);/ /任何一個值,使用雙重否定!!都會將其轉換為對應的Boolean值,這裡說明undefiend對應的Boolean值為false
console.info(undefined==null);//ES中規定,null與undefined相等性測試回傳true
console.info(undefined===null);//但undefined與null畢竟是兩個資料型,使用全等比較時,回傳false
console.info(typeof undefined ==undefined);//false,typeof undefined回傳的是一個字串'undefined',所以這裡輸出false
console.info( undefined);//NaN,轉換數值時為NaN
console.info ('' undefined);//undefined,轉換為字串'undefined'

2、Null型別
  Null型別也只有一個值:null。
(1)對null值使用typeof時,傳回字串'object'。
(2)null對應的Boolean值為false。
(3)如果一個變數用來保存一個對象,建議初始化為null。
(4)null轉換數值為0,轉換字串為'null'。
複製程式碼 程式碼如下:

console.info(null===nullull); /true
console.info(typeof null);//object
console.info(!null);//true
console.info(!!null);//false,說明null對應的Boolean值為false
console.info(undefined==null);//true
console.info(undefined===null);//false
console.info( null);//0 ,轉換為數值0
console.info('' null);//null,轉換為字串'null'

3、Boolean类型
  Boolean类型只有两个值:true和false。
(1)虽然只有两个值,但是任何一种数据类型的值都能转换为与其相对应的Boolean值,转换方式主要有三种:
  A、通过转型函数Boolean()转换
    需要注意的是,当Boolean()作为转换函数时,会转换为一个与其相应的Boolean值,当作为构造函数时,会创建一个对象,而任意非空对象的Boolean值都是true,有时候这会造成误解,建议就是不使用Boolean()。对于String()、Number()也有类似情况。
  B、通过双重否定!!操作符转换
  C、通过隐式转换,比如一些条件语句中
(2)Boolean类型的true和false,使用typeof时,均返回字符串'boolean'。
(3)在转换为数值时,true和false分别转换为1和0,转换为字符串时,分别为'true'和'false'。
复制代码 代码如下:

var value = 'test';
var empty = '';
console.info(!!value);//true
console.info(!!empty);//false
console.info(Boolean(value));//true
console.info(Boolean(empty));//false
console.info(!!value === Boolean(value));//true,说明两种转换方式等价
console.info(!!empty === Boolean(empty));//true
console.info(new Boolean(value));//Boolean对象,注意这里使用了new,会创建一个对象
console.info(new Boolean(empty));//Boolean对象
if(value){//隐式转换为true
console.info(value);//test
}
if(empty){//隐式转换为false,不执行括号内部语句
console.info('empty');
}
if(new Boolean(empty)){//先创建对象,再隐式转换为true,会执行括号内部的语句
console.info('empty');//empty
}
console.info(typeof true == 'boolean');//true
console.info(+true);//1,一元操作符,转换为数值1
console.info(+false);//0
console.info(''+true);//true,重载后的+操作符,转换为字符串'true'
console.info(''+false);//false


具体的转换规则如下:

数据类型 转换为true的值 转换为false的值
Undefined - undefined
Null - null
Boolean true false
Number 任意非0数值(包括无穷大) 0和NaN
String 任意非空字符串 空字符串
Object 任意对象 -

 4、Number型

  在ECMAScript中,沒有單獨的整型、浮點型,只有一個Number型,使用IEEE754格式來表示(這種表示法在計算時會有捨入誤差),在這裡不去細究底層實現,這些東西在學校學C語言的時候已經很頭痛了,不想再頭痛一次。下面我把實際編程中用的最多的放到最前面來講,這一般來說已經足夠,對於不想被太邊緣的細節所困擾的朋友,隨時可以跳過後面關於Number的論述。

(1)數值轉換:主要是下面的三個轉換函數

  • Number()函數:和Boolean()類似,將資料轉換成Number型,和使用一元加運算子( )作用相同,建議使用 運算符,比較簡單。
  • parseInt()函數:解析整數,可以傳入資料和進制,如parseInt('070',8)輸出10進制的56。
  • parseFloat()函數:解析浮點數,只能接受一個參數,需要注意的是,如果被解析的資料結果是整數,會直接傳回整數。

註:使用Number()和 轉換時,true—>1,false—>0,undefined—>NaN,null—>0,空字串—>0,非空字串—>依數值解析。

複製程式碼 程式碼如下:

var trueVal = true; falseVal = false;
var undef = undefined;
var nullVal = null;
var intVal = '1';
var floatVal = '1.0';
var strVal🎜>var floatVal = '1.0';
var strVal = 'test';
var empty = '';
console.info(Number(trueVal));//1
console.info(Number(falseVal));//0
console.info(Number( undef));//NaN
console.info(Number(nullVal));//0
console.info(Number(intVal));//1
console.info(Number(floatVal) );//1
console.info(Number(strVal));//NaN
console.info(Number(empty));//0

console.info( trueVal); //1
console.info( falseVal);//0
console.info( undef);//NaN
console.info( nullVal);//0
console.info( intVal );//1
console.info( floatVal);//1
console.info( strVal);//NaN
console.info( empty);//0

console.info(parseInt(trueVal));//NaN
console.info(parseInt(falseVal));//NaN
console.info(parseInt(undef));//NaN
console. info(parseInt(nullVal));//NaN
console.info(parseInt(intVal));//1
console.info(parseInt(floatVal));//1
console.info( parseInt(strVal));//NaN
console.info(parseInt(empty));//NaN

console.info(parseFloat(trueVal));//NaN
console.info(parseFloat(trueVal));//NaN
console.info(parseFloat(trueVal));//NaN
console.info (parseFloat(falseVal));//NaN
console.info(parseFloat(undef));//NaN
console.info(parseFloat(nullVal));//NaN
console.info(parseFloat (intVal));//1
console.info(parseFloat(floatVal));//1
console.info(parseFloat(strVal));//NaN
console.info(parseFloat(empty ));//NaN

說明:這些轉換函數的行為可能會因為瀏覽器的不同實作而不同,建議在實際程式設計過程中對存有疑問的先自行編寫測試。在《JavaScript高階程式設計(第3版)》中,這一節描述的也有很多地方和我實際運行的結果不同,例如原書說parseInt()只能解析字串,但下面的程式碼也可以執行: 複製程式碼
程式碼如下:


var object = {


var object = {
value:1,
toString:function(){
return this.value; } }; console.info(parseInt(object));//1
(2)整數與浮點數:受C語言薰陶的人,一定要固執的區分一下整數和浮點數吧!在ECMAScript中,他們沒有預想的那麼有差別,簡單點,含有小數點且小數點後至少有一位不是0的數值就是浮點數,否則就是整數,比如1.01是浮點數,1.、1.00因為小數點後沒有不是0的數,引擎會解析成整數1。你可能會設想兩個整數相除結果也會取整吧,例如3 / 2 = 1,但是在ECMAScript中,不要擔心這些,已經還原其數學屬性了,你會發現3 / 2 = 1.5了,這一點,在運算子相關部分還會再提及。

(3)進位:也稱進位制,實際上就是進位(低位向高位)的方法,每種進位都有一個基數,當低位數值達到這個基數時,就向高位進1。在日常生活中,用的最多的自然是10進制,例如10角就進位為1元,在時間度量中,還有24進制(24小時為1天)、60進制(60秒為1分),在古代,也有使用16進制的(想想半斤八兩吧)。但是在計算機的處理中,由於電流只有通和不通兩種狀態,所以只能處理2進制數據,不過這對自然人來說不好理解,於是又使用8進制、16進製作為10進制和2進制轉換的中間狀態。

  在ES3中,可以使用8進制、10進制、16進制,但是在ES5中,8進制已經被禁用了。

  8進位:以1位數字0開始,後面是8進位數字序列(0~7),如果數字超過了7,會忽略前導0而作為10進位處理,例如08會解析為10進制的數字8。

  16進位:以1位數字0和1個字母x開始,後面是16進位數字序列(0-9a-fA-F)。

  10進位:可以直接將所有數字一一寫出來,也可以使用科學計數法(不明白?找一本中學數學教科書來看吧)來表示。

(3)特殊值:在ECMAScript中,有2個特殊的數值NaN和Infinity需要注意一下,前者表示不是一個數值(Not a Number),後者表示不在表示範圍內的數值,也可以使用正負號表示方向。對於這兩個特殊值,這裡不去考察具體的運算規則(你若有興趣,可以自行測試,我在下面也會舉一些例子),只做如下兩點說明:

  A、不能用val==NaN來判斷一個變數是否為NaN,而要使用全域的isNaN()函數,函數接受一個參數,當參數可以轉換為數值時傳回true,否則回傳false。

  B、盡量不要使用val==Infinity判斷是否超出範圍,而使用全域的isFinite()函數,該函數接受一個參數,當參數數值處於表示範圍內時傳回true,否則傳回false。這裡所說的表示範圍是指從Number.MIN_VALUE到Number.MAX_VALUE,另外,在Number裡面,還有屬性Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY,其值分別為Infinity和 -Infinity。
複製程式碼 程式碼如下:

console.info(0/0); //NaN
console.info(NaN==NaN);//false
console.info(NaN 1);//NaN
console.info(NaN/NaN);//NaN

var notNumber = NaN;
console.info(notNumber==NaN);//false
console.info(isNaN(notNumber));//true
console.info(1/0); //Infinity
console.info(-1/0); //-Infinity
console.info(1/Infinity);//0
console.info(Infinity/Infinity);//NaN
console.info(Infinity==Infinity); //true
var inf = Infinity;
console.info(inf==Infinity);//true
console.info(!isFinite( inf));//true
console.info(!isFinite(NaN));//true
console.info(isNaN(Infinity));//false

註:在《JavaScript高級程式設計(第3版)》中第29頁說任何數值除以0都會回傳NaN,實際上並非如此。

5、String類型

  和一般類C語言不同,在ECMAScript中,沒有字元類型,而將字串類型String作為一種簡單類型,其字面量使用引號(單引號'或雙引號“)括起來。

(1) 對於字串類型的操作,加號“ ”被重載,任意一個數值與字串相加,都會先將其使用String( )轉換成字串,然後將兩個字串合併。 false—>'false',數值類型Number—>以數值可見的字元轉換,物件Object—>呼叫toString。 🎜> 程式碼如下:


console.info('' 1 1);//11,而不是2
console.info('' true);//true console .info('' undefined);//undefined console.info('' null);//null

(3)字串使用反斜線「」來轉義,常見的一些轉義字元有:

字面量 含义 字面量 含义
n 换行 \ 反斜杠
t 制表 ' 单引号
b 空格 " 双引号
r 回车 xnn 以十六进制代码nn表示的一个字符
f 进纸 unnnn 以十六进制代码nnnn表示的一个Unicode字符

好了,關於簡單資料型,就整理到此。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

JavaScript難以學習嗎? JavaScript難以學習嗎? Apr 03, 2025 am 12:20 AM

學習JavaScript不難,但有挑戰。 1)理解基礎概念如變量、數據類型、函數等。 2)掌握異步編程,通過事件循環實現。 3)使用DOM操作和Promise處理異步請求。 4)避免常見錯誤,使用調試技巧。 5)優化性能,遵循最佳實踐。

如何實現視差滾動和元素動畫效果,像資生堂官網那樣?
或者:
怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? 如何實現視差滾動和元素動畫效果,像資生堂官網那樣? 或者: 怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? Apr 04, 2025 pm 05:36 PM

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

console.log輸出結果差異:兩次調用為何不同? console.log輸出結果差異:兩次調用為何不同? Apr 04, 2025 pm 05:12 PM

深入探討console.log輸出差異的根源本文將分析一段代碼中console.log函數輸出結果的差異,並解釋其背後的原因。 �...

See all articles