Javascript 數據類型、數值類型、數據類型轉換、一元操作符、二元操作符

1.JS中數據類型

基礎數據類型:string、number、boolean、undefined、null
複雜數據類型:object

2.三個開發上的建議

  1. 當你需要新建一個變量並且需要賦值,或者新建一個對象需要爲對象的屬性賦值時,可以用null
  2. 但判斷一個函數的某一個參數是否傳入的時候通常使用 === 'undefined'進行判斷
  3. 檢測某一個值是否存在或者是否爲null用 === null 進行判斷

3.只有6個值在進行bool類型轉換的時候可以轉換爲false

這6個值爲:undefined、null、 +0、-0、’’、NaN 空數據和{}爲true

Boolean(undefined)		// false
Boolean(null)			// false
Boolean(+0)				// false
Boolean(-0)				// false
Boolean('')				// false
Boolean(NaN)			// false
Boolean({})				// true

4.數值類型:常規的數字,無窮,NaN

  1. 小數:0.1 + 0.2 != 0.3 原因爲js表示數字時是用二進制表示數字的,可以這樣計算:
    0.1x10 + 0.2x10 = 3
    3/10 =0.3
    
  2. NaN: not a number 是一個不等於任何數字的數字類型,typeof(NaN)= “number”NaN !== NaN,它是唯一一個不等於它本身的數字
  3. 字符串:本質是一個unicode編碼的序列,length屬性返回的是unicode編碼的長度,一個漢字返回的長度是1
  4. 理論上只有對象(Object)可以使用屬性和方法的引用,字符串引用方法時,會先判斷表達式是不是對象,若不是對象,就會直接報錯,在所有的基本類型中,只有nullundefined不能轉換爲對象(Object)
  5. 複雜數據類型:object,是由屬性和屬性的值所組成的無序列表的合集

5.對象和原始類型的區別

  1. 對象有屬性
  2. 對象有方法:方法本身是一種特殊的方法
  3. 對象是可以改變的

6.對象的分類

  1. 常用對象:String,Boolean,正則表達式,Object,Number,Function,Array,Date
  2. 內置對象:Global,Math,Json 與其他對象的區別就是,如果使用內置對象的時候是不需要用new操作符的,可以直接使用
  3. 數組對象:Windows,和JS本身運行環境有關係的
  4. 自定義對象:

7.基礎數據類型和對象的轉化

  1. 原始類型<->原始類型(相互轉換)
    (1)原始類型<->字符串,直接加倆""
     Boolean -> string :"true" or "false",
     Number -> String:
     10.toString() = 10(默認以十進制爲基)
     基模式:10.toString(2) = 1010, 10.toString(8) = 12, 10.toString(16) = A
    
    (2) 原始類型<->數字
    Number(undefined)		// NaN
    Number(null)			// 0
    Number(true)				// 1
    Number(false)				// 0
    Number('123')				// 123
    Number('1abc)			// NaN
    Number('')				// 0
    
    ECMAScript 提供了兩種把非數字的原始值轉換成數字的方法,即 parseInt()parseFloat()
    正如您可能想到的,前者把值轉換成整數,後者把值轉換成浮點數。只有對 String 類型調用這些方法,它們才能正確運行;對其他類型返回的都是 NaN。
    parseInt(12345red) = 12345, parseInt(“AF”, 16) = 175 // (基模式)
    parseFloat()只能是十進制,不能有基模式,
    第一個出現的小數點是有效字符。如果有兩個小數點,第二個小數點將被看作無效的。parseFloat() 會把這個小數點之前的字符轉換成數字。這意味着字符串 "11.22.33" 將被解析成 11.22
    使用 parseFloat() 方法的另一不同之處在於,字符串必須以十進制形式表示浮點數,而不是用八進制或十六進制。該方法會忽略前導 0,所以八進制數 0102 將被解析爲 102。對於十六進制數 0xA,該方法將返回 NaN,因爲在浮點數中,x 不是有效字符。(註釋:經測試,具體的瀏覽器實現會返回 0,而不是 NaN。)
    (3) 原始類型<->bool
    只有6個值在進行bool類型轉換的時候可以轉換爲false
    這6個值爲:undefined、null、 +0、-0、’’、NaN 空數據和{}爲true
    Boolean(undefined)		// false
    Boolean(null)			// false
    Boolean(+0)				// false
    Boolean(-0)				// false
    Boolean('')				// false
    Boolean(NaN)			// false
    Boolean({})				// true
    
    (4)強制類型轉換
    您還可以使用強制類型轉換(type casting)來處理轉換值的類型。使用強制類型轉換可以訪問特定的值,即使它是另一種類型的。
    編者注:cast 有“鑄造”之意,很貼合“強制轉換”的意思。
    ECMAScript 中可用的 3 種強制類型轉換如下:
    • Boolean(value) - 把給定的值轉換成 Boolean 型;
    • Number(value) - 把給定的值轉換成數字(可以是整數或浮點數);
    • String(value) - 把給定的值轉換成字符串;強制轉換成字符串和調用 toString() 方法的唯一不同之處在於,對 nullundefined 值強制類型轉換可以生成字符串而不引發錯誤:
    var s1 = String(null);     //"null"
    var oNull = null;
    var s2 = oNull.toString();      //會引發錯誤
    
    用這三個函數之一轉換值,將創建一個新值,存放由原始值直接轉換成的值。這會造成意想不到的後果。
    Number() 函數的強制類型轉換與 parseInt()parseFloat() 方法的處理方式相似,只是它轉換的是整個值,而不是部分值。
    parseInt()parseFloat() 方法只轉換第一個無效字符之前的字符串,因此 "1.2.3" 將分別被轉換爲 11.2
    Number() 進行強制類型轉換,"1.2.3" 將返回 NaN,因爲整個字符串值不能轉換成數字。如果字符串值能被完整地轉換,Number() 將判斷是調用 parseInt() 方法還是 parseFloat() 方法。
  2. 原始類型<->對象
    PS:只有null和undefined不能轉換爲對象(Object)
    數字和bool->對象:l轉換爲object時爲一個對象,對象的名字叫原始值
    Object (true) = [Boolean: true]
    Object (3) = [Number: 3]
    

字符串->對象 Object ('abc') = [String: 'abc']
對象->boolean 均爲true
對象->字符串toStringvalueOf,若valueOf後返回結果是原始類型則result->字符串的轉換,
對象->數字,先valueOftoString,若valueOf後返回結果是原始類型,則直接返回回來,若還是object,則再調用toString,若返回結果result是原始類型,則result->數字的轉換,若不是,則報錯(Number([])=0,Number({})=NaN)
PS:toString()是可以接收參數的,表示的是幾進制的數,範圍爲2-36,Math.random().toString(36)生成序列書

8.變量定義

使用var: 局部變量(作用於是當前的函數),創建的變量不可刪除,變量會被提前
不使用var: 全局變量,創建的變量可以刪除(windows上面的一個屬性),變量不會被提前

9.一元操作符:很高的優先級,僅在. , () []之後

(1)、+、-、前++、後++、前–、後–、!、typeof、void、delete,typeof後面的括號()最好寫上,!轉換成布爾值;

Boolean(3) == !!(3)			// true
String(3) == 3 + ''			// true
+'123' == Number(123)		// true

delete 運算符刪除對以前定義的對象屬性或方法的引用。例如:

var o = new Object;
o.name = "David";
alert(o.name);  //輸出 "David"
delete o.name;
alert(o.name);  //輸出 "undefined"

在這個例子中,刪除了 name 屬性,意味着強制解除對它的引用,將其設置爲 undefined(即創建的未初始化的變量的值)。
delete 運算符不能刪除開發者未定義的屬性和方法。例如,下面的代碼將引發錯誤:

delete o.toString;

即使 toString 是有效的方法名,這行代碼也會引發錯誤,因爲 toString() 方法是原始的 ECMAScript 方法,不是開發者定義的。
一元加法和一元減法
儘管一元加法對數字無作用,但對字符串卻有有趣的效果,會把字符串轉換成數字。

var sNum = "20";
alert(typeof sNum);     //輸出 "string"
var iNum = +sNum;
alert(typeof iNum);     //輸出 "number"

(2)、位運算 NOT
位運算 NOT 由否定號(~)表示,它是 ECMAScript 中爲數不多的與二進制算術有關的運算符之一。位運算 NOT 實質上是對數字求負,然後減 1,
(3)、邏輯 NOT(!)邏輯 NOT 運算符返回的一定是 Boolean 值。
邏輯 NOT 運算符的行爲如下:

  • 如果運算數是對象,返回 false
  • 如果運算數是數字 0,返回 true
  • 如果運算數是 0 以外的任何數字,返回 false
  • 如果運算數是 null,返回 true
  • 如果運算數是 NaN,返回 true
  • 如果運算數是 undefined,返回 true
!{}				// false
!0				// true
!3				// false
!null				// true
!NaN			// true
!undefined		// true

10.二元操作符

&& 、||、+、-、x、/

1.加法運算符

與乘性運算符一樣,在處理特殊值時,ECMAScript 中的加法也有一些特殊行爲:

1 + NaN = NaN
-Infinity +  -Infinity = Infinity
Infinity +  -Infinity = NaN
+0 + +0 = +0
-0 + +0 = +0
-0 + -0 = -0
undefined + true = NaN
null + false = 0
1 + false = 1
1 + true = 2
{name: '張三'} + {age: 24} = [object Object][object Object]

不過,如果某個運算數是字符串,那麼採用下列規則:

  • 如果兩個運算數都是字符串,把第二個字符串連接到第一個上。'hello' + 'word' // helloword
  • 如果只有一個運算數是字符串,把另一個運算數轉換成字符串,結果是兩個字符串連接成的字符串。'hello' + 123 // hello123
  • 注意:爲了避免 JavaScript 中的一種常見錯誤,在使用加法運算符時,一定要仔細檢查運算數的數據類型。
2.減法運算符

在處理特殊值時,減法運算符也有一些特殊行爲:

console.log(1 - NaN)							// NaN
console.log( Infinity -  Infinity)			// NaN
console.log( -Infinity -  -Infinity)			// NaN
console.log( Infinity -  -Infinity)				// Infinity
console.log( -Infinity -  Infinity)				// -Infinity
console.log(+0 - +0)							// +0
console.log(-0 - -0)							// -0
console.log(+0 - -0)							// +0
console.log('hello' - 12)							// NaN(某個運算符不是數字,也不能強制轉化爲數字)
3.邏輯 AND 運算符( && ),

邏輯 AND 運算的運算數可以是任何類型的,不止是 Boolean 值。
如果某個運算數不是原始的 Boolean 型值,邏輯 AND 運算並不一定返回 Boolean 值:

  • 如果一個運算數是對象,另一個是 Boolean 值,返回該對象。
  • 如果兩個運算數都是對象,返回第二個對象。
  • 如果某個運算數是 null,返回 null。
  • 如果某個運算數是 NaN,返回 NaN。
  • 如果某個運算數是 undefined,返回undefined 。
4.邏輯 OR 運算符( || )

與邏輯 AND 運算符相似,如果某個運算數不是 Boolean 值,邏輯 OR 運算並不一定返回 Boolean 值:

  • 如果一個運算數是對象,並且該對象左邊的運算數值均爲 false,則返回該對象。
  • 如果兩個運算數都是對象,返回第一個對象。
  • 如果最後一個運算數是 null,並且其他運算數值均爲 false,則返回 null。
  • 如果最後一個運算數是 NaN,並且其他運算數值均爲 false,則返回 NaN。
  • 如果某個運算數是 undefined,則根據另一個運算數返回。
undefined || null								// null
null || undefined								// undefined
undefined || 0								// 0
0 || undefined								// undefined
undefined || 123								// 123
undefined || 'hello'								// 'hello'
5.關係運算符< >

返回的結果是boolean類型,更偏向於數字的操作,任何包含 NaN 的關係運算符都要返回 false

6.等性運算符

ECMAScript 提供了兩套等性運算符:等號和非等號用於處理原始值,全等號和非全等號用於處理對象。
=== 全等:數據類型和值完全一致
== 相等:undefined == null,數字,字符串,boolean類型進行比較時,先轉換爲數字再進行比較,等號和非等號( == , != )

  1. 在 ECMAScript 中,等號由雙等號(==)表示,當且僅當兩個運算數相等時,它返回
    true。非等號由感嘆號加等號(!=)表示,當且僅當兩個運算數不相等時,它返回
    true。爲確定兩個運算數是否相等,這兩個運算符都會進行類型轉換。 執行類型轉換的規則如下:
    • 如果一個運算數是 Boolean 值,在檢查相等性之前,把它轉換成數字值。false 轉換成 0,true 爲 1。
    • 如果一個運算數是字符串,另一個是數字,在檢查相等性之前,要嘗試把字符串轉換成數字。
    • 如果一個運算數是對象,另一個是字符串,在檢查相等性之前,要嘗試把對象轉換成字符串。
    • 如果一個運算數是對象,另一個是數字,在檢查相等性之前,要嘗試把對象轉換成數字。
      在比較時,該運算符還遵守下列規則: 值 null 和 undefined 相等。 在檢查相等性時,不能把 null 和 undefined 轉換成其他值。 如果某個運算數是 NaN,等號將返回 false,非等號將返回 true。
      如果兩個運算數都是對象,那麼比較的是它們的引用值。如果兩個運算數指向同一對象,那麼等號返回 true,否則兩個運算數不等。
      重要提示: 即使兩個數都是 NaN,等號仍然返回 false,因爲根據規則,NaN 不等於 NaN。 全等號和非全等號
  2. 全等號由三個等號表示(===),只有在無需類型轉換運算數就相等的情況下,才返回 true。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章