JavaScript 中的 typeof 其實非常複雜,它可以用來做很多事情,但同時也有很多怪異的表現。
本文列舉出了它的多個用法,而且也指出了存在的問題以及解決方案。
閱讀本文的前提是,你現在應該已經知道原始值和物件值的差別了。
檢查一個變數是否存在,是否有值
typeof在兩種情況下會回傳 "undefined":
1.變數沒有被宣告
2.變數的值是 undefined
例如:
type type undefined"
true
> var declaredVariable;
> typeof declaredVariable
'undefined'
> typeof undefined
'undefined'
還有其他辦法可以偵測某個值是否是 undefined:
> var value = undefined; == undefined
true
> var =claredVable; undefined
true
> (function (x) { return x === undefined }())
true
> ({}).foo === undefined
true
譯者註:因此,如果想偵測一個可能沒有被宣告的全域變數是否存在,也可以使用if(window.maybeUndeclaredVariable){}。
問題:typeof 在完成這樣的任務時顯得很繁雜.
解決方法:這樣的操作不是很常見,所以有人覺的沒必要再找更好的解決辦法了。 不過也許有人會提出一個專門的操作符:
> defined undeclaredVeable> var declaredVariable;> defined declaredVariable
false
> declared declaredVariable
true
譯者註:在 perl 裡,上面的 defined 操作符相當於 defined(),上面的 declared 操作符相當於 exists()。
複製程式碼
譯者註:這只能說是最初的 JavaScript 實作的 bug,而現在標準就是這樣規範的。 V8 曾經修正並實現過 typeof null === "null",但最終證明不可行。 http://wiki.ecmascript.org/doku.php?id=harmony:typeof_null。
(翻譯:typeof 在操作null 時會回傳"object",這是JavaScript 語言本身的bug。不幸的是,這個bug 永遠不可能被修復了,因為太多已有的程式碼已經依賴了這樣的表現。
解決方法:不要使用 typeof 來做這項任務,用下面這樣的函數來代替:
f == null && x !== undefined;
}
上面的表達式等價於:
複製程式碼
又或:
複製程式碼
程式碼如下:
上面的表達式等價於:
複製程式碼
程式碼如下:
function isObjectx) {
問題:上面的偵測比較複雜,是因為 typeof 把函數和物件看成是不同的型,而且 typeof null 回傳 "object".
解決方法:下面的方法也常用於偵測物件值:
警告:你也許認為這裡可以使用 instanceof Object 來檢測,但是 instanceof 是透過使用使用一個物件的原型來判斷實例關係的,那麼沒有原型的物件怎麼辦呢:
> var obj = Object.create(null); 🎜>> Object.getPrototypeOf(obj)
null
> typeof obj
'object' > obj instanceof Object
false
在實際中,你可能很少遇到這樣的對象,但它的確存在,而且有它的用途。
譯者註:Object.prototype 就是唯一的內建的,沒有原型的物件。
程式碼如下:
>Object.getPrototypeOf(sObject.prototype. null
>typeof Object.prototype
'object'
>Object.prototype instanceof Object
false
原始值的類型是什麼?
typeof 是最好的用來查看某個原始值的類型的方式。
> typeof "abc"
> typeof "abc"
'string'
程式碼如下:
解決方法:下面的函數可以修復這個問題(只針對這個用例)。
function getPrimitiveTypeName(x) {
function getPrimitiveTypeName(x) { typeof x;
switch(typeName) {
case "undefined":
case "string":
return typeName;
case "object":
if (x === null) { default: // 前面的判斷都未通過
("參數不是原始值: " x);
}
}
某個值是否是函數
typeof 可以用來偵測一個值是否是函數。
'function '
> typeof Object.prototype.toString
'function'
原則上說,instanceof Function 也可以進行這種需求的偵測。 乍一看,似乎寫法更優雅。 但是,瀏覽器有一個怪癖:每個框架和視窗都有它自己的全域變數。 因此,如果你將某個框架中的物件傳到另一個框架中,instanceof 就無法正常運作了,因為這兩個框架有著不同的建構子。 這就是為什麼 ECMAScript5 中會有Array.isArray() 方法的原因。 如果有一個能夠跨框架的,用於檢查一個物件是否是給定的建構函數的實例的方法的話,那會很好。 上述的 getTypeName() 是一個可用的變通方法,但也許還有一個更根本的解。
綜述
下面提到的,應該是目前 JavaScript 中最迫切需要的,可以代替一些 typeof 目前職責的功能特性:
•isDefined() (例如 Object.isDefined()): 可以當作一個函數或一個運算子
•isObject()
•getTypeName()
•能夠跨框架的,偵測一個物件是否是指定的建構子的實例的機制
檢查某個變數是否已經被宣告這樣的需求,可能沒那麼必要有自己的運算子。

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

記事本++7.3.1
好用且免費的程式碼編輯器