摘要:在編程語言中,能夠表示并操作的值的類型稱做數據類型。中的原始類型包括數字,字符串和布爾值。日期與時間語言核心包括構造函數,用來創建表示日期和時間的對象。其規則為如果是布爾值,和分別被轉換為和如果是數字值,返回本身。
源代碼: https://github.com/RobinQu/Programing-In-Javascript/blob/master/chapters/Javascript_Core/Javascript_Basics/Types.md
原文 http://pij.robinqu.me/Javascript_Core/Javascript_Basics/Types.html
本文存在批注,但該網站的Markdown編輯器不支持,所以無法正常展示,請到原文參考。
Javascript數據類型計算機程序的運行需要對值進行造作。在編程語言中,能夠表示并操作的值的類型稱做數據類型。
JavaScript的數據類型分為兩類: 原始類型和對象類型。JavaScript中的原始類型包括數字,字符串和布爾值。
1 "hello world" true
JavaScript中有兩個特殊的原始值: null和undefined。
null undefined
JavaScript除了上述的就是對象了,對象是屬性的集合,每個屬性都由 鍵值對組成。
var i = {x: 1, y: 2}
通常對象是無序,JavaScript定義了一種特殊對象數組,他是有序的集合。
var a[10];
JavaScript還定義了另一種特殊的對象-函數。函數是具有與它相關聯的可執行代碼的對象。通過調用函數來運行執行的代碼,并返回結果。
function a(){ console.log("hello world"); }數字
不區分整數值和浮點數, JavaScript中所有數字均用64位浮點數值標識(IEEE 754)。
就像java程序員所熟悉的double類型
取值范圍在 ±1.7976931348623157 × 10 308 到 ±5 × 10 ?324 之間
文字:
整數
十六進制 0x
八進制 0
浮點表示
Math類
方法
pow // 求冪
round //四舍五入
ceil //向上取整
floor //向下取整
abs //求絕對值
max //最大值
min //最最小值
sqrt
log
exp
acos
asin
atan
atan2
random
sin
cos
常量
PI
E
LN2
LN10
LOG2E
LOG10E
PI
SQRT1_2
SQRT2
無限值
正無窮
Infinity //rw
Number.POSITIVE_INFINITY // r
1/0
Number.MAX_VALUE + 1
負無窮
Number.NEGATIVE_INFINITY //rw
-Intifinty //r
-1/0
-Number.MAX_VALUE - 1
NaN
不與任何值相等 包括它自己.
NaN //rw
Number.NaN //r
0/0 //計算結果為NaN
Zero
Number.MIN_VALUE/2
-Number.MIN_VALUE/2
-1/Infinity
-0
Rounding-error
var x = .3 - .2 var y = .2 - .1 x == y x == .1 // => false .3 -.2 不等于 ./ y == .1 // => true .2 - .1 等于 .1布爾值
布爾值指代真或假,這個類型只有兩個值, 保留字true和false
通常比較語句的結果是布爾值 例如:
a==4
這段代碼檢測a是否等于4
任何JavaScript的值都可以轉換為布爾值。下面這些值會被轉換為false
undefined null 0 -0 NaN "" // the empty string
所有其他的值,包括所有對象都會轉換成true
null和undefinednull表示一個特殊值,常用來描述空值。 對null執行typerof,結果返回object, 也就是null被認為是一種特殊的對象值,含義是非對象。
JavaScript使用undefined標識變量沒有初始化。例如函數沒有返回值,則返回undefined。undefined是預定義的全局變量(與null不一樣,它不是關鍵字)。
日期與時間JavaScript語言核心包括Date()構造函數, 用來創建表示日期和時間的對象。這些日期對象的方法為日期計算通過了簡單的API:
var then = new Date(2011, 0, 1); // 2011年1月1日 var later = new Date(2011, 0, 1, 17, 10, 30) //同一天,當地時間5:10:30pm, var now = new Date(); //當前日期和時間 var elapsed = now - then; //日期減法: 計算時間間隔的毫秒數 later.getFullYear() // => 2011 later.getMonth() // => 0 從0開始計數的月份 later.getDate() // => 1 從1開始計數的天數 later.getDay() // => 5 得到星期幾, 0代表星期日, 5代表星期一 later.getHours() // => 當地時間17 5pm later.getUTHours() // 使用UTC表示小時的時間,基于時區文本
字符串是一組由16位值組成的不可變的有序序列,每個字符通常來自于Unicode字符集。
var i = "abcdefg";
在JavaScript字符串中,反斜線有著特殊的用途,反斜線符號后加一個字符,就不再表示它們的字面含義了,不如 就是一個轉義字符,它表示一個換行符。
"You"re right, it can"t be a quote"
JavaScript的內置功能之一就是字符串連接:
msg = "Hello, " + "world";
字符串的length屬性可以查看字符串的長度:
s.length
除了length屬性, 字符串還提供許多可以調用的方法:
var s = "hello, world" //定義一個字符串 s.charAt(0) // => "h" 第一個字符 s.charAt(s.length-1) // => "d" 最后一個字符 s.substring(1, 4) // => "ell" 第2-4個字符 s.slice(1,4) // => "ell" 同上 s.slice(-3) // => "rld": 最后三個字符 s.indexOf("l") // => 2 字符l首次出現的位置 s.lastIndexOf("l") // => 10: 字符l最后一次出現的位置 s.indexOf("l", 3) // => 在位置3及之后首次出現字符l的位置 s.split(",") // => ["hello", "world"]分割成子串 s.replace("h", "H") // => "Hello, world": 全文字符替換 s.toUpperCase() // => "HELLO WORLD"全局對象
全局對象在JavaScript中有著重要的用途: 全局對象的屬性是全局定義的符號, JavaScript程序可以直接使用,當解釋器啟動時,它將創建一個新的全局對象,并給它一組定義的初始屬性:
全局屬性,比如undefined, Infinity
全局函數,比如parseInt()
構造函數,比如Data(),
全局對象,比如Math和JSON
包裝對象看這樣一個例子:
var s = "hello world!"; var word = s.substring(s.indexOf(" ")+1, s.length);
字符串既然不是對象,為什么它會有屬性呢?只要引用了字符串s的屬性,JavaScript就會將字符串值通過調用new String(s)的方式轉換成對象,
同字符串一樣,數字和布爾值也有相應的方法。其他類似的包裝類:
Number object
String object
Boolean Object
Function Object
RegExp Object
Error
SyntaxError
ReferenceError
TypeError
...
不可變的原始值和可變的原始對象引用原始值是不可改變的,原始值的比較是值比較, 對象的比較并非值比較:即使兩個對象包含同樣的屬性以及相同的值,他們也不是相等的。我們通常將對象稱為引用類型,對象的值都是引用,對象的比較也是引用的比較,當且僅當他們引用同一個基獨享,他們才相等;
類型轉換當期望使用一個布爾值的時候,可以提供任意類型值,JavaScript將根據需要自行轉換類型。類型轉換可以分為隱式轉換和顯式轉換,所謂隱式轉換即程序在運行時進行的自動轉換,顯式轉換則是人為的對類型進行強制轉換。
顯式轉換通過手動進行類型轉換,Javascript提供了以下轉型函數:
轉換為數值類型:Number(mix)、parseInt(string,radix)、parseFloat(string)
轉換為字符串類型:toString(radix)、String(mix)
轉換為布爾類型:Boolean(mix)
Number(mix)函數,可以將任意類型的參數mix轉換為數值類型。其規則為:
如果是布爾值,true和false分別被轉換為1和0
Number(true); //=> 1
如果是數字值,返回本身。
Number(5); //=> 5
如果是null,返回0.
Number(null); //=>0
如果是undefined,返回NaN。
Number(undefined); //=> NaN
如果是字符串,遵循以下規則:
如果字符串中只包含數字,則將其轉換為十進制(忽略前導0)
Number("00001"); //=> 1
如果字符串中包含有效的浮點格式,將其轉換為浮點數值(忽略前導0)
Number("1.234"); //=> 1.234
如果是空字符串,將其轉換為0
Number(""); //=> 0
如果字符串中包含非以上格式,則將其轉換為NaN
如果是對象,則調用對象的valueOf()方法,然后依據前面的規則轉換返回的值。如果轉換的結果是NaN,則調用對象的toString() 方法,再次依照前面的規則轉換返回的字符串值。
下表列出了對象的valueOf()的返回值:
對象 返回值 Array 數組的元素被轉換為字符串,這些字符串由逗號分隔,連接在一起。其操作 與?Array.toString?和?Array.join?方法相同。 Boolean Boolean?值。 Date 存儲的時間是從?1970?年?1?月?1?日午夜開始計的毫秒數?UTC。 Function 函數本身。 Number 數字值。 Object 對象本身。這是默認情況。 String 字符串值。
parseInt(string,?radix)函數,將字符串轉換為整數類型的數值。它也有一定的規則:
忽略字符串前面的空格,直至找到第一個非空字符
如果第一個字符不是數字符號或者負號,返回NaN
如果第一個字符是數字,則繼續解析直至字符串解析完畢或者遇到一個非數字符號為止
如果上步解析的結果以0開頭,則將其當作八進制來解析;如果以0x開頭,則將其當作十六進制來解析
如果指定radix參數,則以radix為基數進行解析
parseInt("12", 10); // => 12 parseInt("12", 16); // => 18 parseInt("1E", 10); // => 1 parseInt("E", 10); // => NaN
parseFloat(string)函數,將字符串轉換為浮點數類型的數值。
它的規則與parseInt基本相同,但也有點區別:字符串中第一個小數點符號是有效的,另外parseFloat會忽略所有前導0,如果字符串包 含一個可解析為整數的數,則返回整數值而不是浮點數值。
parseFloat("1.222.2") // => 1.222 parseFloat("1.0") // => 1
toString(radix)方法。除undefined和null之外的所有類型的值都具有toString()方法,其 作用是返回對象的字符串表示。
對象 操作 Array 將?Array?的元素轉換為字符串。結果字符串由逗號分隔,且連接起來。 Boolean 如果?Boolean?值是?true,則返回?“true”。否則,返 回?“false”。 Date 返回日期的文字表示法。 Error 返回一個包含相關錯誤信息的字符串。 Function 返回如下格式的字符串,其中?functionname?是被調 用?toString?方法函數的名稱: function?functionname(?)?{?[native?code]?} Number 返回數字的文字表示。 String 返回?String?對象的值。 默認 返回?“[object?objectname]”,其中?objectname?是 對象類型的名稱。
String(mix)函數,將任何類型的值轉換為字符串,其規則為:
如果有toString()方法,則調用該方法(不傳遞radix參數)并返回結果
如果是null,返回”null”
如果是undefined,返回”undefined”
Boolean(mix)函數,將任何類型的值轉換為布爾值。
以下值會被轉換為false:false、”"、0、NaN、null、undefined,其余任何值都會被轉換為true。
考慮一下情況:
null == undefined
undefined == null
2 == "2"
"2" == 2
NaN != NaN
在某些情況下,即使我們不提供顯示轉換,Javascript也會進行自動類型轉換,主要情況有:
用于檢測是否為非數值的函數:isNaN(mix)isNaN()函數,經測試發現,該函數會嘗試將參數值用Number()進行轉換,如果結果為“非數值”則返回true,否則返回false。
遞增遞減操作符(包括前置和后置)、一元正負符號操作符這些操作符適用于任何數據類型的值,針對不同類型的值,該操作符遵循以下規則(經過對比發現,其規則與Number()規則基本相同):
如果是包含有效數字字符的字符串,先將其轉換為數字值(轉換規則同Number()),在執行加減1的操作,字符串變量變為數值變量。
如果是不包含有效數字字符的字符串,將變量的值設置為NaN,字符串變量變成數值變量。
如果是布爾值false,先將其轉換為0再執行加減1的操作,布爾值變量編程數值變量。
如果是布爾值true,先將其轉換為1再執行加減1的操作,布爾值變量變成數值變量。
如果是浮點數值,執行加減1的操作。
如果是對象,先調用對象的valueOf()方法,然后對該返回值應用前面的規則。如果結果是NaN,則調用toString()方法后再應用前 面的規則。對象變量變成數值變量。
加法運算操作符加號運算操作符在Javascript也用于字符串連接符,所以加號操作符的規則分兩種情況:
如果兩個操作值都是數值,其規則為:如果一個操作數為NaN,則結果為NaN
如果是Infinity+Infinity,結果是Infinity
如果是-Infinity+(-Infinity),結果是-Infinity
如果是Infinity+(-Infinity),結果是NaN
如果是+0+(+0),結果為+0
如果是(-0)+(-0),結果為-0
如果是(+0)+(-0),結果為+0
如果有一個操作值為字符串,則:如果兩個操作值都是字符串,則將它們拼接起來
如果只有一個操作值為字符串,則將另外操作值轉換為字符串,然后拼接起來
如果一個操作數是對象、數值或者布爾值,則調用toString()方法取得字符串值,然后再應用前面的字符串規則。對于undefined和 null,分別調用String()顯式轉換為字符串。
可以看出,加法運算中,如果有一個操作值為字符串類型,則將另一個操作值轉換為字符串,最后連接起來。
乘除、減號運算符、取模運算符這些操作符針對的是運算,所以他們具有共同性:如果操作值之一不是數值,則被隱式調用Number()函數進行轉換。具體每一種運算的詳細規則請參 考ECMAScript中的定義。
邏輯操作符(!、&&、||)邏輯非(!)操作符首先通過Boolean()函數將它的操作值轉換為布爾值,然后求反。
邏輯與(&&)操作符,如果一個操作值不是布爾值時,遵循以下規則進行轉換:
如果第一個操作數經Boolean()轉換后為true,則返回第二個操作值,否則返回第一個值(不是Boolean()轉換后的值)
如果有一個操作值為null,返回null
如果有一個操作值為NaN,返回NaN
如果有一個操作值為undefined,返回undefined
邏輯或(||)操作符,如果一個操作值不是布爾值,遵循以下規則:
如果第一個操作值經Boolean()轉換后為false,則返回第二個操作值,否則返回第一個操作值(不是Boolean()轉換后的值)
對于undefined、null和NaN的處理規則與邏輯與(&&)相同
關系操作符(<,?>,?<=,?>=)與上述操作符一樣,關系操作符的操作值也可以是任意類型的,所以使用非數值類型參與比較時也需要系統進行隱式類型轉換:
如果兩個操作值都是數值,則進行數值比較
如果兩個操作值都是字符串,則比較字符串對應的字符編碼值
如果只有一個操作值是數值,則將另一個操作值轉換為數值,進行數值比較
如果一個操作數是對象,則調用valueOf()方法(如果對象沒有valueOf()方法則調用toString()方法),得到的結果按照前 面的規則執行比較
如果一個操作值是布爾值,則將其轉換為數值,再進行比較
注:NaN是非常特殊的值,它不和任何類型的值相等,包括它自己,同時它與任何類型的值比較大小時都返回false。
相等操作符(==)相等操作符會對操作值進行隱式轉換后進行比較:
如果一個操作值為布爾值,則在比較之前先將其轉換為數值
如果一個操作值為字符串,另一個操作值為數值,則通過Number()函數將字符串轉換為數值
如果一個操作值是對象,另一個不是,則調用對象的valueOf()方法,得到的結果按照前面的規則進行比較
null與undefined是相等的
如果一個操作值為NaN,則相等比較返回false
如果兩個操作值都是對象,則比較它們是不是指向同一個對象
需要注意的是一個值轉換為另一個值并不代表兩個值相等。
Referenceshttp://webreflection.blogspot.com/2010/10/javascript-coercion-demystified.html
http://www.yaldex.com/javascript_tutorial_2/LiB0022.html
http://stackoverflow.com/questions/13266616/primitive-value-vs-reference-value
http://dailyjs.com/2012/05/07/js101-object/
http://javascriptweblog.wordpress.com/2010/09/27/the-secret-life-of-javascript-primitives/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78114.html
摘要:多數運算符都是由標點符號表示,比如和。通常會根據需要對操作數進行類型轉換左值是一個古老的屬于,它是指表達式只能出現在賦值運算符的左側。也稱為嚴格相等運算符,它用來檢測兩個操作數是否嚴格相等。運算符的檢測規則是和運算符的求反。 源代碼: https://github.com/RobinQu/Programing-In-Javascript/blob/master/chapters/...
摘要:瀏覽器只是實現的宿主環境之一,其他宿主環境包括和。年月,版發布,成為國際標準。事件定義了事件和事件處理的接口。對于已經正式納入標準的來說,盡管各瀏覽器都實現了某些眾所周知的共同特性,但其他特性還是會因瀏覽器而異。 JavaScript 是面向 Web 的編程語言,絕大多數現代網站都使用了 JavaScript,并且所有的現代 Web 瀏覽器(電腦,手機,平板)均包含了 JavaScri...
摘要:基礎鞏固基礎總結使用已經好幾年了,由于工作主要是做服務端開發,在工作中逐漸發現的使用范圍原來越廣泛。這里要注意,務必將基礎部分掌握牢靠,磨刀不誤砍柴功,只有將基礎部分掌握并建立起系統的知識體系,在后面學習衍生的其他模式才能游刃有余。 基礎鞏固:JavaScript基礎總結 使用JavaScript已經好幾年了,由于工作主要是做服務端開發,在工作中逐漸發現JavaScript的使用范圍原...
摘要:發布后不久,微軟就在其中加入了名為的實現命名為是為了避開與有關的授權問題。以現在的眼光來看,微軟年月為進入瀏覽器領域而實施的這個重大舉措,是導致日后蒙羞的一個標志性時間。微軟推出其實現意味著有了兩個不同的版本中的中的。 JavaScript簡介 前言:最近在細讀Javascript高級程序設計,對于我而言,中文版,書中很多地方一筆帶過,所以用自己所理解的,嘗試細致解讀下。如有紕漏或錯...
JS(JavaScript) 一。基礎語法; 1.語法; 區分大小寫; 他的標識符必須以大小寫區分使用實為形式,不同的大小寫代表不一樣的意思 var aixinjueluo = 愛新覺羅; console.log(aixinjueluo); var Aixinjueluo = Aixinjueluo; console.log(Aixinjueluo); var AIXINJUELUO = AIXI...
摘要:學編程真的不是一件容易的事不管你多喜歡或是多會編程,在學習和解決問題上總會碰到障礙。熟練掌握核心內容,特別是和多線程初步具備面向對象設計和編程的能力掌握基本的優化策略。 學Java編程真的不是一件容易的事,不管你多喜歡或是多會Java編程,在學習和解決問題上總會碰到障礙。工作的時間越久就越能明白這個道理。不過這倒是一個讓人進步的機會,因為你要一直不斷的學習才能很好的解決你面前的難題...
閱讀 958·2022-06-21 15:13
閱讀 1848·2021-10-20 13:48
閱讀 1029·2021-09-22 15:47
閱讀 1365·2019-08-30 15:55
閱讀 3112·2019-08-30 15:53
閱讀 520·2019-08-29 12:33
閱讀 712·2019-08-28 18:15
閱讀 3458·2019-08-26 13:58