number的轉化規則:
1.原始型別值
number(123) // 123
number('123') // 123
number('123abc') // nan
number('') // 0
number(true) // 1
number(false) // 0
number(null) // 0
number(undefined) // nan
number('\t\n\r123\t\n\r') // 123
number(nan) // nan
number()在進行轉化時會忽略前後的空格。
如:\t (製表符) \r (回車符) \n (換行符)
2.物件
轉化規則:
第一步:先呼叫valueof(),如果返回原始型別值,再使用number()。否則執行第二步:
第二步:呼叫tostring(),如果返回原始型別值,再使用number()。否則報錯。
number({}) // nan
number([1]) // 1
number([1, 2]) // nan
物件和陣列呼叫 valueof() 返回自身,{} 再呼叫 tostring() 返回 「[object object]」 (字串型別),再呼叫 number() 返回nan。
// number()轉化物件等價於
if (typeof obj.valueof() === 'object') else
覆寫物件的 valueof() 和 tostring() 方法:
// 例1:
var obj =
},tostring: function ()
}}number(obj) // uncaught typeerror: cannot convert object to primitive value
// 例2:
number(,
tostring: function ()
}) // 1
string的轉化規則
1.原始型別值
string('123') // '123'
string(123) // '123'
string(true) // 'true'
string(null) // 'null'
string(undefined) // 'undefined'
string(nan) // 'nan'
2.物件
轉化規則:(與number相反)
第一步:先呼叫tostring(),如果返回原始型別值,再使用string()。否則執行第二步:
第二步:呼叫valueof(),如果返回原始型別值,再使用string()。否則報錯。
string() // "[object object]"
string([1, 2, 3]) // "1,2,3"
string() // "[object object]"
// 等同於
string(.tostring()) // "[object object]"
覆寫物件的 tostring() 和 valueof() 方法:
// 例1:
var obj = ;
},valueof: function () ;
}};string(obj) // typeerror: cannot convert object to primitive value
// 例2:
string(,
tostring: function ()
}) // "2"
boolean的轉化規則
轉化為boolean為false的值:
null、undefined、nan、-0或+0、』』、false
boolean({}) // true
boolean() // true
boolean(new boolean(false)) // true
所有物件的布林值都是true,原因:出於效能的考慮,物件轉化為布林值可能需要過多的計算。為了保證效能,統一規定物件的布林值為true。
自動轉化
自動轉化為布林值
if (undefined) // if的隱式轉化
expression ? true: false // 三元表示式
!!expression
自動轉化為字串
在進行加法運算時,乙個值為字串,乙個值為非字串會自動將非字串的值轉化為字串進行運算。
'5' + 1 // '51'
'5' + true // "5true"
'5' + false // "5false"
'5' + {} // "5[object object]"
'5' + // "5"
'5' + function (){} // "5function (){}"
'5' + undefined // "5undefined"
'5' + null // "5null"
// 例1:
var obj = ,
tostring: function ()
}console.log('1' + obj) // '11'
// 例2:
var obj =
},tostring: function ()
}console.log('1' + obj) // '12'
// 例3:
var obj =
},tostring: function ()
}}console.log('1' + obj) // uncaught typeerror: cannot convert object to primitive value
在進行字串和非字串加法運算時,如果非字串為乙個物件會優先呼叫 valueof() 轉化為原始值型別,如果返回的是物件會再次呼叫 tostring() 轉化為原始值型別,再將其轉化為字串,再進行字串拼接。
自動轉化為數值
先將非數值型別通過 number() 轉化為數值型別,再進行運算。
'5' - '2' // 3
'5' * '2' // 10
true - 1 // 0
false - 1 // -1
'1' - 1 // 0
'5' * // 0
false / '5' // 0
'abc' - 1 // nan
null + 1 // 1
undefined + 1 // nan
+'abc' // nan
-'abc' // nan
+true // 1
-false // 0
比較規則
如果 x 或 y 中有乙個為 nan,則返回 false;
如果 x 與 y 皆為 null 或 undefined 中的一種型別,則返回 true(null == undefined // true);否則返回 false(null == 0 // false);
如果 x, y 型別不一致,且 x, y 為 string、number、boolean 中的某一型別,則將 x, y 使用 number() 轉化數值型別再進行比較;
如果 x,y 中有乙個為 object,則先轉化為原始型別,再進行比較。
注:在 ecmascript 中規定,如果 < 為 false,則 >= 為 true。
== ! // true
/**轉化過程:
1. 轉化為'',!轉化為布林值為false
2. 兩邊通過 number() 轉化為數值,均為0,故返回true */
nan !== nan // true
null > 0 // false
null < 0 // false
null == 0 // false
null >= 0 // true
null == undefined // true
// null只和undefined和null相等,和其他所有的值都不相等
{} + 1 // 1,這裡的 {} 被當成了**塊
+ 1 // 1
var obj = {}
obj + 1 // [object object]1
{} + {} // chrome 上顯示 "[object object][object object]",firefox 顯示 nan
+ {} // [object object]
{} + // 0
[2,3] + [1,2] // '2,31,2'
[2] + 1 // '21'
[2] + (-1) // "2-1"
{} + 值為 0 的原因,{} 被解析為**塊,即 {} + === + ,+ 會先通過 number()將 轉化為0。 JavaScript 型別和變數
在程式語言中,能夠表示並且操作的型別叫資料型別,但我們需要將值儲存起來以備以後使用的時候,我們就需要將值儲存到乙個變數中。js中資料分為兩類 原始型別 primitive type 和物件型別 object type 原始型別資料報括數字 字串和布林值,並且js中有兩個特殊的原始值null 空 和u...
javascript的( )等於比較
比較 x y,x 和 y 為值,需要產出true或false。比較過程如下 如果type x 與type y 的結果不一致,返回false,否則 如果type x 結果為 undefined,返回true如果type x 結果為 null,返回true如果type x 結果為 number,則 如果...
javascript陣列比較方法
最近工作需要用到物件比較,自己寫了一些,感覺滿足不了需求,又在網上找了一些,整理了一下,作為自己學習的筆記。array.prototype.unique function return re var o2o function o1,o2 長度比 if typeof o1.length typeof ...