數據類型轉換,普通類型(原始對象)和對象的區別的一些知識點

1、數據類型轉換:
JS是一門動態類型的語言,變量數據類型沒有限制,能夠隨時賦值,可是運算時是對數據類型有要求的,若是運算類型不符,js會自動強制轉換類型後再進行計算。
'2'-1函數

'2'是string類型1是number類型,兩個數據類型不一樣,可是進行了減法運算,運算前js會自動嘗試將string類型轉爲number類型後再進行運算。spa

2、任意值轉字符串:
js提供瞭如下API進行轉換,String(?),?.toString()code

var a0 = 0;
var a1 =true;
var a2 = undefined;
var a3 = null;
var a4 = {};

String(a0)
"0"
String(a1)
"true"
String(a2)
"undefined"
String(a3)
"null"
String(a4)
"[object Object]"

a0.toString()
"0"
a1.toString()
"true"
a2.toString()
VM308:1 Uncaught TypeError: Cannot read property 'toString' of undefined
    at <anonymous>:1:4
(anonymous) @ VM308:1
a3.toString()
VM315:1 Uncaught TypeError: Cannot read property 'toString' of null
    at <anonymous>:1:4
(anonymous) @ VM315:1
a4.toString()
"[object Object]"

經過上述代碼能夠發現,null,和undefined能夠用String可是不能用toString,由於他們沒有toString()方法。對象

var a0 = 0 + '';
var a1 = true + '';
var a2 = undefined + '';
var a3 = null + '';
var a4 = {} + '';
undefined
a0
"0"
a1
"true"
a2
"undefined"
a3
"null"
a4
"[object Object]"

也能夠經過加一個空字符串來轉成字符串類型,該方法核心在於加號,加號若是發現左右兩邊任意有字符串,就會嘗試將另一邊也轉成字符串。blog

3、任意值轉布爾值:
js提供瞭如下Boolean()方法進行轉換,還能夠經過!!取反兩次進行轉換圖片

var a0 = 0;
var a1 = true;
var a2 = undefined;
var a3 = null;
var a4 = {};
undefined
Boolean(a0)
false
Boolean(a1)
true
Boolean(a2)
false
Boolean(a3)
false
Boolean(a4)
true
!!a0
false
!!a1
true
!!a2
false
!!a3
false
!!a4
true

全部的數據類型中,有5種特殊值是false。number類型的0和NaN是false,空字符串‘’也是false,全部的對象都是true即便是空對象也是。
5個falsy值ip

var a = 0
var a1 = NaN
Boolean(a)
false
Boolean(a1)
false

var a2 = ''
Boolean(a2)
false

var a3 = null
Boolean(a3)
false

var a4 = undefined
Boolean(a4)
false

4、任意值轉數值:
js提供瞭如下API進行轉換,
一、Number():
Number()方法會對字符串進行轉換,如能夠轉換成number類型則轉爲對應的數值,若是不能則返回NaN。內存

// 空字符串轉爲0
Number('') // 0

// 布爾值:true 轉成 1,false 轉成 0
Number(true) // 1
Number(false) // 0

// undefined:轉成 NaN
Number(undefined) // NaN

// null:轉成0
Number(null) // 0

// 字符串:若是不能夠被解析爲數值,返回 NaN
Number('324abc') // NaN

二、parseInt(string, radix),parseFloat(),parseFloat通常用來轉浮點數
string要被解析的值。若是參數不是一個字符串,則將其轉換爲字符串(使用 ToString 抽象操做)。字符串開頭的空白符將會被忽略。radix一個介於2和36之間的整數(數學系統的基礎),表示上述字符串的基數。好比參數"10"表示使用咱們一般使用的十進制數值系統。始終指定此參數能夠消除閱讀該代碼時的困惑而且保證轉換結果可預測。當未指定基數時,不一樣的實現會產生不一樣的結果,一般將值默認爲10。字符串

Number()函數將字符串轉爲數值,要比parseInt()和parseFloat()函數嚴格不少。Number()只要有一個字符沒法轉成數值,整個字符串就會被轉爲NaN,而parseInt()和parseFloat()會嘗試將字符串前面的數字轉成數字。若是要轉的字符串第一位就沒法轉換則返回NaN數學

var a = '123abc'
Number(a)//字符串a,Number直接返回NaN
NaN

parseInt(a,10)//字符串a,parseInt則將字符串前面的123轉成數字
123

parseFloat(a)
123

var a = 'abc123'
parseInt(a,10)
NaN
parseFloat(a)
NaN


除了使用parseInt(string, radix),parseFloat(),通常多使用【-0】和【+0】方法進行轉換
'1'-0
1

'1.21'-0
1.21

'-1'-0
-1

'-1.21'-0
-1.21

5、普通類型和包裝對象:
一、所謂「包裝對象」,指的是與數值、字符串、布爾值分別相對應的Number、String、Boolean三個原始對象。這三個原始對象能夠把原始類型的值變成(包裝成)對象。

var a = new Number(123);
var b = new String('abc');
var c = new Boolean(true);

var a1 = 123;
var b1 = 'abc';
var c1 = true;

當帶有new操做符時,是看成對象而且JS提供了一些方法,不帶new聲明是,值直接是存在棧內存,帶new操做符時當對象是存在堆內存。經過下面代碼能夠看到,經過new聲明提供了不少方法。

var a = 'a'
var b = new String('b')

console.log(a)
a


console.log(b)
String {"b"}....

6、普通類型(原始對象)和包裝對象的轉換:
某些場合,原始類型的值會自動看成包裝對象調用,即調用包裝對象的屬性和方法。這時,JavaScript 引擎會自動將原始類型的值轉爲包裝對象實例,並在使用後馬上銷燬實

var a = 'abc'
//聲明一個普通字符串類型(原始對象),其自己並無length屬性
a.length    
//調用a.length時JS引擎會自動將var a = 'abc'轉成var a = new String(a)
3
a.name = 'zhang'
"zhang"
//a轉爲包裝對象後加了一個name屬性
a.name 
//可是a.name卻返回undefined,這是由於原始類型的值轉爲包裝對象使用後馬上銷燬
undefined

7、關於內存的一些知識點:
在js普通(簡單)數據類型,存到棧內存,複雜類型存到堆內存,string二者均可以存。
圖片描述
圖片描述
棧內存和堆內存數據組織形式不一樣。
圖片描述
示例解析:
第一:a是一個對象,棧內存地址假設是addr1,值保存在堆內存。
第二:聲明變量b等於變量a,則變量b也是一個對象,由於b=a,因此棧內存b的地址也
是addr1,而且堆內存不會重複保存b的值。
第三:從新給變量b賦值且值是對象類型,此時會在堆內存保存b的值。
結果:a.name返回的是a,由於b第二次賦值時在堆內存已經保存了它的值,a和b在堆內存有各自的值互不影響。
圖片描述

示例解析:
第一:a是一個對象,棧內存地址假設是addr1,值保存在堆內存。
第二:聲明變量b等於變量a,則變量b也是一個對象,由於b=a,因此棧內存b的地址也是addr1,堆內存不重複保存b的值。
第三:變量a和b兩個棧內存地址是相同的,都指向堆內存的地址addr1,此時修改a.name或者b.name都會將堆內存數據覆蓋。
結果:a.name返回的是b,由於b.name已經修改了堆內存內保存的數據
圖片描述

相關文章
相關標籤/搜索