最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解在JavaScript中如何判斷變量類型

 更新時(shí)間:2022年07月07日 10:30:52   作者:顏海鏡  
JavaScript是一個(gè)動態(tài)類型語言,在運(yùn)行時(shí)獲取變量類型是常用操作。本文將通過示例為大家詳細(xì)講講在JavaScript中如何判斷變量類型,感興趣的可以學(xué)習(xí)一下

JavaScript是一個(gè)動態(tài)類型語言,在運(yùn)行時(shí)獲取變量類型是常用操作,由于JavaScript設(shè)計(jì)的問題,看似簡單的問題,在JavaScript中可能并不簡單,比如在社區(qū)中流傳的下圖,仔細(xì)看一下這些坑,即便是JavaScript老司機(jī)也經(jīng)常翻車。

上圖中typeof NaN會返回number,這可能和你想的不一樣,在JavaScript準(zhǔn)確的獲取變量類型,并不簡單,正因?yàn)槿绱耍@個(gè)問題經(jīng)常被用來考察面試者,由于程序=數(shù)據(jù)+算法,而基本數(shù)據(jù)是數(shù)據(jù)的基礎(chǔ),所以面試中考察類型也是合理的。

如果面試中你只回答使用typeof獲取類型,那大概率是會減分的,那么該如何回答這道題呢?本文將全面系統(tǒng)的介紹如何在JavaScript中判斷類型,閱讀本文,可以幫你,在工作中,避開類型判斷雷區(qū),如果在面試中你回答本文的內(nèi)容,那么面試官將驚呼,這是高手,比我知道的都多,然后自然是好評嘍。

下面先從最簡單的例子開始,并一步一步提升難度,擴(kuò)展思路,先來看第一個(gè)例子:

在工作中,對于數(shù)據(jù)為空的情況,經(jīng)常要做防御式編程,誤區(qū)之一是使用非運(yùn)算符直接判斷。但這樣做是可能有坑的,比如這會把很多徦值計(jì)算在內(nèi),常見的徦值有0, '', false, null, undefined等。例如如下的double函數(shù),需要對參數(shù)做為空的防御,這里使用非空運(yùn)算符。

function double(x) {
  // 0會被錯(cuò)誤計(jì)算
  if (!x) {
    return NaN;
  }
  return x * 2;
}

對于判空,另一種寫法是直接和nullundefined作比較,示例如下:

if (x === null || x === undefined) {
  return NaN;
}

雖然邏輯看起來非常正確,但這種寫法有一個(gè)比較嚴(yán)重的問題,在JavaScript中undefined并不是關(guān)鍵字,而是 window上的一個(gè)屬性,在 ECMAScript 5 之前這個(gè)屬性可寫的,如果undefined被重新復(fù)制,在過時(shí)瀏覽器中會導(dǎo)致判斷失效,示例如下:

window.undefined = 1;

// 判斷不能生效
if (x === undefined) {
  console.log(111);
}

雖然在現(xiàn)代瀏覽器中不會有這個(gè) bug,但是如果文法作用域中存在名字為undefined的變量還是會有問題,這被稱作undefiined變量覆蓋,例如如下代碼中,undefined被1覆蓋了。

(function () {
  var undefined = 1;
  // 判斷不能生效
  if (x === undefined) {
    console.log(111);
  }
})();

關(guān)于判空還有比較巧妙的方法,可以只和null判斷相等,借助隱式轉(zhuǎn)換達(dá)到同樣的效果,null是關(guān)鍵字,沒有undefined的問題。

// null 和 undefined都會判斷
if (x == null) {
}

在全等是最佳實(shí)踐的背景下,這種做法并不被鼓勵(lì),建議使用 typeof 來判斷undefined,typeof 通過內(nèi)部類型判斷,不存在undefined變量覆蓋的問題。

if (x === null || typeof x === 'undefined') {
}

對于 number 類型,有個(gè)需要注意的地方,在 JavaScript 中有個(gè)特殊的值叫做 NaN,NaN 的類型也是 number,編碼中很少直接使用到 NaN,通常都是在計(jì)算失敗時(shí)會得到這個(gè)值。

但將 NaN 作為 number 使用時(shí)就會報(bào)錯(cuò),比如調(diào)用 NaN 上的toFixed方法,更好的做法是添加 isNaN 的判斷,需要注意 number 類型的特殊邏輯。

const x = Math.sqrt(-1); // NaN

// 注意這里的isNaN判斷
if (typeof x === 'number' && !isNaN(x)) {
  console.log(x.toFixed(2));
}

也可以使用 ECMAScript 2015 新增的Number.isNaN,和全局函數(shù) isNaN 的區(qū)別是,Number.isNaN 不會自行將參數(shù)轉(zhuǎn)換成數(shù)字,Number.isNaN的邏輯下面的代碼類似,Number.isNaN是更好的建議,但是需要注意兼容性的問題

Number.isNaN = function (value) {
  return typeof value === 'number' && isNaN(value);
};

typeof 只能判斷基本類型,對于引用類型的到的值都是object

typeof []; // 'object'
typeof {}; // 'object'
typeof c; // 'object'

instanceof 可以用來檢測引用類型,其原理是檢測 constructor.prototype 是否存在于參數(shù) object 的原型鏈上

{} instanceof Object // true
[] instanceof Array // true
/reg/ instanceof RegExp // true

instanceof 存在的一個(gè)問題是不夠準(zhǔn)確,原型鏈上存在的都會返回 true

[] instanceof Array // true
[] instanceof Object // true 注意這里

使用 instanceof 做類型判斷時(shí),一定要注意順序問題,如果順序錯(cuò)誤,可能會得不到正確的結(jié)果

function type(x) {
  if (x instanceof Object) {
    return 'object';
  }

  // Array永遠(yuǎn)得不到正確的類型哦
  if (x instanceof Array) {
    return 'array';
  }
}

instanceof 另一個(gè)冷門的問題是存在多個(gè) iframe 時(shí),其判斷可能會返回錯(cuò)誤的結(jié)果,這個(gè)問題一般會在多從窗口之間從傳遞值時(shí)發(fā)生

[] instanceof window.frames[0].Array // 返回false
[] instanceof window.Array // 返回true

對于數(shù)組的判斷,更好的辦法是使用 ECMAScript 5 帶來的新方法Array.isArray,這個(gè)在任何情況下都可以得到可靠的結(jié)果

Array.isArray([]); // true
Array.isArray(1); // false

另一種常用的判斷類型方式是使用,獲取內(nèi)部類型的方法,借助Object.prototype.toString可以獲取內(nèi)部類型的字符串結(jié)果

const toString = Object.prototype.toString;

toString.call({}); // [object Object]
toString.call(null); // [object Null]
toString.call(/reg/); // [object RegExp]

需要注意的是,在 ECMAScript 5 之前,undefined 和 null 并不能返回正確的值,如果有兼容性需求,需要注意這個(gè)問題

ECMAScript 2015 引入了Symbol.toStringTag可以修改內(nèi)部類型的值,這會影響toString的返回值,但是需要注意兼容性問題

const toString = Object.prototype.toString;
const obj = {};

toString.call(obj); // '[object Object]'

obj[Symbol.toStringTag] = 'MyObject'; // 修改內(nèi)部類型

toString.call(obj); // '[object MyObject]'

總結(jié)

至此,本文介紹了在JavaScript中判斷變量類型的各種方法,可以看到在正確的場景使用正確的方式并不容易,這里推薦大家使用作者維護(hù)的type庫,type使用的正是本文介紹的知識,其提供了開箱即用的判斷函數(shù),經(jīng)過了很多項(xiàng)目的檢驗(yàn),歡迎大家體驗(yàn)。

到此這篇關(guān)于詳解在JavaScript中如何判斷變量類型的文章就介紹到這了,更多相關(guān)JavaScript判斷變量類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript實(shí)現(xiàn)音樂自動切換和輪播

    JavaScript實(shí)現(xiàn)音樂自動切換和輪播

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)音樂自動切換和輪播效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • JS中使用textPath實(shí)現(xiàn)線條上的文字

    JS中使用textPath實(shí)現(xiàn)線條上的文字

    最近項(xiàng)目經(jīng)理交給我一下新項(xiàng)目,要實(shí)現(xiàn)關(guān)系圖,需要在線條上繪制文字。下面小編把使用textPath實(shí)現(xiàn)線條上的文字功能分享到腳本之家平臺供大家參考
    2017-12-12
  • JS實(shí)現(xiàn)放大、縮小及拖拽圖片的方法【可兼容IE、火狐】

    JS實(shí)現(xiàn)放大、縮小及拖拽圖片的方法【可兼容IE、火狐】

    這篇文章主要介紹了JS實(shí)現(xiàn)放大、縮小及拖拽圖片的方法,可兼容IE及火狐等瀏覽器,通過javascript自定義函數(shù)實(shí)現(xiàn)針對圖片的放大、縮小及拖拽等功能,涉及javascript動態(tài)操作頁面元素的相關(guān)技巧,需要的朋友可以參考下
    2016-08-08
  • JS中的THIS和WINDOW.EVENT.SRCELEMENT詳解

    JS中的THIS和WINDOW.EVENT.SRCELEMENT詳解

    對于js初學(xué)著必須理解this和srcElement的應(yīng)用,這也是面試中經(jīng)??嫉降?。下面我們就通過幾個(gè)示例來詳細(xì)了解下
    2015-05-05
  • JS使用正則截取兩個(gè)字符串之間的字符串實(shí)現(xiàn)方法詳解

    JS使用正則截取兩個(gè)字符串之間的字符串實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了JS使用正則截取兩個(gè)字符串之間的字符串實(shí)現(xiàn)方法,結(jié)合實(shí)例形式簡單分析了JS正則匹配與截取操作的實(shí)現(xiàn)技巧,并拓展分析了數(shù)量詞的概念與功能,需要的朋友可以參考下
    2017-01-01
  • Layui 動態(tài)禁止select下拉的例子

    Layui 動態(tài)禁止select下拉的例子

    今天小編就為大家分享一篇Layui 動態(tài)禁止select下拉的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • 純javascript響應(yīng)式樹形菜單效果

    純javascript響應(yīng)式樹形菜單效果

    這篇文章主要為大家分享了純javascript響應(yīng)式樹形菜單效果的簡單教程,對多級目錄樹形菜單感興趣的小伙伴們可以參考一下
    2015-11-11
  • JavaScript自定義日歷效果

    JavaScript自定義日歷效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript自定義日歷效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Javascript打印局部頁面實(shí)例

    Javascript打印局部頁面實(shí)例

    這篇文章主要分享一個(gè)Javascript打印局部頁面實(shí)例,需要的朋友可以參考下。
    2016-06-06
  • BootstrapValidator超詳細(xì)教程(推薦)

    BootstrapValidator超詳細(xì)教程(推薦)

    這篇文章主要介紹了BootstrapValidator超詳細(xì)教程(推薦)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12

最新評論

衡山县| 武陟县| 邯郸市| 马尔康县| 门源| 宁河县| 镇巴县| 蒙自县| 沅江市| 镶黄旗| 渑池县| 托里县| 吉安市| 尤溪县| 丹凤县| 宣城市| 金沙县| 五常市| 专栏| 仪陇县| 共和县| 宁阳县| 嘉义市| 沂源县| 雅安市| 南召县| 安徽省| 漯河市| 溧阳市| 佛山市| 旬邑县| 澎湖县| 台前县| 磐安县| 烟台市| 静乐县| 赤峰市| 隆子县| 永寿县| 连城县| 龙海市|