JavaScript中原始值的理解
原始值:
概念:原始型別的值就是原始值,即原始值有string,、number、boolean、null和undefined五種。
valueOf() 和 toString() 方法的使用:
-
null和undefined沒有valueOf和toString方法,呼叫時報錯。
-
預設情況下呼叫的是valueOf方法:
每個JavaScript物件的 valueOf 方法定義不同:
物件 | 返回值 |
---|---|
String | 字串值 |
Number | 數字值 |
Boolean | Boolean 值 |
Object | 物件本身 |
Array | 陣列的元素被轉換為字串,這些字串由逗號分隔,連線在一起。其操作與 Array.toString 和 Array.join 方法相同 |
Function | 函式本身 |
Date | 儲存的時間是從 1970 年 1 月 1 日午夜開始計的毫秒數 UTC |
詳見:http://coolcao.com/2016/08/19/js物件的toString-方法和valueOf-方法/
// 函式: <script> var f = function () {} console.log(f) // ƒ () {} console.log(f.toString()) // function () {} console.log(f.valueOf()) // f () {} </script> // 物件 <script> var obj = {a: 1, b: 'ss'} console.log(obj) // {a: 1, b: "ss"} console.log(obj.toString()) // [object Object] console.log(obj.valueOf()) // {a: 1, b: "ss"} </script>
(1)呼叫物件的valueOf方法,如果返回值是原始值直接返回,否則返回物件本身。
(2)對於陣列,如果不重寫其toString()方法,其預設實現就是呼叫陣列的 join()方法返回值作為toString()的返回值。
例1:
[1,2,3].toString() // '1,2,3'
var str = new String("11")
console.log(str) //String {"11"}
console.log(str.valueOf()) // 11 (typeof返回string)
console.log(str.toString()) // 11 (typeof返回string)
str.valueOf()的返回值為11的原因:
此處的valueOf方法呼叫的是String原型上的valueOf方法,而非Object物件原型上的valueOf方法,原型鏈結構中String.prototype在Object.prototype之前,而String.prototype.valueOf方法返回的是一個字串,故返回值為11。
例2:
<script>
var obj = new Object({a: 1})
console.log(obj) // {a: 1}
console.log(obj.valueOf()) // {a: 1}
console.log(obj.toString()) // [object Object]
console.log(obj + 1) // [object Object]1
</script>
原因:使用物件進行運算時,首先呼叫的是valueOf方法,此時valueOf的返回值仍舊是物件,因此會再呼叫toString方法進行運算,故返回值時[object Object]1。
判斷一個值的具體型別:
使用Object.prototype.toString().call(val)
返回值有:
String | Number | Boolean | Null | Undefined | Function | Array | Object | RegExp | Date | Error | Arguments