一直沒搞懂js的數(shù)據(jù)類型隱式轉換,像下面在控制臺輸出的例子,不知道是根據(jù)什么規(guī)則進行轉換的:
求解答
首先對題主放截圖不放代碼的行為表示強烈譴責?。。?/strong>
然后擺結果,有歧義的備注//歧義了:
let d1 = false + []; //false
let d2 = [] + false; //false
let d3 = false + {}; //false[object Object]
let d4 = {} + false; //[object Object]false//歧義
let d5 = [] + {}; //[object Object]
let d6 = {} + []; //[object Object]//歧義
let d7 = ({} + []); //[object Object]
let d8 = ([] + {}); //[object Object]
console.log(d1);
console.log(d2);
console.log(d3);
console.log(d4);
console.log(d5);
console.log(d6);
console.log(d7);
console.log(d8);
上面的結果解釋起來就一句話,高程:
如果有一個操作數(shù)是對象、數(shù)值或布爾值,則調用它們的toString()
方法取得相應的字符串值,然后再應用前面關于字符串的規(guī)則
如果要分析的話,加上下面的就可以了:
[].toString();//""
false.toString();//"false"
let o={};
o.toString();//"[object Object]"
現(xiàn)在再來說,和題主的截圖有兩個 0 不一致的地方;
首先題主截圖沒問題,我測試了,我上面的結果也沒問題,也測試了;但是在平常應用中,應該遇不到那種情況,比方說 {}+[]
if()
,也不會得到 0;;然后我們來說原因,經(jīng)過上面的例子,你怕也知道了為什么會不一致了;
賦值=、if()、return 后面跟的都是表達式,上述歧義的括號版本,返回的就是預期內的數(shù)據(jù),因為括號里放的也是表達式;
{} + false//0
{} + []//0
({} + [])//[object Object]
([] + {})//[object Object]
那么當瀏覽器在遇到 {
時,是把它當表達式還是語句來解析呢?測試下就知道了:
很明顯是當成語句來解析的,如果當成一個空對象的表達式來解析,那么空對象是有 toString 方法的,再不濟,也應該是返回 undefined(非嚴格模式,瀏覽器端);在這種表達式和語句有歧義的地方,一般加個 () 就可以將語句轉為表達式,所以,下圖是不報錯的,并且返回正確:
那么繼續(xù),既然是 {
當成語句來解析,那么{}+[]
實際相當于語句{}
后面跟了一條無關緊要的表達式而已+[]
,也就是這樣:
{}
+[];
所以題主在控制臺執(zhí)行{}+[]
,實際上是返回了最后一條語句的結果+[]
,為什么這個結果是 0 呢?
這是一元加操作符
,高程上這么說:
在對非數(shù)值應用一元加操作符時,該操作符會像Number()
轉型函數(shù)一樣對這個值執(zhí)行轉換
所以:{}+[]
=>{};+[];
最終返回 Number([])
;
同理:{} + false
=>{};+false;
,最終返回 Number(false)
;
完。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學院和江蘇省首批服務外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術與教育服務機構,發(fā)展為教育服務業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網(wǎng)
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。