JavaScript型別比較和轉化規則

2021-09-10 19:19:18 字數 4608 閱讀 2850

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 ...