国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > JavaScript > 正文

js中typeof的用法匯總

2019-11-20 21:28:52
字體:
供稿:網(wǎng)友

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

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
注意:未初始化的變量,沒有被傳入?yún)?shù)的形參,不存在的屬性,都不會出現(xiàn)上面的問題,因為它們總是可訪問的,值總是undefined:

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


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

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

> 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最有名的一個怪異表現(xiàn)(被認為是一個bug):typeof null返回了"object":

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


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

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.區(qū)分對象值和原始值
下面的函數(shù)用來檢測x是否是一個對象值:

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

解決辦法: 下面的方法也經(jīng)常用于檢測對象值:

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

> 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的怪異表現(xiàn).

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

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("參數(shù)不是一個原始值: "+x); } }

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

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

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

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
一本久久精品| 中文字幕免费中文| 国产探花视频在线观看| 国产美女被遭强高潮免费网站| 在线播放www| 亚洲精品aaaa| 国产免费黄视频在线观看| www.91av| 国产精品一卡二卡三卡| 国产精品日日爱| 亚洲欧美日韩综合精品网| 欧美aaa一级片| 国产无遮挡在线视频免费观看| 国产精品jvid在线观看| 亚洲天堂二区| 国产裸舞福利在线视频合集 | 精品久久亚洲一级α| av在线二区| 国产麻豆视频网站| av影视在线看| 国产69精品久久久久孕妇国产69久久| 国产一级电影网| 在线色视频网| 天堂在线中文资源| 四虎网站在线观看| 国产精品美女一区二区视频| 男人操女人免费网站| 国产精品久久久久白浆| 成年人在线观看| av在线1区2区| 国产盗摄一区二区| 丁香花高清视频完整版在线观看| 一本大道五月香蕉| 最新av免费看| 九九色在线观看| 亚洲第一成人在线视频| 99热国产在线| 精品剧情v国产在线观看| 国产黄色免费电影| 国产日韩网站| 中文字幕一区二区三区免费视频| 九色成人在线| 国产在线观看a视频| 久热精品免费视频| 麻豆精品不卡国产免费看| 四虎国产精品永久地址998| 在线播放国产区| 夜夜嗨yeyeh| 亚洲国产成人综合| 日本h片在线观看| xxxxx中文字幕| 好看的中文字幕在线播放| 久久久久久久美女| 国产偷窥洗澡视频| 在线视频二区| 免费视频二区| 国产在线一二| 国产成人无吗| 欧美96在线| 中文字幕国产在线| 在线观看免费高清完整| 九色福利视频| 国产盗摄精品一区二区酒店| 国产大学生粉嫩无套流白浆| 精品国产美女福利到在线不卡| 在线观看国产福利视频| www.狠狠| 国产高清大尺度一区二区不卡| 精品推荐国产麻豆剧传媒| a级在线观看| 国产天堂在线观看| 在线国产福利网站| 天天操天天艹| 一本大道久久精品| 国产福利图片| 国产精品自拍亚洲| 99re6在线视频精品免费| 狠狠操狠狠色| av片在线观看| 国产素人视频在线观看| 天天草天天草| 国产深夜福利| 国产精品自产拍在线观看2019| 精品欧美日韩一区二区| 国产理论片免费观看| www在线播放| 在线激情小视频| 国产成+人+亚洲+欧美+综合| 久草一本av| 日本aⅴ写真网站免费| 伊人免费在线| 精品电影在线| 精品美女视频在线观看免费软件| 久色视频在线观看| jizz性欧美| 中文在线视频观看| 国产激情视频一区二区| 中文字幕第一页av| 最近高清中文在线字幕在线观看| 狂野欧美性猛交xxxx乱大交| 亚洲精品久久久成人| a视频免费看| 日本在线免费中文字幕| 热99在线观看| 国产美女视频网站| 国产一级网站视频在线| 国产精品久久麻豆| 91免费日韩| 99热99re6国产在线播放| 国产va在线观看| 91激情在线| av麻豆国产| 麻豆福利在线观看| 国产午夜精品久久久久免费视| 国产香蕉视频在线看| 国产高清在线| 亚洲视频手机在线观看| 久热国产在线视频| 国产精品久久麻豆| av在线资源网| 国产在线观看网站| 国产成人精品自线拍| 亚洲日本伊人| 九九热精品在线视频| 国产日本韩国在线播放| 在线国产1区| 成人超碰在线| 国产超碰在线| www在线观看播放免费视频日本| www在线视频观看| 狠狠操五月天| 精精国产xxxx视频在线中文版 | 99久久国产视频| 黄色av免费在线| 国产精品人人爱一区二区白浆| 亚洲精品在线视频免费| 国产免费黄视频在线观看| 国产欧美一区二区三区小说| 日韩中文字幕久久久经典网| 国产一级视频| 日本福利在线| 91久久精品国产性色| 国产有码在线| www.夜夜操.com| 精品176二区| 国产婷婷视频在线| 黄色av电影在线播放| www.jizz在线观看| 亚洲欧美一区二区三区在线播放| 中文字幕在线视频观看| 狠狠干天天干| 黄网址在线播放免费| 精品欧美色视频网站在线观看| 国产免费人人看| 欧美婷婷久久五月精品三区| av免费网站在线观看| 精品全国在线一区二区| 国产高清视频在线| 国产成人精品18| 国产大学生粉嫩无套流白浆| 国产网红在线| 国产视频青青| 国产区在线看| 国产经典av| 精品推荐蜜桃传媒| 在线免费国产| 性欧美精品xxxx| 在线观看wwww| а√天堂www在线а√天堂视频| 亚洲视频手机在线观看| 欧美亚洲天堂| 国产精品外围在线观看| 中文字幕在线影视资源| 国产特级淫片免费看| 国产成人亚洲精品播放器下载| 精品卡1卡2卡三卡免费网站| 一级二级在线观看| 日本欧洲一区| 中文字幕在线免费观看| 国产精品视频一区二区免费不卡 | 2018av男人天堂| 国产福利在线视频| 香蕉视频网站在线观看| 九色在线网站| 国产精品久久一区二区三区不卡| 91午夜视频| 久久久久久日本一区99| 国产精选一区二区三区不卡催乳| 午夜伦全在线观看| 中文资源在线官网| 国产真实伦在线观看| 国产精品久久久久白浆| xxxx视频在线| 国产不卡在线| 国产麻豆综合视频在线观看| 在线中文av| www.夜夜操| 国产福利小视频在线观看| 欧美日韩亚洲第一页| 国产欧美在线观看视频|