String 和 toString 方法都返回一個表示 String 對象的值泛啸,那他們之間有什么區(qū)別边琉?
區(qū)別一:定義的位置不同
String() 是 JavaScript 的全局函數(shù)属百;
window.hasOwnProperty('String')
// true
toString() 是 Object 原型的一個方法。
String('1')
// "1"
var a = '1';
a.toString();
// "1"
當(dāng)原始數(shù)據(jù)類型(boolean变姨,Number族扰、String)在調(diào)用方法時(shí),JS 將會創(chuàng)建對象定欧,以便調(diào)用方法屬性渔呵,而在使用完畢后將會銷毀該對象。
a 是一個字符串砍鸠,相當(dāng)于String的一個實(shí)例對象(具體可以看引用部分)扩氢,String對象有toString的方法,所以a繼承了String的原型方法:
typeof a === 'string'
// true
a.hasOwnProperty('toString')
// false
a.__proto__ === String.prototype
// true
String.prototype.hasOwnProperty('toString')
// true
a.__proto__.hasOwnProperty('toString')
// true
而我們又可以知道String是Function的實(shí)例對象爷辱,F(xiàn)unction是自身的實(shí)例對象录豺,F(xiàn)unction的原型對象的proto最終指向 Object,所以 String 的toString方法是繼承的 Object饭弓,然后重新改造的双饥。
String.__proto__ === Function.prototype
// true
Function.__proto__ === Function.prototype
// true
Function.prototype.__proto__ === Object.prototype
// true
包裝對象
這里需要引入包裝對象的概念,所謂“包裝對象”示启,就是分別于數(shù)字兢哭、字符串、布爾值對應(yīng)的 Number String Boolean
三個原生對象夫嗓;他們可以把原始對象的值包裝成對象。
包裝對象最大的 目的冲秽,首先使得JavaScript的對象涵蓋所有的值舍咖,其次使得原始類型的值可以方便的調(diào)用某些方法。
這三個對象作為構(gòu)造函數(shù)(有 new)時(shí)使用锉桑,可以將原始類型轉(zhuǎn)換為對象排霉;作為普通函數(shù)(沒有 new)使用,可以將任何類型的值民轴,轉(zhuǎn)為原始類型的值攻柠。
原始類型的值,可以自動當(dāng)作對象調(diào)用后裸,即調(diào)用各種對象的方法和參數(shù)瑰钮。這時(shí),JavaScript 引擎會自動將原始類型的值轉(zhuǎn)為包裝對象實(shí)例微驶,在使用后立刻銷毀實(shí)例浪谴。
var str = 'abc';
str.length // 3
// 等同于
var strObj = new String(str)
// String {
// 0: "a", 1: "b", 2: "c", length: 3, [[PrimitiveValue]]: "abc"
// }
strObj.length // 3
strObj = null
參考文章:https://www.bookstack.cn/read/javascript-tutorial/docs-stdlib-wrapper.md
區(qū)別二:Sting()可以完成對 null 和 undefined 的轉(zhuǎn)換
String() 可以將 null, undefined
轉(zhuǎn)化為字符串开睡;而 toString()不可以。
String(null)
// "null"
String(undefined)
// "undefined"
null.toString()
// Uncaught TypeError: Cannot read property 'toString' of null
undefined.toString()
// Uncaught TypeError: Cannot read property 'toString' of undefined
進(jìn)一步理解:
JavaScript 有六種基本數(shù)據(jù)類型 Number String Boolean null undefined Symbol
和 Object
苟耻。其中 Object 又包括 object array function Date RegExp
篇恒。
Symbol( 在 ECMAScript 6 中新添加的類型)。一種實(shí)例是唯一且不可改變的數(shù)據(jù)類型凶杖。
由于 null & undefined 作為一種單獨(dú)的數(shù)據(jù)類型胁艰,所以他們沒有繼承 Object.prototype,因此不存在 toString()的方法智蝠,報(bào)錯 Uncaught TypeError: Cannot read property 'toString' of undefined
腾么;而 String 作為一個全局的方法,是都可以獲取的寻咒。
null.__proto__
// Uncaught TypeError: Cannot read property '__proto__' of null
typeof null
// object
盡管typeof null === 'object' 為true哮翘,但是我們可以看到 null 并不存在 proto屬性,自然不會繼承 Object 的原型方法毛秘。
區(qū)別三:不同進(jìn)制之間的轉(zhuǎn)換
String()只支持轉(zhuǎn)為普通字符串饭寺,不支持轉(zhuǎn)為相應(yīng)進(jìn)制的字符串;
而Number.toString(radix)可以將一個Number對象轉(zhuǎn)換對應(yīng)進(jìn)制的字符串叫挟;其中radix可選艰匙,表示數(shù)字幾基數(shù)。
// 將十進(jìn)制轉(zhuǎn)化為二進(jìn)制
var num = 2;
num.toString(num, 2);
// "10"
我們也可以根據(jù)
Number.prototype.hasOwnProperty('toString') 為 true
來判斷 Number 有重寫 Object 的 toString 方法抹恳。
特別的:
(1)1.toString()報(bào)錯的問題
1.toString()
// Uncaught SyntaxError: Invalid or unexpected token
(1).toString()
// "1"
1..toString()
// "1"
這是因?yàn)?JavaScript引擎在解釋代碼時(shí)员凝,對于1.toString()認(rèn)為第一個.是浮點(diǎn)符號;第二個為屬性訪問的語法奋献,所以 1..toString()
正常健霹;而 (1).toString()
排除了小數(shù)點(diǎn)的影響所以也為正常;
(2)純小數(shù)的小數(shù)點(diǎn)后面有連續(xù)6個或6個以上的0時(shí)瓶蚂,小數(shù)將用e表示法輸出糖埋;
var num = 0.000006; //小數(shù)點(diǎn)后面有5個“0”
console.log(num.toString());
//"0.000006"
num = 0.0000006 ;//小數(shù)點(diǎn)后面有6個“0”
console.log(num.toString());
//"6e-7"
(3)浮點(diǎn)數(shù)整數(shù)部分的位數(shù)大于21時(shí),輸出時(shí)采用e表示法:
var num = 1234567890123456789012;
console.log(num.toString());
//"1.2345678901234568e+21"
參考文章:https://blog.csdn.net/huang100qi/article/details/80543045