欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript初學(xué)者容易犯的幾個(gè)錯(cuò)誤

 更新時(shí)間:2021年05月08日 10:17:15   作者:李中凱  
JavaScript 是對(duì)初學(xué)者比較友好的一門編程語(yǔ)言,基本上花個(gè)半小時(shí)看下語(yǔ)法就能寫出能運(yùn)行的代碼。JavaScript 是動(dòng)態(tài)腳本語(yǔ)言,對(duì)數(shù)據(jù)類型沒有太多的限制,寫起來(lái)非常靈活。但正因?yàn)槿绱耍鯇W(xué)者如果不深入了解語(yǔ)言本身,往往會(huì)犯一些錯(cuò)誤,從而導(dǎo)致一些很難發(fā)現(xiàn)的 bug。

前言

拋開 JavaScript 語(yǔ)言設(shè)計(jì)層面的問(wèn)題不說(shuō),畢竟它是 Brendan Eich 當(dāng)年用短短十天時(shí)間設(shè)計(jì)出來(lái)的,有點(diǎn)缺陷也是在所難免。作為開發(fā)者,我們?cè)撛鯓颖苊庖恍┏R姷牡图?jí)錯(cuò)誤呢?本文就列舉幾個(gè)常見錯(cuò)誤,看看你有沒有似曾相識(shí)。

混淆 undefined 和 null

JavaScript 中的undefined和null都可用來(lái)表示沒有值,但是二者之間有所區(qū)別。undefined字面意思是“未定義”,但它的含義其實(shí)已經(jīng)超出了變量未定義的范疇:嘗試讀取對(duì)象不存在的屬性、沒有return語(yǔ)句的函數(shù)的返回值、聲明后沒有賦值的變量甚至顯式賦值為undefined的變量等,它們的結(jié)果都是undefined。用typeof測(cè)試它的類型,是字符串'undefined'。而null就比較純粹了,變量只有設(shè)置為null才有這個(gè)值。另外,null是對(duì)象類型,即typeof(null)的值是字符串'object'。

需要注意的是,用if判斷這兩個(gè)值都是false,而且null==undefined是成立的,這一點(diǎn)初學(xué)者通常容易搞混。因此,盡量統(tǒng)一把“沒有值”都設(shè)置為undefined,這樣就省去了判斷區(qū)分的麻煩。

返回undefined的函數(shù):

const f = () => {}

設(shè)置變量的值為undefined:

x = undefined;

判斷屬性是否為undefined:

typeof obj.prop === 'undefined'
obj.prop === undefined

判斷變量是否為undefined:

typeof x === 'undefined'

變量聲明后沒有賦值,自動(dòng)就有了undefined值。

如果一定要判斷null,用全等判斷:

obj.prop === null
x === null

使用typeof是無(wú)法判斷null的,因?yàn)樗菍?duì)象類型。

混淆數(shù)字相加和字符串拼接

在 JavaScript 中,加號(hào)+操作符既可用于數(shù)字相加,也可以用于字符串拼接。由于 JavaScript 是動(dòng)態(tài)語(yǔ)言,操作符會(huì)自動(dòng)將變量轉(zhuǎn)成相同數(shù)據(jù)類型再運(yùn)算。比如:

let x = 1 + 1; // 2

結(jié)果是 2,是我們期望的數(shù)字相加操作,因?yàn)閮蓚€(gè)值都是數(shù)字。

但是,如果是下面這種表達(dá)式:

let x = 1 + '1'; // “11”

結(jié)果是'11',因?yàn)榈谝粋€(gè)數(shù)字會(huì)轉(zhuǎn)換成字符串。這里的加號(hào)+運(yùn)算符被用作字符串拼接,而不是數(shù)字相加。這里能直接看到表達(dá)式的值還算清楚,如果是由多個(gè)變量組成的表達(dá)式就很難判斷類型了。

為了解決這個(gè)問(wèn)題,我們可以把字符串都轉(zhuǎn)成數(shù)字類型,再進(jìn)行運(yùn)算。例如:

let x = 1;  
let y = '2';  
let z = Number(x) + Number(y);

這樣,運(yùn)行結(jié)果就是3了。Number函數(shù)接收任意類型的值,如果能轉(zhuǎn)成數(shù)字就返回?cái)?shù)字,否則返回NaN。還可以用new Number(...).valueOf()函數(shù):

let x = 1;  
let y = '2';  
let z = new Number(x).valueOf() + new Number(y).valueOf();

由于new Number(...)是實(shí)例化一個(gè)構(gòu)造函數(shù),返回的是一個(gè)對(duì)象,并不是數(shù)字類型。如果要得到原始的數(shù)字類型,需要用該對(duì)象的valueOf方法。其實(shí)還有個(gè)更簡(jiǎn)潔的方法:

let x = 1;  
let y = '2';  
let z = +x + +y;

變量前面的 + 作用是將它轉(zhuǎn)換成數(shù)字,或者NaN,跟Number函數(shù)的作用相同。

return 語(yǔ)句換行問(wèn)題

JavaScript 語(yǔ)法規(guī)定換行代表語(yǔ)句結(jié)束。例如:

const add = (a, b) => {  
  return  
  a + b;  
}
add(1,2); // undefined

本以為會(huì)返回 3,實(shí)際上是undefined。這是因?yàn)樵赼 + b之前,函數(shù)已經(jīng)執(zhí)行了return。要解決這個(gè)問(wèn)題,有兩個(gè)做法:要么把表達(dá)式跟return放在一行,要么把表達(dá)式套一層括號(hào)。

const add = (a, b) => {  
  return a + b;  
}
// 或者
const add = (a, b) => {  
  return (  
    a + b  
  );  
}

加括號(hào)為什么可以換行呢?因?yàn)槔ㄌ?hào)里的是表達(dá)式,不是語(yǔ)句。表達(dá)式可以拆成多行,如果很長(zhǎng)的話。用箭頭函數(shù)會(huì)更直觀:

const add = (a, b) => a + b

箭頭函數(shù)里的單行表達(dá)式自帶return效果,當(dāng)然也可以在表達(dá)式外面套一層括號(hào):

const add = (a, b) => (a + b)

這個(gè)括號(hào)在返回對(duì)象字面量的箭頭函數(shù)里有點(diǎn)用處,因?yàn)椴患訄A括號(hào)()的話,{}只是函數(shù)體的開始和結(jié)束標(biāo)記,要返回對(duì)象字面量,還要顯式return {...}。

如果某行代碼中的語(yǔ)句不完整,JavaScript 解析器會(huì)將下一行的語(yǔ)句合并一起解析。比如:

const power = (a) => {  
  const  
    power = 10;  
  return a ** 10;  
}
// 等同于:
const power = (a) => {  
  const  power = 10;  
  return a ** 10;  
}

但是對(duì)于完整的語(yǔ)句,比如return,就不會(huì)合并多行。

用 return 跳出 forEach 循環(huán)

JavaScript 數(shù)組有個(gè) forEach 方法,用于對(duì)數(shù)組元素進(jìn)行循環(huán)操作。初學(xué)者很容易聯(lián)想到 for循環(huán)的break或continue關(guān)鍵字,用來(lái)中止循環(huán)。但是對(duì)不起,forEach沒有這兩個(gè)關(guān)鍵字。那用return行不行?可以用,但它的作用就是提前返回函數(shù),跟continue的效果類似,用于結(jié)束本次循環(huán)。要跳出整個(gè)循環(huán),return做不到。

const nums = [1, 2, 3, 4, 5, 6];
let firstEven;
nums.forEach(n => {
  if (n % 2 ===0 ) {
    firstEven = n;
    return n;
  }
});
console.log(firstEven); // 6

代碼本意是想找出第一個(gè)偶數(shù),找到就退出循環(huán)。但實(shí)際并沒有退出循環(huán),因此最終結(jié)果是最后一個(gè)偶數(shù)。
有解決辦法嗎?這種情況可以用for循環(huán),或者用數(shù)組filter、find之類的方法。

總結(jié)

雖然 JavaScript 很容易上手,但稍不注意還是比較容易犯錯(cuò)。本文簡(jiǎn)單介紹了幾種容易犯的錯(cuò),希望對(duì)你有所幫助。

以上就是JavaScript初學(xué)者容易犯的幾個(gè)錯(cuò)誤的詳細(xì)內(nèi)容,更多關(guān)于JS的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JavaScript實(shí)現(xiàn)文本中間縮略的兩種方案

    JavaScript實(shí)現(xiàn)文本中間縮略的兩種方案

    項(xiàng)目中經(jīng)常會(huì)遇到縮略展示文字的場(chǎng)景,即要求文字在一行不換行展示,超出自動(dòng)展示...,常用的展示效果有兩種,文字中間縮略以及文字末尾縮略,本文將通過(guò)代碼示例給大家詳細(xì)的講一下這兩種方案,需要的朋友可以參考下
    2024-06-06
  • MyEclipse取消驗(yàn)證Js的兩種方法

    MyEclipse取消驗(yàn)證Js的兩種方法

    通過(guò)js寫一個(gè)web工程的相關(guān)頁(yè)面時(shí)感覺很卡,修改內(nèi)存也不行下面有兩種解決方法,大家可以嘗試下
    2013-11-11
  • 全面解析Bootstrap中tooltip、popover的使用方法

    全面解析Bootstrap中tooltip、popover的使用方法

    這篇文章主要為大家詳細(xì)解析了Bootstrap中tooltip、popover的使用方法,了解提示框、彈出框的實(shí)現(xiàn)原理,感興趣的朋友可以參考一下
    2016-06-06
  • 微信小程序如何實(shí)現(xiàn)列表渲染和條件渲染

    微信小程序如何實(shí)現(xiàn)列表渲染和條件渲染

    微信小程序也是有列表渲染和條件渲染的,下面這篇文章主要給大家介紹了關(guān)于微信小程序如何實(shí)現(xiàn)列表渲染和條件渲染的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 深入理解JavaScript Promise鏈?zhǔn)秸{(diào)用與錯(cuò)誤處理機(jī)制

    深入理解JavaScript Promise鏈?zhǔn)秸{(diào)用與錯(cuò)誤處理機(jī)制

    在JavaScript的異步編程中,Promise是一個(gè)非常重要的概念,它允許我們以鏈?zhǔn)降姆绞教幚懋惒讲僮?使得代碼更加清晰和易于管理,本文將通過(guò)一系列代碼示例,深入探討Promise的鏈?zhǔn)秸{(diào)用和錯(cuò)誤處理機(jī)制,需要的朋友可以參考下
    2024-09-09
  • 學(xué)習(xí)JavaScript設(shè)計(jì)模式之單例模式

    學(xué)習(xí)JavaScript設(shè)計(jì)模式之單例模式

    這篇文章主要為大家介紹了JavaScript設(shè)計(jì)模式中的單例模式,對(duì)JavaScript設(shè)計(jì)模式感興趣的小伙伴們可以參考一下
    2016-01-01
  • javascript中一些數(shù)組常用的API總結(jié)

    javascript中一些數(shù)組常用的API總結(jié)

    Js中數(shù)組是一個(gè)重要的數(shù)據(jù)結(jié)構(gòu),它相比于字符串有更多的方法,本篇文章總結(jié)了一些數(shù)組中常用的API,我們把它們分成兩類,一類是會(huì)改變?cè)紨?shù)組,一類是不會(huì)改變?cè)紨?shù)組,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-09-09
  • javascript刪除數(shù)組元素并且數(shù)組長(zhǎng)度減小的簡(jiǎn)單實(shí)例

    javascript刪除數(shù)組元素并且數(shù)組長(zhǎng)度減小的簡(jiǎn)單實(shí)例

    本篇文章主要是對(duì)javascript刪除數(shù)組元素并且數(shù)組長(zhǎng)度減小的簡(jiǎn)單實(shí)例進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2014-02-02
  • Javascript中的async awai的用法

    Javascript中的async awai的用法

    本篇文章主要介紹了Javascript中的async/awai的用法,將分享async / await是如何工作的,有興趣的可以了解一下
    2017-05-05
  • 微信小程序?qū)崿F(xiàn)密碼顯示與隱藏的睜眼閉眼功能

    微信小程序?qū)崿F(xiàn)密碼顯示與隱藏的睜眼閉眼功能

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)密碼顯示與隱藏的睜眼閉眼功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-02-02

最新評(píng)論