JavaScript 從入門到放棄 - 2 - 類型/值/變量

詞法結(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ù)組
    
  • 標(biāo)示符利赋、保留字

  • 可選的分號

    1. 在任何需要分割的地方使用 ; 進(jìn)行分隔
    2. 在任何可以省略分號的地方都將其省略

    如果不使用分號,由于語句的分隔規(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ù)字截取字符串

布爾值

布爾值:truefalse

比較語句結(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ù)
  1. toFixed() 根據(jù)小數(shù)點(diǎn)后指定位數(shù)將數(shù)字轉(zhuǎn)換為字符串系枪,從不使用指數(shù)計數(shù)法
  2. toExponential() 根據(jù)指數(shù)記數(shù)法將數(shù)字轉(zhuǎn)換為指定形式字符串
  3. 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ù)字
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怀薛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子迷郑,更是在濱河造成了極大的恐慌枝恋,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗡害,死亡現(xiàn)場離奇詭異焚碌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)霸妹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門十电,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叹螟,你說我怎么就攤上這事鹃骂。” “怎么了罢绽?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵畏线,是天一觀的道長。 經(jīng)常有香客問我良价,道長寝殴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任明垢,我火速辦了婚禮蚣常,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘痊银。我一直安慰自己史隆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布曼验。 她就那樣靜靜地躺著泌射,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鬓照。 梳的紋絲不亂的頭發(fā)上熔酷,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音豺裆,去河邊找鬼拒秘。 笑死,一個胖子當(dāng)著我的面吹牛臭猜,可吹牛的內(nèi)容都是我干的躺酒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼蔑歌,長吁一口氣:“原來是場噩夢啊……” “哼羹应!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起次屠,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤园匹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后劫灶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裸违,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年本昏,在試婚紗的時候發(fā)現(xiàn)自己被綠了供汛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡涌穆,死狀恐怖怔昨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蒲犬,我是刑警寧澤朱监,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站原叮,受9級特大地震影響赫编,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奋隶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一擂送、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唯欣,春花似錦嘹吨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碰纬。三九已至,卻和暖如春问芬,著一層夾襖步出監(jiān)牢的瞬間悦析,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工此衅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留强戴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓挡鞍,卻偏偏與公主長得像骑歹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子墨微,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

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

  • 序 從最近的js入門系列的閱讀量逐步遞減道媚,觀眾老爺?shù)呐d趣也不再能夠接受一些細(xì)節(jié)性的地方深度挖掘,讓我有了一些思考欢嘿。...
    zhaolion閱讀 1,583評論 5 19
  • 9.正則表達(dá)式 首先炼蹦,js定義了RegExp()構(gòu)造函數(shù)羡宙,用來創(chuàng)建表示文本匹配模式的對象。這就是正則表達(dá)式掐隐。正則表...
    我就是z閱讀 666評論 0 5
  • 表達(dá)式和運(yùn)算符 程序中最簡單的表達(dá)式就是狗热,程序中的常量 變量名也是一種簡單的表達(dá)式 復(fù)雜的表達(dá)式是由簡單的表達(dá)式組...
    zhaolion閱讀 1,634評論 3 12
  • 有沒有嘗試過所有人都不相信你的那種無助感?那種感覺就好像你是孤身一人虑省,好像曾經(jīng)那些在你身邊的只是你的影子匿刮,那些人都...
    可可豆子閱讀 175評論 0 5
  • 一本書:《非暴力溝通》by馬歇爾盧森堡 兩首歌:《我想更懂你》by潘瑋柏vs蘇芮 《可惜沒如果》...
    請叫我李大俠閱讀 265評論 0 0