日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

js typeof

發布時間:2025/6/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js typeof 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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()?
能夠跨框架的,檢測一個對象是否是指定的構造函數的實例的機制?
檢查某個變量是否已經被聲明這樣的需求,可能沒那么必要有自己的運算符.

轉載于:https://www.cnblogs.com/wpbars/p/6244363.html

總結

以上是生活随笔為你收集整理的js typeof的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩欧美一区二区三区在线 | 亚洲图片小说区 | 爱乃なみ加勒比在线播放 | 成人黄色小视频 | 手机看片日韩福利 | 国产在线拍揄自揄拍无码视频 | 超碰777| 男生操女生屁股 | 欧美黄色一级视频 | 国产亚洲色婷婷久久99精品91 | 中文一区二区在线 | 这里只有精品66 | 国产精品无码粉嫩小泬 | 中文字幕在线观看免费高清 | 涩涩视频免费在线观看 | 欧美黄大片 | 精品福利一区二区 | 天天爽夜夜爽人人爽 | ww成人 | 亚洲一区视频网站 | 国产成人三级在线观看 | 美女诱惑av | 91性视频| 午夜不卡久久精品无码免费 | 日韩国产在线播放 | 国产成人精品综合在线观看 | 日韩久久精品电影 | 亚洲成人免费电影 | 欧美一区二区三区久久妖精 | 亚洲一区亚洲二区 | 亚洲午夜精品久久久久久浪潮 | 不用播放器av | 国产精品久久久久久亚洲调教 | 成人日韩精品 | 国产精品扒开腿做爽爽爽a片唱戏 | 亚洲精品97久久中文字幕 | 中文字幕一区二区三区av | 综合 欧美 亚洲日本 | 色撸撸在线观看 | 制服丝袜成人动漫 | 大度亲吻原声视频在线观看 | 毛片av在线播放 | 日本激情视频在线 | 高潮毛片无遮挡高清免费 | 欧美爱爱免费视频 | 欧美mv日韩mv国产网站 | 国产精品乱子伦 | 国产色视频网站 | 天堂8在线天堂资源bt | 丰满人妻一区二区三区免费视频棣 | 日韩免费看片 | 免费成人在线观看 | 亚洲国产精品国自产拍av | 伊人天天操| 国产又爽又黄无码无遮挡在线观看 | 在线视频97 | 美女100%无挡 | av2014天堂| 天堂成人在线 | 国产aaa视频 | 欧美三级三级三级爽爽爽 | 国产原创91 | 欧美一区二区三区久久精品 | 久久国产一区二区 | 高清不卡一区 | 日本高清不卡在线 | 黄色性生活一级片 | 欧美精品久久久久 | 西西午夜影院 | 色播五月婷婷 | 亚洲国产aⅴ成人精品无吗 日韩乱论 | 九九综合久久 | 潘金莲一级淫片aaaaaaa | 毛片999| 91成人免费| 日韩成人在线影院 | 成人动漫亚洲 | 尤物毛片| 嫩草研究院在线观看 | 人人干人人搞 | 欧美 日韩 国产 精品 | 欧美性videos高清精品 | 中文字幕久久久久 | 国产男女猛烈无遮挡免费视频动漫 | 少妇真实被内射视频三四区 | 摸摸大奶子 | 国产av一区二区三区最新精品 | 国产第一色 | 日韩精品在线免费 | 国产一级特黄 | 成人午夜毛片 | 成人久久精品 | 亚洲一区二区三区免费观看 | 亚洲欲| 国产成人一区二区三区免费看 | 日韩一级高清 | 国产成人精品999在线观看 | 国产欧美一区二区三区在线老狼 | 第一章豪妇荡乳黄淑珍 |