陪你讀書-JS-第十期總結
1.JS中數據類型
基礎數據類型:string、number、boolean、undefined、null
複雜數據類型:object
2.三個開發上的建議
- 當你需要新建一個變量並且需要賦值,或者新建一個對象需要爲對象的屬性賦值時,可以用null
- 但判斷一個函數的某一個參數是否傳入的時候通常使用
=== 'undefined'
進行判斷 - 檢測某一個值是否存在或者是否爲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
- 小數:
0.1 + 0.2 != 0.3
原因爲js表示數字時是用二進制表示數字的,可以這樣計算:0.1x10 + 0.2x10 = 3 3/10 =0.3
- NaN: not a number 是一個不等於任何數字的數字類型,
typeof(NaN)= “number”
,NaN !== NaN
,它是唯一一個不等於它本身的數字 - 字符串:本質是一個unicode編碼的序列,length屬性返回的是unicode編碼的長度,一個漢字返回的長度是1
- 理論上只有對象(Object)可以使用屬性和方法的引用,字符串引用方法時,會先判斷表達式是不是對象,若不是對象,就會直接報錯,在所有的基本類型中,只有
null
和undefined
不能轉換爲對象(Object) - 複雜數據類型:object,是由屬性和屬性的值所組成的無序列表的合集
5.對象和原始類型的區別
- 對象有屬性
- 對象有方法:方法本身是一種特殊的方法
- 對象是可以改變的
6.對象的分類
- 常用對象:String,Boolean,正則表達式,Object,Number,Function,Array,Date
- 內置對象:Global,Math,Json 與其他對象的區別就是,如果使用內置對象的時候是不需要用new操作符的,可以直接使用
- 數組對象:Windows,和JS本身運行環境有關係的
- 自定義對象:
7.基礎數據類型和對象的轉化
- 原始類型<->原始類型(相互轉換)
(1)原始類型<->字符串,直接加倆""
(2) 原始類型<->數字Boolean -> string :"true" or "false", Number -> String: 10.toString() = 10(默認以十進制爲基) 基模式:10.toString(2) = 1010, 10.toString(8) = 12, 10.toString(16) = A
ECMAScript 提供了兩種把非數字的原始值轉換成數字的方法,即Number(undefined) // NaN Number(null) // 0 Number(true) // 1 Number(false) // 0 Number('123') // 123 Number('1abc) // NaN Number('') // 0
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
(4)強制類型轉換Boolean(undefined) // false Boolean(null) // false Boolean(+0) // false Boolean(-0) // false Boolean('') // false Boolean(NaN) // false Boolean({}) // true
您還可以使用強制類型轉換(type casting)來處理轉換值的類型。使用強制類型轉換可以訪問特定的值,即使它是另一種類型的。
編者注:cast 有“鑄造”之意,很貼合“強制轉換”的意思。
ECMAScript 中可用的 3 種強制類型轉換如下:- Boolean(value) - 把給定的值轉換成 Boolean 型;
- Number(value) - 把給定的值轉換成數字(可以是整數或浮點數);
- String(value) - 把給定的值轉換成字符串;強制轉換成字符串和調用 toString() 方法的唯一不同之處在於,對
null
和undefined
值強制類型轉換可以生成字符串而不引發錯誤:
用這三個函數之一轉換值,將創建一個新值,存放由原始值直接轉換成的值。這會造成意想不到的後果。var s1 = String(null); //"null" var oNull = null; var s2 = oNull.toString(); //會引發錯誤
Number()
函數的強制類型轉換與parseInt()
和parseFloat()
方法的處理方式相似,只是它轉換的是整個值,而不是部分值。
parseInt()
和parseFloat()
方法只轉換第一個無效字符之前的字符串,因此"1.2.3"
將分別被轉換爲1
和1.2
。
用Number()
進行強制類型轉換,"1.2.3"
將返回NaN
,因爲整個字符串值不能轉換成數字。如果字符串值能被完整地轉換,Number()
將判斷是調用parseInt()
方法還是parseFloat()
方法。 - 原始類型<->對象
PS:只有null和undefined不能轉換爲對象(Object)
數字和bool->對象:l轉換爲object時爲一個對象,對象的名字叫原始值Object (true) = [Boolean: true] Object (3) = [Number: 3]
字符串->對象 Object ('abc') = [String: 'abc']
對象->boolean 均爲true
對象->字符串 先toString
後valueOf
,若valueOf
後返回結果是原始類型則result->字符串的轉換,
對象->數字,先valueOf
後toString
,若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類型進行比較時,先轉換爲數字再進行比較,等號和非等號( ==
, !=
)
- 在 ECMAScript 中,等號由雙等號(==)表示,當且僅當兩個運算數相等時,它返回
true。非等號由感嘆號加等號(!=)表示,當且僅當兩個運算數不相等時,它返回
true。爲確定兩個運算數是否相等,這兩個運算符都會進行類型轉換。 執行類型轉換的規則如下:- 如果一個運算數是 Boolean 值,在檢查相等性之前,把它轉換成數字值。false 轉換成 0,true 爲 1。
- 如果一個運算數是字符串,另一個是數字,在檢查相等性之前,要嘗試把字符串轉換成數字。
- 如果一個運算數是對象,另一個是字符串,在檢查相等性之前,要嘗試把對象轉換成字符串。
- 如果一個運算數是對象,另一個是數字,在檢查相等性之前,要嘗試把對象轉換成數字。
在比較時,該運算符還遵守下列規則: 值 null 和 undefined 相等。 在檢查相等性時,不能把 null 和 undefined 轉換成其他值。 如果某個運算數是 NaN,等號將返回 false,非等號將返回 true。
如果兩個運算數都是對象,那麼比較的是它們的引用值。如果兩個運算數指向同一對象,那麼等號返回 true,否則兩個運算數不等。
重要提示: 即使兩個數都是 NaN,等號仍然返回 false,因爲根據規則,NaN 不等於 NaN。 全等號和非全等號
- 全等號由三個等號表示(
===
),只有在無需類型轉換運算數就相等的情況下,才返回 true。