“死磕”JavaScript 程序錯誤:Cannot use 'in' operator...

問題再現(xiàn)

項目的背景:采用 react 系列 + ES6 + webpack凡蜻。

今天編程時亲善,JavaScript 程序報了這樣的錯誤:Cannot use 'in' operator to search for...肆糕,具體錯誤信息如下:

錯誤信息

解決思路

坦白說藻懒,這樣的錯誤最難調試却邓。因為它并不指向你所寫的具體代碼镀琉,而是泛泛指向了 lib.js 文件(該文件通常是第三方的打包壓縮庫)峦嗤,你幾乎無法依據(jù)錯誤類型與錯誤指向來定位到實際編程中的錯誤位置。

怎么辦屋摔?

在沒有章法的規(guī)律可循時烁设,這個時候,只有去學習并借鑒羅胖的“死磕”精神了!

死磕步驟:

  1. 依據(jù)故障頁面以及錯誤信息装黑,定位到出錯的文件副瀑,這一點應該不難;

  2. 在出錯的頁面中恋谭,依次點擊調試糠睡,看一看在哪一步開始報錯 了!很關鍵疚颊!比如狈孔,一開始加載就出錯了,那就定位到 js 文件的初始化部位材义;點擊某個按鈕出錯了均抽,那就定位到該按鈕的對應事件代碼中;以此類推其掂。

  3. 在定位的代碼范圍內油挥,采用“折中法”,一點點注釋掉款熬,刷新頁面查看是否依然出錯喘漏,如果出錯,這說明注釋掉部分的代碼沒有問題华烟,放開注釋,繼續(xù)其他可疑的代碼部分持灰;如果沒有錯誤了盔夜,恭喜你,你的定位位置就更加精細化了堤魁!總體思路就是如此喂链,循環(huán)往復,相信妥泉,總會有“撥開云霧見朗朗青天”的歡喜的椭微!

定位問題

就拿我的這次經(jīng)歷來說,經(jīng)歷的半個多小時的折騰與波折(主要精力都花在了一個 js 文件里盲链,因為很容易的就能定位到文件級別的)蝇率,我終于定位到了錯誤的代碼塊,如下:

console.log('rendernerererer: ', schoolData)

const schoolNode = (
    <Select style={{width: '100%'}} placeholder="請選擇所屬學校">
        { schoolData.length && schoolData.map((item, idx) => (
            <Option key={idx} value={`${item.id}`}>{item.name}</Option>
        )) }
    </Select>
);

再看看刽沾,這塊代碼在控制臺中的執(zhí)行信息:


定位錯誤信息

很顯然本慕,輸出了 renderererer,并且從中侧漓,可以得知:此時的 schoolData為空數(shù)組[]锅尘。然后,緊接著布蔗,就是開頭前面給出的那個錯誤信息再現(xiàn)了L傥ァ@烁!

說明了什么顿乒?

這不就說明了议街,就是 console.log() 下面的代碼導致的這樣的錯誤嗎!

OK淆游,終于定位到錯誤的根源了傍睹!查到錯誤后,解決就應該是順水推舟的事情了犹菱,我總覺得拾稳!

解決問題

人們常犯的一個錯誤就在于:我們過高的估計了自己的能力,而同時又往往過低的估計了對手的實力腊脱!可不是么访得?在基于 react 框架的開發(fā)過程中,類似于

<Select style={{width: '100%'}} placeholder="請選擇所屬學校">
        { schoolData.length && schoolData.map((item, idx) => (
            <Option key={idx} value={`${item.id}`}>{item.name}</Option>
        )) }
</Select>

這樣的代碼陕凹,我書寫得太常見悍抑、太普遍、太通用了杜耙,而且之前好像都沒有出現(xiàn)過什么錯誤搜骡,尤其是像這樣令我摸不著頭腦的 bug 更是沒有。

那么佑女,這一次究竟怎么了呢记靡?

其間具體研習探索細節(jié),在此不表团驱。只說結論吧:應該是在 Select 標簽中摸吠,當 schoolData 為空數(shù)組時,即schoolData.length0 了嚎花,結果即為false 寸痢,導致后續(xù)的schoolData.map() 也不會執(zhí)行。這樣就導致了形如:<Select>{ undefined }</Select> 的渲染結果紊选。 最終啼止,就導致了Cannot use 'in' operator to search for 'value' in undefined 的錯誤!

<Select></Select> 中可以為 <Select><option value="1">選擇</option></Select> 兵罢,或者 null 族壳,但是當為 undefined時就出現(xiàn)這樣的錯誤了!

OK趣些,下面給出最終修改后仿荆、可正確運行的版本一

const schoolData = this.state.schoolList;
console.log('rendernerererer: ', schoolData)

const schoolNode = (
    <Select style={{width: '100%'}} placeholder="請選擇所屬學校">
        { schoolData.length ? schoolData.map((item, idx) => (
            <Option key={idx} value={`${item.id}`}>{item.name}</Option>
        )) : <Option value=''>請選擇...</Option> }
    </Select>
);

或者,下面的版本二也可行:

const schoolData = this.state.schoolList;
console.log('rendernerererer: ', schoolData)

const schoolNode = (
    <Select style={{width: '100%'}} placeholder="請選擇所屬學校">
        { schoolData.length ? schoolData.map((item, idx) => (
            <Option key={idx} value={`${item.id}`}>{item.name}</Option>
        )) : null }
    </Select>
);

結尾的話

謹以記錄一下我的 web 前端 JavaScript 開發(fā)編程的學習心得,以上也都是我自己的一點習想拢操,難免有所疏漏锦亦,乃至根本就是錯誤的見解。如有方家看出令境,還請指正杠园!謝謝您的閱讀!別忘了點贊呦~~
也歡迎光臨 我的github

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末舔庶,一起剝皮案震驚了整個濱河市抛蚁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惕橙,老刑警劉巖瞧甩,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異弥鹦,居然都是意外死亡肚逸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門彬坏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朦促,“玉大人,你說我怎么就攤上這事栓始∥衩幔” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵幻赚,是天一觀的道長禀忆。 經(jīng)常有香客問我,道長坯屿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任巍扛,我火速辦了婚禮领跛,結果婚禮上,老公的妹妹穿的比我還像新娘撤奸。我一直安慰自己吠昭,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布胧瓜。 她就那樣靜靜地躺著矢棚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪府喳。 梳的紋絲不亂的頭發(fā)上蒲肋,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音,去河邊找鬼兜粘。 笑死申窘,一個胖子當著我的面吹牛,可吹牛的內容都是我干的孔轴。 我是一名探鬼主播剃法,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼路鹰!你這毒婦竟也來了贷洲?” 一聲冷哼從身側響起郊霎,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤诞仓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后楷拳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趣斤,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡俩块,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了浓领。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玉凯。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖联贩,靈堂內的尸體忽然破棺而出漫仆,到底是詐尸還是另有隱情,我是刑警寧澤泪幌,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布盲厌,位于F島的核電站,受9級特大地震影響祸泪,放射性物質發(fā)生泄漏吗浩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一没隘、第九天 我趴在偏房一處隱蔽的房頂上張望懂扼。 院中可真熱鬧,春花似錦右蒲、人聲如沸阀湿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陷嘴。三九已至,卻和暖如春间坐,著一層夾襖步出監(jiān)牢的瞬間灾挨,已是汗流浹背邑退。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涨醋,地道東北人瓜饥。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像浴骂,于是被迫代替她去往敵國和親乓土。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,506評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理溯警,服務發(fā)現(xiàn)趣苏,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 1 昨晚,朋友邢老師留言說好久沒有看見我寫豐盛日記了喳挑,我心中很是歉意彬伦。 今天下午跟同事聊天時,無意中提到我們家沒有...
    E路修行閱讀 1,849評論 13 1
  • 人生在世伊诵,一些事不是你努力了单绑,就能得到,所以有些事情不能強求曹宴!擺正心態(tài)搂橙,積極陽光的生活!
    462d96124beb閱讀 204評論 0 0