亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

js中typeof的用法匯總

2019-11-20 21:28:52
字體:
來源:轉載
供稿:網友

JavaScript中的typeof其實非常復雜,它可以用來做很多事情,但同時也有很多怪異的表現.本文列舉出了它的多個用法,而且還指出了存在的問題以及解決辦法.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FOperators%2Ftypeof

    > typeof undefined
    'undefined'
    > typeof null // well-known bug
    'object'
    > typeof true
    'boolean'
    > typeof 123
    'number'
    > typeof "abc"
    'string'
    > typeof function() {}
    'function'
    > typeof {}
    'object'
    > typeof []
    'object'
    > typeof unknownVariable
    'undefined'

1.檢查一個變量是否存在,是否有值.
typeof在兩種情況下會返回"undefined":一個變量沒有被聲明的時候,和一個變量的值是undefined的時候.例如:

> typeof undeclaredVariable === "undefined" true > var declaredVariable; > typeof declaredVariable 'undefined' > typeof undefined 'undefined'
還有其他辦法檢測某個值是否是undefined:

> var value = undefined; > value === undefined true
但這種方法如果使用在一個未聲明的變量上的時候,就會拋出異常,因為只有typeof才可以正常檢測未聲明的變量的同時還不報錯:

> undeclaredVariable === undefined ReferenceError: undeclaredVariable is not defined
注意:未初始化的變量,沒有被傳入參數的形參,不存在的屬性,都不會出現上面的問題,因為它們總是可訪問的,值總是undefined:

> var declaredVariable; > declaredVariable === undefined true > (function (x) { return x === undefined }()) true > ({}).foo === undefined true
譯者注:因此,如果想檢測一個可能沒有被聲明的全局變量是否存在,也可以使用 if(window.maybeUndeclaredVariable){}


問題: typeof在完成這樣的任務時顯得很繁雜.

解決辦法: 這樣的操作不是很常見,所以有人覺的沒必要再找更好的解決辦法了.不過也許有人會提出一個專門的操作符:

> defined undeclaredVariable false > var declaredVariable; > defined declaredVariable false
或者,也許有人還需要一個檢測變量是否被聲明的操作符:

> declared undeclaredVariable false > var declaredVariable; > declared declaredVariable true
譯者注:在perl里,上面的defined操作符相當于defined(),上面的declared操作符相當于exists(),

2.判斷一個值不等于undefined也不等于null
問題:如果你想檢測一個值是否被定義過(值不是undefined也不是null),那么你就遇到了typeof最有名的一個怪異表現(被認為是一個bug):typeof null返回了"object":

> typeof null 'object'
譯者注:這只能說是最初的JavaScript實現的bug,而現在標準就是這樣規范的.V8曾經修正并實現過typeof null === "null",但最終證明不可行.http://wiki.ecmascript.org/doku.php?id=harmony:typeof_null


解決辦法: 不要使用typeof來做這項任務,用下面這樣的函數來代替:

function isDefined(x) { return x !== null && x !== undefined; }
另一個可能性是引入一個“默認值運算符”,在myValue未定義的情況下,下面的表達式會返回defaultValue:

myValue ?? defaultValue
上面的表達式等價于:

(myValue !== undefined && myValue !== null) ? myValue : defaultValue
又或者:

myValue ??= defaultValue
其實是下面這條語句的簡化:

myValue = myValue ?? defaultValue
當你訪問一個嵌套的屬性時,比如bar,你或許會需要這個運算符的幫助:

obj.foo.bar
如果obj或者obj.foo是未定義的,上面的表達式會拋出異常.一個運算符.??可以讓上面的表達式在遍歷一層一層的屬性時,返回第一個遇到的值為undefined或null的屬性:

obj.??foo.??bar
上面的表達式等價于:

(obj === undefined || obj === null) ? obj : (obj.foo === undefined || obj.foo === null) ? obj.foo : obj.foo.bar

3.區分對象值和原始值
下面的函數用來檢測x是否是一個對象值:

function isObject(x) { return (typeof x === "function" || (typeof x === "object" && x !== null)); }
問題: 上面的檢測比較復雜,是因為typeof把函數和對象看成是不同的類型,而且typeof null返回"object".

解決辦法: 下面的方法也經常用于檢測對象值:

function isObject2(x) { return x === Object(x); }
警告:你也許認為這里可以使用instanceof Object來檢測,但是instanceof是通過使用使用一個對象的原型來判斷實例關系的,那么沒有原型的對象怎么辦呢:

> var obj = Object.create(null); > Object.getPrototypeOf(obj) null
obj確實是一個對象,但它不是任何值的實例:

> typeof obj 'object' > obj instanceof Object false
在實際中,你可能很少遇到這樣的對象,但它的確存在,而且有它的用途.

譯者注:Object.prototype就是一個默認存在的,沒有原型的對象

>Object.getPrototypeOf(Object.prototype)null>typeof Object.prototype'object'>Object.prototype instanceof Object false

4.原始值的類型是什么?
typeof是最好的用來查看某個原始值的類型的方式.

> typeof "abc" 'string' > typeof undefined 'undefined'
問題: 你必須知道typeof null的怪異表現.

> typeof null // 要小心! 'object'
解決辦法: 下面的函數可以修復這個問題(只針對這個用例).

function getPrimitiveTypeName(x) { var typeName = typeof x; switch(typeName) { case "undefined": case "boolean": case "number": case "string": return typeName; case "object": if (x === null) { return "null"; } default: // 前面的判斷都沒通過 throw new TypeError("參數不是一個原始值: "+x); } }

更好的解決辦法: 實現一個函數getTypeName(),除了可以返回原始值的的類型,還可以返回對象值的內部[[Class]]屬性.這里講了如何實現這個函數(譯者注:jQuery中的$.type就是這樣的實現)

5.某個值是否是函數
typeof可以用來檢測一個值是否是函數.> typeof function () {} 'function' >  typeof Object.prototype.toString 'function'

原則上說,instanceof Function也可以進行這種需求的檢測.乍一看,貌似寫法還更加優雅.但是,瀏覽器有一個怪癖:每一個框架和窗口都有它自己的全局變量.因此,如果你將某個框架中的對象傳到另一個框架中,instanceof就不能正常工作了,因為這兩個框架有著不同的構造函數.這就是為什么ECMAScript5中會有Array.isArray()方法的原因.如果有一個能夠跨框架的,用于檢查一個對象是否是給定的構造函數的實例的方法的話,那會很好.上述的getTypeName()是一個可用的變通方法,但也許還有一個更根本的解決方案.

6.綜述
下面提到的,應該是目前JavaScript中最迫切需要的,可以代替一些typeof目前職責的功能特性:

isDefined() (比如Object.isDefined()): 可以作為一個函數或者一個運算符
isObject()
getTypeName()
能夠跨框架的,檢測一個對象是否是指定的構造函數的實例的機制
檢查某個變量是否已經被聲明這樣的需求,可能沒那么必要有自己的運算符.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一区二三区| 日韩成人xxxx| 68精品国产免费久久久久久婷婷| 国产91网红主播在线观看| 久久99精品久久久久久琪琪| 欧美裸体xxxx极品少妇| 中文字幕亚洲欧美日韩高清| 国产美女精品视频免费观看| 国产精品视频26uuu| 懂色av一区二区三区| 亚洲理论片在线观看| 韩国国内大量揄拍精品视频| 久久露脸国产精品| 欧美怡春院一区二区三区| 91久久在线播放| 久久天天躁狠狠躁夜夜爽蜜月| 伊人成人开心激情综合网| 亚洲精品福利在线| 91精品视频在线播放| 亚洲一区久久久| 久久久999国产| 亚洲综合视频1区| 日韩精品视频免费在线观看| 国产精品丝袜一区二区三区| 亚洲天堂免费观看| 国产精品极品美女粉嫩高清在线| 国产美女91呻吟求| 日韩电影免费观看中文字幕| 久久久免费观看视频| 欧美中文在线观看国产| 性色av香蕉一区二区| 色黄久久久久久| 久久99视频精品| 国产欧美日韩亚洲精品| 亚洲深夜福利在线| 国产精品男人的天堂| 曰本色欧美视频在线| 国产成人自拍视频在线观看| 日韩欧美在线视频免费观看| 日韩精品免费在线| 国产精品永久免费观看| 日韩高清有码在线| 色久欧美在线视频观看| 久久久天堂国产精品女人| 91国内免费在线视频| 欧美午夜视频一区二区| 久久久www成人免费精品| 日韩美女主播视频| 精品国产一区二区三区在线观看| 91po在线观看91精品国产性色| 在线日韩欧美视频| 57pao国产精品一区| 日韩中文字幕在线观看| 亚洲xxx大片| 日韩欧美国产网站| 原创国产精品91| 正在播放亚洲1区| 亚洲女人初尝黑人巨大| 亚洲电影免费观看高清| 亚洲一区二区三区在线视频| 国产一区二区三区视频| 91精品啪aⅴ在线观看国产| 色综合伊人色综合网站| 欧美日韩国产在线播放| 萌白酱国产一区二区| 国产精品吊钟奶在线| 国产精品视频一区二区三区四| 超在线视频97| 亚洲视频欧美视频| 欧美成人一区在线| 亚洲免费电影在线观看| 欧美精品激情在线观看| 日韩中文理论片| 国产精品亚洲第一区| 亚洲精品电影网在线观看| 国产在线拍揄自揄视频不卡99| 国产女精品视频网站免费| 日韩高清av一区二区三区| 欧美制服第一页| 久久久久久久久亚洲| 国产精品大片wwwwww| 欧美成人精品一区| 国产精品日日做人人爱| 26uuu亚洲国产精品| 国产精品96久久久久久又黄又硬| 欧美大胆a视频| 国产成人欧美在线观看| 国产午夜一区二区| 国产成人精品综合久久久| 久久91精品国产91久久久| 久久免费国产精品1| 欧美午夜女人视频在线| 中文字幕在线观看日韩| 国产婷婷97碰碰久久人人蜜臀| 国产91亚洲精品| 国产成人+综合亚洲+天堂| 亚洲精品电影久久久| 色婷婷久久av| 精品少妇v888av| 国产精品91久久久| 久久久www成人免费精品| 中文在线不卡视频| 亚洲国内精品视频| 国产精品爽爽ⅴa在线观看| 日韩视频免费中文字幕| 欧美亚洲视频一区二区| 久久激情视频免费观看| 性欧美亚洲xxxx乳在线观看| 成人免费自拍视频| 8090成年在线看片午夜| 中文字幕精品久久久久| 亚洲视频专区在线| 国产aⅴ夜夜欢一区二区三区| 精品国产美女在线| 日韩av最新在线| 久久av资源网站| 亚洲视频在线免费看| 欧美黑人性生活视频| 国产91色在线|| 久久九九热免费视频| 亚洲九九九在线观看| 97视频免费在线看| 91免费欧美精品| 这里只有精品丝袜| 日韩精品在线观| 91成品人片a无限观看| 欧洲成人午夜免费大片| 国产精品亚洲片夜色在线| 久久躁日日躁aaaaxxxx| 国产精品高清免费在线观看| 亚洲网站在线播放| 亚洲一区二区三区成人在线视频精品| 亚洲毛片一区二区| 97成人精品视频在线观看| 中文字幕亚洲一区二区三区| 欧美一级淫片丝袜脚交| 亚洲韩国青草视频| 国模精品视频一区二区三区| 中文字幕亚洲无线码在线一区| 欧美黑人性猛交| 亚洲理论在线a中文字幕| 欧美资源在线观看| 久久频这里精品99香蕉| 亚洲第一天堂无码专区| 久久精品视频va| 欧美日韩成人在线播放| 国产精品免费视频xxxx| 国产一区二区三区视频| 久久久久久91香蕉国产| 黑人与娇小精品av专区| 日韩视频免费看| 国产精品第七十二页| 国产精品久久久久久久久久尿| 中文字幕亚洲国产| 欧美影院久久久| 欧美日韩在线观看视频| 亚洲男女自偷自拍图片另类| 成人午夜一级二级三级| 亚洲高清一二三区| 97欧美精品一区二区三区| 日韩欧美精品免费在线| 日本一区二区在线免费播放| 欧美综合在线第二页| 亚洲欧美国产高清va在线播|