詞法結(jié)構(gòu)
字符集:unicode
區(qū)分大小寫怯伊,關(guān)鍵字、變量陋守、函數(shù)名震贵、標(biāo)示符必須采取大小寫一致
-
注釋
// 單行注釋 /* ~一段注釋~ */ // 另一段注釋 /* * 多行注釋 * 多行注釋 */
-
直接量
12 // 數(shù)字 1.2 // 小數(shù) "hello world" // 一個字符串 'hi' // 另一種字符串 true // 布爾值 /^javascript$/gi //正則表達(dá)式直接量 null // 空 { x:1 ,y:2} // 對象 [ 1,2,3,4,5 ] //數(shù)組
-
可選的分號
- 在任何需要分割的地方使用
;
進(jìn)行分隔 - 在任何可以省略分號的地方都將其省略
如果不使用分號,由于語句的分隔規(guī)則猩系,會導(dǎo)致一些意想不到的情況媚送,建議無論什么時候都使用分號進(jìn)行分割
- 在任何需要分割的地方使用
類型、值和變量
js中的數(shù)據(jù)類型:
- 數(shù)字
- 字符串
- 布爾值
- null
- undefine
- 對象
js數(shù)據(jù)類型分為2類:原始類型
和 對象類型
原始類型:
- 數(shù)字
- 字符串
- 布爾值
- 特殊的原始值:‘null’ 和 ‘undefine’
對象類型:
- 屬性的集合
- 數(shù)組
- 函數(shù)
變量聲明
js中通過var
關(guān)鍵字來聲明一個變量
var a = 1;
var a,b;
var i=0,j=1,k=2;
如果未在var語句中寇甸,就給變量指定初始值塘偎,那么雖然聲明這個變量,但是給它存入一個值前拿霉,初始值是undefined
重復(fù)聲明一個變量合法吟秩,且沒有任何危害
變量作用域
全局變量擁有全局作用域
函數(shù)內(nèi)聲明的變量和函數(shù)參數(shù)都是局部變量,只能在函數(shù)體內(nèi)有定義
函數(shù)體內(nèi)绽淘,局部變量優(yōu)先級高于全局變量涵防,同名局部變量覆蓋全局變量
var scope = "global";
function check() {
var scope = "local";
return scope; // 返回"local"
}
a = check(); // => "local"
聲明提前
js的函數(shù)作用域指的是,在函數(shù)內(nèi)聲明的所有變量沪铭,在函數(shù)體內(nèi)始終可以看到壮池,變量在聲明之前甚至已經(jīng)可以使用,這個特性稱為“聲明提前”
看下下面一段代碼杀怠,你可能會認(rèn)為第一個打印"global",因?yàn)榇a沒有執(zhí)行到var語句椰憋。其實(shí),局部變量在函數(shù)體內(nèi)始終有定義赔退,也就是說橙依,
函數(shù)體內(nèi)局部變量覆蓋同名全局變量。但是只有執(zhí)行到var語句時局部變量才會賦值硕旗,因此窗骑,上面的執(zhí)行過程相當(dāng)于,將函數(shù)變量聲明
“提前”函數(shù)體頂部卵渴,同時初始化位置仍然留在原來位置
var scope = "global";
function check() {
console.log(scope); // "undefined"
var scope = "local"; // 賦初始值
console.log(scope); // “l(fā)ocal”
}
作為屬性的變量
js的全局變量慧域,其實(shí)是定義了全局對象的一個屬性。
當(dāng)使用var聲明一個變量浪读,創(chuàng)建的這個屬性是不可以配置的昔榴。無法通過delete刪除
如果給一個未聲明的變量賦值,js會自動創(chuàng)建一個全局變量碘橘,是全局對象的正郴ザ可配置的屬性,能夠通過delete刪除
var some = 1;
gvar = 1;
delete some; // => false痘拆,變量沒被刪除
delete gvar; // => true,變量被刪除
數(shù)字
整型直接量
js不區(qū)分整數(shù)值和浮點(diǎn)數(shù)值仰禽,所有的數(shù)字均用浮點(diǎn)數(shù)值表示。js采用的時IEEE 754定義的64位浮點(diǎn)格式來表示數(shù)字,
然后需要注意吐葵,js中實(shí)際的操作(比如數(shù)組索引)則是基于32位整數(shù)的
支持的整型直接量
- 十進(jìn)制 1000
- 十六進(jìn)制 0x1F规揪、0X39
部分ECMAScript實(shí)現(xiàn)是支持八進(jìn)制的,但ECMAScript標(biāo)準(zhǔn)不支持八進(jìn)制直接量温峭,在ECMAScript6的嚴(yán)格模式下猛铅,八進(jìn)制是明令禁止的
浮點(diǎn)型直接量
浮點(diǎn)型采用傳統(tǒng)實(shí)數(shù)寫法,可以采用指數(shù)計數(shù)法和更簡潔的記法
- 3.14
- 7.03E-12
- .3333333
算術(shù)運(yùn)算
運(yùn)算符支持:+
,-
,*
,/
,%
js還支持更為復(fù)雜的算術(shù)運(yùn)算凤藏,通過作為Math對象的屬性定義的函數(shù)和常量來實(shí)現(xiàn)
Math.pow(2,53) // 2的53次冪
Math.round(.6) // => 1.0 四舍五入
Math.ceil(.6) // => 1.0 向上求整
Math.floor(.6) // => 0.0 向下求整
Math.abs(-4) // 絕對值
Math.max(x,y,z) // 返回最大值
Math.min(x,y,z) // 返回最小值
Math.random() // 生成一個0-1.0的隨機(jī)數(shù)
Math.PI // 圓周率
Math.E // e奸忽,自然對數(shù)
Math.sqrt(3) // 3的平方根
Math.sin(0) // 三角函數(shù)
Math.log(10) // 10的自然對數(shù)
Math.log(100)/Math.LN10 // 以10為底的對數(shù)
Math.log(512)/Math.LN2 // 以2為底的對數(shù)
Math.exp(3) // e的3次冪
正無窮大:Infinity
非數(shù)字值: NaN
Infinity // 將一個可讀可寫的變量初始化為Infinity
Number.POSITIVE_INFINITY // Infinity,只讀
1/0 // Infinity
Number.MAX_VALUE + 1 // Infinity
Number.NEGTIVE_INFINITY // 負(fù)無窮大
-Infinity // 負(fù)無窮大
-1/0 // 負(fù)無窮大
-Number.MAX_VALUE - 1 // 將一個可讀可寫變量初始化為NaN
NaN // 非數(shù)字值
Number.NaN // 非數(shù)字值揖庄,只讀
0/0 // NaN
Number.MIN_VALUE/2 // 下溢栗菜,計算結(jié)果為0
-Number.MIN_VALUE/2 // 負(fù)零
-1/Infinity // 負(fù)零
-0 // 負(fù)零,下溢蹄梢,比js所能表示的0還小時疙筹,計算結(jié)果為0
負(fù)零和正零是相等的,除了作為除數(shù)之外
var zero = 0;
var negz = -0;
zero === negz; // => true
1/zero === 1/negz // => false
二進(jìn)制浮點(diǎn)數(shù)和四舍五入錯誤
js可以精確的表示分?jǐn)?shù)检号,比如1/2腌歉、1/8,但不能精確表示0.1這樣數(shù)字
var x = .3 - .2;
var y = .2 - .1;
x == y; // => false 兩個值不相等
x == .1 // => false ,0.3 - 0.2 不等于 0.1
y == .1 // => true, 0.2 - 0.1 等于 0.1
日期和時間
js語言核心包括Date()
構(gòu)造函數(shù)蛙酪,用來表示日期和時間
var then = new Date(2016.4.22); // 2016年4月22日
var later = new Date(2016,3,25,17,19,30) // 2016.4.25 17:19:30pm
var now = new Date(); // 當(dāng)前時間和日期
var elapsed = now - then; // 日期減法齐苛,計算當(dāng)前時間間隔的毫秒數(shù)
later.getFullYear(); // => 2016
later.getMonth(); // => 3 ,月份從0開始
later.getDate() // => 25,從1開始的天數(shù)
later.getDay() // => 1,星期幾桂塞,0代表星期日凹蜂,1代表星期1
later.getHours() // => 17 當(dāng)?shù)貢r間17:19pm
later.getUTCHours() // => 9 我所在UTC-8 使用UTC表示小時的時間,基于時區(qū)阁危,所以返回9
string (文本)
js是采用UTF-16編碼的Unicode字符集玛痊,string是由一組16位值組成的 不可變 的有序序列,每個字符
通常來自于Unicode字符集狂打。
js通過字符串類型來表示文本擂煞。字符串的長度是其所含的16位值的個數(shù)。
js字符串的索引從0開始趴乡,空字符串長度為0
js字符串直接量是由單引號或者雙引號括起來的字符序列对省。
""
'test'
"3.14"
'name="myform"'
"Would't you prefer to say goobye?"
"this string\nhas two lines"
在ECMAScript3中,字符串直接量必須寫在一行晾捏,而在ECMAScript5中蒿涎,字符串直接量可以拆成數(shù)行,每一行
通過反斜線(\\
)結(jié)束惦辛,反斜線和行結(jié)束符都不算字符串直接量的內(nèi)容
"two\nlines"
"one\
two\
three"
轉(zhuǎn)義字符
在js中劳秋,反斜線有特殊用途,用來進(jìn)行轉(zhuǎn)義,不是原來的意思了
轉(zhuǎn)義字符 | 含義 |
---|---|
\o | NUL字符(\u0000) |
\b | 退格符(\u0008) |
\t | 水平制表符 |
\n | 換行符(\u000A) |
\v | 垂直制表符(\u000B) |
\f | 換頁符(\u000C) |
\r | 回車符(\u000D) |
" | 雙引號(\u0022) |
' | 單引號(\u0027) |
\ | 反斜線(\u005C) |
\XXXXXXXX | 兩位16進(jìn)制XXXXXXX指定的Latin-1字符 |
\uXXXXXXXXXXXXXX | 4位十六進(jìn)制XXXXXXXXXXXXXX指定的Unicode字符 |
字符串使用
jsn 內(nèi)置功能之一就是字符串連接玻淑,將+
用于字符串嗽冒,則表示字符串連接
msg = "Hello" + " " + "World"
獲取字符串長度: s.length
除了length屬性,還提供許多調(diào)用方法:
var s = "hello,wolrd"
s.charAt(0) // "h":第一個字符
s.charAt(s.length-1) // "d":最后一個字符
s.substring(1,4) // "ell": 第2-4個字符
s.slice(1,4) // "ell": 第2-4個字符
s.slice(-3) // "rld": 最后三個字符
s.indexOf("l") // 2: l 首次出現(xiàn)的位置
s.lastIndexOf('l') // 10: l最后出現(xiàn)的位置
s.indexOf('l',3) // 3: 在位置3之后首次出現(xiàn)l的位置
s.split(",") // ["hello","world"] 分割成字符串
s.replace('h','H') // "Hello,world",將h替換成H
s.toUpperCase() // "HELLO,WORLD",轉(zhuǎn)成大寫字符串
模式匹配
js定義了RegExp()函數(shù)补履,用來創(chuàng)建文本匹配模式
的對象,稱為正則表達(dá)式
RegExp不是js的基本數(shù)據(jù)類型辛慰,和Date一樣,只是一種具有實(shí)用API的特殊對象干像,但是仍然具有直接量寫法帅腌,
可以直接在js中使用,在兩條斜線之間的文本構(gòu)成正則表達(dá)式直接量麻汰。第二條斜線之后也可以跟隨一個或多個字母速客,
用來修飾匹配模式含義
/^HTML/ //匹配以HTML開始的字符串
/[1-9][0-9]*/ // 匹配一個非零數(shù)字,后面是任意個數(shù)字
/\bjavascript\b/i // 匹配單詞“javascript”五鲫,忽略大小寫
RegExp對象定義有用的方法溺职,字符串也有接收RegExp參數(shù)的方法
var text = 'testing: 1, 2, 3';
var pattern = /\d+/g // 匹配所有包含一個或多個數(shù)字的實(shí)例
pattern.test(text) // true 匹配成功
text.serch(pattern) // 9,首次匹配成功的位置
text.match(pattern) // ["1","2","3"] 所有匹配組成的數(shù)組
text.replace(pattern,"#") //"testing,#, #, #"
text.split(/\D+/) //["","1","2","3"] 用非數(shù)字截取字符串
布爾值
布爾值:true
和false
比較語句結(jié)果通常是布爾值,a==4
任意js值都可以轉(zhuǎn)換為布爾值位喂,下面轉(zhuǎn)換成false:
undefined
null
0
-0
NaN
"" // 空字符串
所有其他值浪耘,包括所有對象數(shù)組,都會轉(zhuǎn)換成true
檢測o是否是非null值,只有o不是null時才會執(zhí)行if后面代碼
if( o !== null)...
o不是任何假值才會執(zhí)行if后面代碼:
if( o)...
布爾值包含toString(),可以將字符串轉(zhuǎn)換為"true"
或"false"
布爾值運(yùn)算符:&&
(與) 塑崖、 ||
(或) 七冲、 !
(非)
null和undefined
null: 描述"空值"
undefined: 未定義的值规婆,表明變量沒有初始化
盡管null和undefined不同澜躺,但是都表示值的空缺,往往可以互換
null == undefined
// => true
null和undefined 都不包含任何屬性和方法
全局對象
全局對象在js中有著重要用途抒蚜,全局對象屬性是全局定義的符號掘鄙,js程序可以直接使用
js解釋器啟動時,會創(chuàng)建一個的新的全局對象嗡髓,并定義初始屬性:
- 全局屬性操漠,比如undefined、Infinity和NaN
- 全局函數(shù)饿这,比如isNaN(),parseInt()和eval()
- 構(gòu)造函數(shù)浊伙,比如Date(),RegExp(),String(),Object()和Array()
- 全局對象,比如Math和JSON
全局對象的初始屬性并不是保留字蛹稍,但是應(yīng)該當(dāng)作保留字對待吧黄,還有Windows對象定義一些額外的全局屬性,也應(yīng)該保留
var global = this; // 定義一個引用的全局對象的全局變量
包裝對象
js 對象是一種復(fù)合值唆姐,屬性或已命名的集合拗慨。
通過.
符號來引用屬性值
當(dāng)屬性值是一個方法時沽瞭,稱其為方法坛梁。通過O.m()來調(diào)用對象O中的方法
字符串同樣具有屬性和方法:
var s = "hello world!";
var word = s.substring(s.indexOf(' ')+1, s.length); // word="world!"
字符串既然不是對象,為啥有屬性呢?
因?yàn)橐昧俗址畇的屬性刁赦,js會將字符串值通過調(diào)用new String(s)
的方式轉(zhuǎn)換成對象幻妓,這個對象繼承了
字符串的方法仔引,并被用來處理屬性的引用鄙皇。一但引用結(jié)束,這個新創(chuàng)建對象便被銷毀了
同字符串一樣其爵,數(shù)字和布爾值也具有各自的方法:通過Number()
和Boolean
構(gòu)造函數(shù)創(chuàng)建一個臨時對象冒冬,
這些方法的調(diào)用均來自這個臨時對象。
null和undefined沒有包裝對象摩渺,訪問他們的屬性简烤,會造成一個類型錯誤
看個栗子,思考一下執(zhí)行結(jié)果:
var s = "test"; // 創(chuàng)建一個字符串
s.len = 4; // 給s設(shè)置一個屬性值摇幻,創(chuàng)建一個臨時字符串對象横侦,并且賦值len=4,然后銷毀這個臨時對象
var t = s.len; // 查詢這個屬性绰姻,通過原始的(沒有修改過的)字符串值創(chuàng)建一個新的字符串對象枉侧,嘗試讀取len,屬性不存在狂芋,t為undefined
存取字符串榨馁、數(shù)字、布爾值的屬性時臨時創(chuàng)建的對象叫做 包裝對象
包裝對象只是被看作一種實(shí)現(xiàn)細(xì)節(jié)银酗,不需要特別關(guān)注辆影。由于字符串、數(shù)字黍特、和布爾值的屬性都是只讀的,
并且不能夠定義新屬性锯蛀,與對象是有區(qū)別的
注意灭衷,可以通過String()
Number()
Boolean()
構(gòu)造函數(shù)顯式創(chuàng)建包裝對象:
var s = "test", n = 1, b = true; // 一個字符串、數(shù)字旁涤、布爾值
var S = new String(s); // 一個字符串對象
var N = new Number(n); // 一個數(shù)字對象
var B = new Boolean(b); // 一個布爾值對象
js 會在必要時包裝對象轉(zhuǎn)換成原始值翔曲,因此上段代碼中對象S、N劈愚、B常常瞳遍,但不總是表現(xiàn)和值s、n菌羽、b一樣掠械。
==
將原始值和其包裝對象視為相等
===
將它們視為不相等,通過typeof
運(yùn)算符可以看到原始值和包裝對象的不同
不可變的原始值和可變的對象引用
js 中原始值(undefined
,null
,布爾值
,數(shù)字
,字符串
)與對象(包括數(shù)組和函數(shù))有著根本區(qū)別。
- 原始值時不可更改的,任何方法都無法更改(或者
突變
)一個原始值
對數(shù)字和布爾值來說顯然如此-改變數(shù)字值本身就說不通猾蒂,對字符串來說不是很明顯均唉。
字符串是由字符組成數(shù)組,我們希望通過指定索引來修改字符串中的字符肚菠。實(shí)際上js禁止這樣的行為舔箭,
字符串方法看上去返回修改后的字符串,實(shí)際上是返回新的字符串值
比如:
var s = "hello"; // 創(chuàng)建一個小寫組成的字符串
s.toUpperCase(); // 返回"HELLO",但是沒有改變s的值
s // s=“hello”蚊逢,s原字符串并沒有改變
- 原始值的比較只是值的比較
原始值只有在值相等時才相等层扶,對于數(shù)字、布爾值烙荷、null和undefined來說比較容易理解怒医,對于字符串則不明白了
單獨(dú)比較2個字符串,只有2個字符串長度相等且每個索引的字符都相等奢讨,才是相等
- 對象是可變的稚叹,值是可修改的
栗子:
var o = { x:1 }; // 定義一個對象
o.x = 2; // 修改對象屬性值來修改對象
0.y = 3; // 再次修改對象,增加一個屬性-y
var a = [1,2,3] // 數(shù)組也是可修改的
a[0] = 0; // 更改數(shù)組的一個元素
a[3] = 4; // 給數(shù)組增加一個新元素
- 對象的比較不是值的比較拿诸,而是對象引用的比較
即使2個對象包含同樣的屬性和相同值扒袖,也不是相等的
各個索引元素完全相等的兩個數(shù)組也不相等。
var o = { x:1 }, p = { x:1 } // 具有同樣屬性和值的兩個對象
0 === p // false ,兩個單獨(dú)的對象永遠(yuǎn)不相等
var a = [], b =[] // 兩個單獨(dú)的空數(shù)組
a === b // false 兩個單獨(dú)的數(shù)組永遠(yuǎn)不相等
通常講亩码,對象被稱為引用類型
季率,以便將js基本類型區(qū)分。對象值都是引用描沟,對象的比較都是引用的比較
當(dāng)且僅當(dāng)他們引用同一個對象時飒泻,才會相等
var a = []; // 定義一個空的數(shù)組
var b = a; // 變量b引用a
b[0] = 1; // 通過b的引用修改a
a[0]; // 1,a的值也修改了
a === b; // true,a和b引用同一個數(shù)組吏廉,相等
如上所示泞遗,將對象或數(shù)組賦值給一個變量,僅僅是賦值的引用值:對象本身沒有被復(fù)制一次
如果想得到一個對象或者數(shù)組的副本席覆,必須顯示復(fù)制對象每一個屬性或數(shù)組每一個元素
例如循環(huán)來完成數(shù)組復(fù)制:
var a = [1,2,3];
var b = [];
for(var i = 0; i < a.length; i++){
b[i] = a[i];
}
同樣的史辙,如果想比較2個單獨(dú)的對象或者數(shù)組,必須比較全部的屬性或者元素
比較2個數(shù)組的函數(shù):
function equalArrays(a,b){
if ( a.lengh != b.length) return false;
for(var i=0; i<a.length; i++ ){
if(a[i] !== b[i]) return false;
}
return true;
}
類型轉(zhuǎn)換
值 | 轉(zhuǎn)換為字符串 | 數(shù)字 | 布爾值 | 對象 |
---|---|---|---|---|
undefined | "undefined" | NaN | false | throws TypeError |
null | "null" | 0 | false | throw TypeError |
true | "true" | 1 | XXXXXXX | new Boolean(true) |
false | "false" | 0 | XXXXXXX | new Boolean(false) |
""(空字符串) | XXXXXXX | 0 | false | new String("") |
"1.2" | XXXXXXX | 1.2 | true | new String("1.2") |
"one" | XXXXXXX | NaN | true | new String("one") |
0 | "0" | XXXXXXX | false | new Number(0) |
-0 | "0" | XXXXXXX | false | new Number(-0) |
NaN | "NaN" | XXXXXXX | false | new Number(NaN) |
Infinity | "Infinity" | XXXXXXX | true | new Number(Infinity) |
-Infinity | "-Infinity" | XXXXXXX | true | new Number(-Infinity) |
1(無窮大佩伤,非零) | "1" | XXXXXXX | true | new Number(1) |
{} | 復(fù)雜 | 復(fù)雜 | true | XXXXXXX |
[] | "" | 0 | true | XXXXXXX |
[9] | “9” | 9 | true | XXXXXXX |
['a'] | 使用join()方法 | NaN | true | XXXXXXX |
function(){} | 復(fù)雜 | NaN | true | XXXXXXX |
原始值到對象的轉(zhuǎn)換也很簡單聊倔,原始值調(diào)用String()
,Number()
,Boolean()
構(gòu)造函數(shù),轉(zhuǎn)換為各自的包裝對象
null 和 undefined屬于例外生巡,當(dāng)做是一個對象的地方都會產(chǎn)生一個類型錯誤異常耙蔑,不會進(jìn)行正常類型轉(zhuǎn)換
轉(zhuǎn)換和相等性
js可以做靈活的類型轉(zhuǎn)換,相等運(yùn)算符也跟相等的含義一樣孤荣,靈活多變
下面的比較結(jié)果都是true:
null == undefined; // 這兩個值被認(rèn)為相等
"0" == 0; // 比較之前甸陌,字符串轉(zhuǎn)換成數(shù)字
0 == false; // 比較之前须揣,布爾值轉(zhuǎn)換成數(shù)字
"0" == false; // 比較之前字符串和布爾值都轉(zhuǎn)換成數(shù)字
需要注意,一個值轉(zhuǎn)換成另一個值不代表兩個值相等邀层。
如果在期望使用布爾值的地方使用undefined,會轉(zhuǎn)換成false返敬,但不代表undefined == false
js中,if語句將undefined轉(zhuǎn)換成false寥院,但 ==
運(yùn)算符不會試圖將操作數(shù)轉(zhuǎn)換為布爾值
顯示類型轉(zhuǎn)換
為了使代碼更加清晰明了劲赠,經(jīng)常使用顯示轉(zhuǎn)換,最簡單的方法就是不使用new運(yùn)算符來調(diào)用Boolean()秸谢、Number()凛澎、
String(),Object()函數(shù)
Number("3") // '3'=>3
String(false) // false => "false"
Boolean([]) // => true
Object(3) // => new Number(3)
除了null和undefined以外都有toString方法估蹄,一般執(zhí)行結(jié)果與String()返回結(jié)果一致
如果試圖把null 和 undefined 轉(zhuǎn)換為對象塑煎,會拋出一個類型錯誤。如果使用object()則不會拋出異常臭蚁,僅僅
簡單的返回一個新創(chuàng)建的空對象
js中某些運(yùn)算符會做隱式的類型轉(zhuǎn)換
-
+
運(yùn)算符
一個操作數(shù)是數(shù)字最铁,另一個操作數(shù)是字符串,則會把非字符串的操作數(shù)轉(zhuǎn)換成字符串然后拼接之后返回(非字符串操作數(shù)不會改變類型)
1+'1' // => '11'(String)
x + '' // => 等價于String(x)
-
!
運(yùn)算符
會把操作數(shù)轉(zhuǎn)換為布爾值并取反垮兑。(操作數(shù)不會改變類型)
!!x // 等價于Boolean(x)
Number => String
- Number類定義的toString()方法可以接受表示轉(zhuǎn)換基數(shù)的可選參數(shù)冷尉,如果不指定,則轉(zhuǎn)換基于十進(jìn)制
var n = 17;
binary_string = n.toString(2);
octal_string = "0" + n.toString(8);
hex_string = "0X" + n.toString(16);
- 控制小數(shù)點(diǎn)位置和有效數(shù)字位數(shù)
- toFixed() 根據(jù)小數(shù)點(diǎn)后指定位數(shù)將數(shù)字轉(zhuǎn)換為字符串系枪,從不使用指數(shù)計數(shù)法
- toExponential() 根據(jù)指數(shù)記數(shù)法將數(shù)字轉(zhuǎn)換為指定形式字符串
- toPrecision() 根據(jù)指定的有效位數(shù)將數(shù)字轉(zhuǎn)換為字符串雀哨。如果有效數(shù)字的位數(shù)少于數(shù)字整數(shù)部分位數(shù),轉(zhuǎn)換成指數(shù)形式
var n = 123456.789;
n.toFixed(0); // '123457'
n.toFixed(2); // '123456.79'
n.toFixed(5); // '123456.78900'
n.toExponential(1); // '1.2e+5'
n.toExponential(3); // '1.235e+5'
n.toPrecision(4); // '1.235e+5'
n.toPrecision(7); // '123456.8'
n.toPrecision(10); // '123456.7890'
String => Number
- Number() 接受傳入一個字符串私爷,試圖將其轉(zhuǎn)換為一個整數(shù)或者浮點(diǎn)數(shù)直接量雾棺,基于十進(jìn)制數(shù)轉(zhuǎn)換,且不能帶非法字符
- parseInt() 只解析整數(shù)衬浑,并且可以通過字符串前綴“0X”或"0x" 解析為16進(jìn)制數(shù)
- parseFloat 解析浮點(diǎn)數(shù)和整數(shù)
parseInt("3 asd"); // => 3
parseInt("3.124"); // => 3
parseInt("0xff"); // => 255
parseInt("-0x7f"); // => -127
parseFloat("3.14 asdas") // => 3.14
parseFloat(".1") // => 0.1
parseInt(".1") // => NaN 整數(shù)不能以`.`開始
parseFloat("$111.11") // => NaN 數(shù)字不能以"$"開始
parseInt 可以接收第二個可選參數(shù)捌浩,指定數(shù)字轉(zhuǎn)換的基數(shù),合法范圍 2~36
parseInt("11",2); // => 3
parseInt("ff",16); // => 255
parseInt("zz",36); // => 1295
parseInt("077",8); // => 63
parseInt("077",10); // => 77
對象轉(zhuǎn)換為原始值
- Object => Boolean
所有對象(包括數(shù)組和函數(shù))都轉(zhuǎn)換為true
- Object => String
toString()
valueOf()
- Object => Number
valueOf()
toString()
js的對象到字符串轉(zhuǎn)換步驟:
- 如果對象有toString方法嚎卫,則調(diào)用這個方法嘉栓。如果返回一個原始值,則js將這個值轉(zhuǎn)換為字符串拓诸,返回字符串結(jié)果
- 如果對象沒有toString方法,或者這個方法不返回原始值麻昼,則調(diào)用valueOf方法奠支。如果存在這個方法,則js
調(diào)用抚芦。如果返回時原始值倍谜,js將這個值轉(zhuǎn)換為字符串迈螟,然后返回字符串結(jié)果 - 如果沒有以上兩個方法,或者以上2個方法返回的不是原始值尔崔,會拋出一個類型錯誤異常
js的對象到數(shù)字轉(zhuǎn)換過程:
js轉(zhuǎn)換數(shù)字過程與字符串過程差不多答毫,只是優(yōu)先使用valueOf
- 如果對象有valueOf方法,則調(diào)用這個方法季春。如果返回一個原始值洗搂,則js將這個值轉(zhuǎn)換為字符串,返回字符串結(jié)果
- 如果對象沒有valueOf方法载弄,或者這個方法不返回原始值耘拇,則調(diào)用toString方法。如果存在這個方法宇攻,則js
調(diào)用惫叛。如果返回時原始值,js將這個值轉(zhuǎn)換為字符串逞刷,然后返回字符串結(jié)果 - 如果沒有以上兩個方法嘉涌,或者以上2個方法返回的不是原始值,會拋出一個類型錯誤異常
為什么空數(shù)組和單個數(shù)字?jǐn)?shù)組會被轉(zhuǎn)換成0和單個數(shù)字夸浅?
- 數(shù)組繼承了Object默認(rèn)的valueOf方法仑最,返回一個對象而不是原始值,因此調(diào)用toString()方法题篷,這個方法返回一個原始值
因此數(shù)組到數(shù)字的轉(zhuǎn)換為空字符串词身,空字符串轉(zhuǎn)換成數(shù)字0 - 含有一個元素的數(shù)組轉(zhuǎn)換成字符串結(jié)果和單個元素轉(zhuǎn)換字符串的結(jié)果一樣。轉(zhuǎn)換成單個數(shù)字的字符串番枚,然后轉(zhuǎn)換成數(shù)字
"+"運(yùn)算符的一個數(shù)字法严,一個操作數(shù)是對象,情況如何葫笼?
js將使用“特殊方法”將對象轉(zhuǎn)換成原始值深啤,而不是其他運(yùn)算符的方法執(zhí)行對象到數(shù)字的轉(zhuǎn)換,“==”運(yùn)算符與此類似路星。
如果將對象和原始值比較溯街,則轉(zhuǎn)換會將對象到原始值的轉(zhuǎn)換方式進(jìn)行
“+”、“==”應(yīng)用在對象到原始值的轉(zhuǎn)換特殊情形
如果涉及到日期對象洋丐,而日期類是js中唯一的預(yù)先定義類型呈昔,定義了有意義的向字符串和數(shù)字的轉(zhuǎn)換。
對于所有非日期對象友绝,對象到原始值的轉(zhuǎn)換基本上是對象到數(shù)字的轉(zhuǎn)換堤尾,也就是首先調(diào)用valueOf。
對于日期對象迁客,則使用對象到字符串的轉(zhuǎn)換模式郭宝,通過valueOf或toString返回的原始值被直接使用辞槐,而不會被強(qiáng)制轉(zhuǎn)換為數(shù)字或字符串,與其他的轉(zhuǎn)換有一些不同
"<"運(yùn)算符
所有關(guān)系運(yùn)算符對對象做對象到原始值的轉(zhuǎn)換粘室,但要出去日期對象情形榄檬。任何對象都好首先嘗試調(diào)用valueOf,然后調(diào)用toString衔统。
不管得到的原始值能否被直接使用鹿榜,都不會進(jìn)一步轉(zhuǎn)換為數(shù)字或字符串。
"+" "==" "!=" 和關(guān)系運(yùn)算符是唯一執(zhí)行這種特殊的字符串到原始值的轉(zhuǎn)換方式的運(yùn)算符
其他運(yùn)算符到特定類型的轉(zhuǎn)換都很明確缰冤,而且對日期對象來講犬缨,也沒有特殊情形
var now = new Date();
typeof(now + 1); // "string","+"將日期轉(zhuǎn)換為字符串
typeof(now - 1); // "number" ,"-" 將使用對象到數(shù)字的轉(zhuǎn)換
now == now.toString(); // true ,隱式的和顯式的字符串轉(zhuǎn)換
now > (now - 1); // true棉浸,">"將日期轉(zhuǎn)換為數(shù)字