String 和 toString 的區(qū)別

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 SymbolObject苟耻。其中 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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窃这,一起剝皮案震驚了整個濱河市瞳别,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杭攻,老刑警劉巖祟敛,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異兆解,居然都是意外死亡馆铁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門痪宰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叼架,“玉大人畔裕,你說我怎么就攤上這事」远” “怎么了扮饶?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長乍构。 經(jīng)常有香客問我甜无,道長,這世上最難降的妖魔是什么哥遮? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任岂丘,我火速辦了婚禮,結(jié)果婚禮上眠饮,老公的妹妹穿的比我還像新娘奥帘。我一直安慰自己,他們只是感情好仪召,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布寨蹋。 她就那樣靜靜地躺著,像睡著了一般扔茅。 火紅的嫁衣襯著肌膚如雪已旧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天召娜,我揣著相機(jī)與錄音运褪,去河邊找鬼。 笑死玖瘸,一個胖子當(dāng)著我的面吹牛秸讹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雅倒,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼嗦枢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屯断?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤侣诺,失蹤者是張志新(化名)和其女友劉穎殖演,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體年鸳,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡趴久,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了搔确。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彼棍。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡灭忠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出座硕,到底是詐尸還是另有隱情弛作,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布华匾,位于F島的核電站映琳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蜘拉。R本人自食惡果不足惜萨西,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旭旭。 院中可真熱鬧谎脯,春花似錦、人聲如沸持寄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽际看。三九已至咸产,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仲闽,已是汗流浹背脑溢。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赖欣,地道東北人屑彻。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像顶吮,于是被迫代替她去往敵國和親社牲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容