成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

typeof 和 instanceOf的區(qū)別

Aceyclee / 2746人閱讀

摘要:如果左側(cè)的對象是右側(cè)類的實例,則返回而中對象的類是通過初始化它們的構造函數(shù)來定義的。其語法是操作符用來比較兩個操作數(shù)的構造函數(shù)。

關于typeof

typeof一元運算符,用來返回操作數(shù)類型的字符串。

typeof幾乎不可能得到它們想要的結果。typeof只有一個實際應用場景,就是用來檢測一個對象是否已經(jīng)定義或者是否已經(jīng)賦值。而這個應用卻不是來檢查對象的類型。

Value Class Type
"foo" String string
new String("foo") String object
1.2 Number number
new Number(1.2) Number object
true Boolean boolean
new Boolean(true) Boolean object
new Date() Date object
new Error() Error object
[1,2,3] Array object
new Array(1, 2, 3) Array object
new Function("") Function function
/abc/g RegExp object (function in Nitro/V8)
new RegExp("meow") RegExp object (function in Nitro/V8)
{} Object object
new Object() Object object

上面表格中,Type 一列表示 typeof 操作符的運算結果。可以看到,這個值在大多數(shù)情況下都返回 "object"。

Class 一列表示對象的內(nèi)部屬性 [[Class]] 的值。

JavaScript 標準文檔中定義: [[Class]] 的值只可能是下面字符串中的一個: Arguments, Array, Boolean, Date, Error, Function, JSON, Math, Number, Object, RegExp, String.
為了獲取對象的 [[Class]],我們需要使用定義在 Object.prototype 上的方法 toString。

對象的類定義

JavaScript 標準文檔只給出了一種獲取 [[Class]] 值的方法,那就是使用 Object.prototype.toString。

function is(type, obj) {
    var clas = Object.prototype.toString.call(obj).slice(8, -1);
    return obj !== undefined && obj !== null && clas === type;
}

is("String", "test"); // true
is("String", new String("test")); // true

上面例子中,Object.prototype.toString 方法被調(diào)用,this 被設置為了需要獲取 [[Class]] 值的對象。

注:Object.prototype.toString 返回一種標準格式字符串,所以上例可以通過 slice 截取指定位置的字符串,如下所示:

Object.prototype.toString.call([])    // "[object Array]"
Object.prototype.toString.call({})    // "[object Object]"
Object.prototype.toString.call(2)    // "[object Number]"

注:這種變化可以從 IE8 和 Firefox 4 中看出區(qū)別,如下所示:

// IE8
Object.prototype.toString.call(null)    // "[object Object]"
Object.prototype.toString.call(undefined)    // "[object Object]"

// Firefox 4
Object.prototype.toString.call(null)    // "[object Null]"
Object.prototype.toString.call(undefined)    // "[object Undefined]"

測試為定義變量

typeof foo !== "undefined"

上面代碼會檢測 foo 是否已經(jīng)定義;如果沒有定義而直接使用會導致 ReferenceError 的異常。 這是 typeof 唯一有用的地方。

結論

為了檢測一個對象的類型,強烈推薦使用 Object.prototype.toString 方法; 因為這是唯一一個可依賴的方式。正如上面表格所示,typeof 的一些返回值在標準文檔中并未定義, 因此不同的引擎實現(xiàn)可能不同。

除非為了檢測一個變量是否已經(jīng)定義,我們應盡量避免使用 typeof 操作符。

x typeof x
undefined "undefined"
true 或false "boolean"
任意數(shù)字或者NaN "number"
任意字符串 "string"
函數(shù)對象(在ECMA-262術語中,指的是實現(xiàn)了[[Call]] 的對象) "function"
任意內(nèi)置對象(非函數(shù)) "object"
數(shù)組 "obeject"
null "object"
宿主對象(JS引擎內(nèi)置對象,而不是DOM或者其他提供的) 由編譯器各自實現(xiàn)的字符串,但不是"undefined","number","boolean","number","string"。
正則表達式 各瀏覽器表現(xiàn)不一

如果想將null和對象區(qū)分開,則必須針對特殊值顯式檢測。如:my_value===null。對于宿主對象來說,typeof有可能并不返回‘object’,而返回字符串。但實際上客戶端js中的大多數(shù)宿主對象都是‘object’類型。對于所有內(nèi)置可執(zhí)行對象進行typeof運算都將返回“function”。

// Numbers
typeof 37 === "number";
typeof 3.14 === "number";
typeof Math.LN2 === "number";
typeof Infinity === "number";
typeof NaN === "number"; // 盡管NaN是"Not-A-Number"的縮寫,意思是"不是一個數(shù)字"
typeof Number(1) === "number"; // 不要這樣使用!

// Strings
typeof "" === "string";
typeof "bla" === "string";
typeof (typeof 1) === "string"; // typeof返回的肯定是一個字符串
typeof String("abc") === "string"; // 不要這樣使用!

// Booleans
typeof true === "boolean";
typeof false === "boolean";
typeof Boolean(true) === "boolean"; // 不要這樣使用!

// Undefined
typeof undefined === "undefined";
typeof blabla === "undefined"; // 一個未定義的變量,或者一個定義了卻未賦初值的變量

// Objects
typeof {a:1} === "object";
typeof [1, 2, 4] === "object"; 
// 使用Array.isArray或者Object.prototype.toString.call方法
//可以分辨出一個數(shù)組和真實的對象
typeof new Date() === "object";

typeof new Boolean(true) === "object" // 令人困惑.不要這樣使用
typeof new Number(1) === "object" // 令人困惑.不要這樣使用
typeof new String("abc") === "object";  // 令人困惑.不要這樣使用
// Functions
typeof function(){} === "function";
typeof Math.sin === "function";






關于instanceof

instanceof 左操作數(shù)是一個類,右操作數(shù)是標識對象的類。如果左側(cè)的對象是右側(cè)類的實例,則返回true.而js中對象的類是通過初始化它們的構造函數(shù)來定義的。即instanceof的右操作數(shù)應當是一個函數(shù)。所有的對象都是object的實例。如果左操作數(shù)不是對象,則返回false,如果右操作數(shù)不是函數(shù),則拋出typeError。

instanceof 運算符是用來測試一個對象是否在其原型鏈原型構造函數(shù)的屬性。其語法是object instanceof constructor

instanceof 操作符用來比較兩個操作數(shù)的構造函數(shù)。只有在比較自定義的對象時才有意義。 如果用來比較內(nèi)置類型,將會和 typeof 操作符 一樣用處不大。

比較自定義對象

function Foo() {}
function Bar() {}
Bar.prototype = new Foo();

new Bar() instanceof Bar; // true
new Bar() instanceof Foo; // true

// 如果僅僅設置 Bar.prototype 為函數(shù) Foo 本身,而不是 Foo 構造函數(shù)的一個實例
Bar.prototype = Foo;
new Bar() instanceof Foo; // false

instanceof 比較內(nèi)置類型

new String("foo") instanceof String; // true
new String("foo") instanceof Object; // true

"foo" instanceof String; // false
"foo" instanceof Object; // false

有一點需要注意,instanceof 用來比較屬于不同 JavaScript 上下文的對象(比如,瀏覽器中不同的文檔結構)時將會出錯, 因為它們的構造函數(shù)不會是同一個對象。

結論:instanceof 操作符應該僅僅用來比較來自同一個 JavaScript 上下文的自定義對象。 正如 typeof 操作符一樣,任何其它的用法都應該是避免的。

function C(){} // defining a constructor
function D(){} // defining another constructor

var o = new C();
o instanceof C; // true, because: Object.getPrototypeOf(o) === C.prototype
o instanceof D; // false, because D.prototype is nowhere in o"s prototype chain
o instanceof Object; // true, because:
C.prototype instanceof Object // true

C.prototype = {};
var o2 = new C();
o2 instanceof C; // true
o instanceof C; // false, because C.prototype is nowhere in o"s prototype chain anymore

D.prototype = new C(); // use inheritance
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true

var myString = new String();
var myDate = new Date();

myString instanceof String; // returns true
myString instanceof Object; // returns true
myString instanceof Date;   // returns false

myDate instanceof Date;     // returns true
myDate instanceof Object;   // returns true
myDate instanceof String;   // returns false
function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}
var mycar = new Car("Honda", "Accord", 1998);
var a = mycar instanceof Car;    // returns true
var b = mycar instanceof Object; // returns true

引用資料:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof

http://bonsaiden.github.io/JavaScript-Garden/zh/#types.instanceof

https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Operators/typeof

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/87651.html

相關文章

  • JS中typeofinstanceof區(qū)別

    摘要:中和常用來判斷一個變量是否為空,或者是什么類型的。運算符返回一個用來表示表達式的數(shù)據(jù)類型的字符串。運算符用來測試一個對象在其原型鏈中是否存在一個構造函數(shù)的屬性。檢查原型鏈會找到同上 JavaScript 中typeof 和 instanceof 常用來判斷一個變量是否為空,或者是什么類型的。但它們之間還是有區(qū)別的: typeof typeof 是一個一元運算,放在一個運算數(shù)之前,運算數(shù)...

    zhoutk 評論0 收藏0
  • typeofinstanceof區(qū)別

    摘要:運算符用來測試一個對象在其原型鏈中是否存在一個構造函數(shù)的屬性。多個窗口意味著多個全局環(huán)境,不同的全局環(huán)境擁有不同的全局對象,從而擁有不同的內(nèi)置類型構造函數(shù)。 instanceofinstanceof 運算符用來測試一個對象在其原型鏈中是否存在一個構造函數(shù)的 prototype 屬性。語法object instanceof constructor描述instanceof 運算符用來檢測 ...

    ghnor 評論0 收藏0
  • 【1】JavaScript 基礎深入——數(shù)據(jù)類型深入理解與總結

    摘要:類型的實例首先要理解的含義是例子的意思,實際上是判斷是否是的一個實例。 數(shù)據(jù)類型深入理解 數(shù)據(jù)類型分類 基本(值)類型(5種) String:任意字符串 Number:任意的數(shù)字 boolean:true/false null:null undefined:undefined 對象(引用)類型(3種) Object:任意對象 Array:一種特別的對象(數(shù)值下...

    since1986 評論0 收藏0
  • 【重溫基礎】instanceof運算符

    摘要:需要測試的函數(shù)構造函數(shù)即用運算符來檢測是否存在參數(shù)的原型鏈。區(qū)別只能用來判斷對象函數(shù)和數(shù)組,不能用來判斷字符串和數(shù)字等用于判斷一個表達式的原始值,返回一個字符串。一般返回結果有函數(shù)數(shù)組,對象。 最近開始在整理ES6/ES7/ES8/ES9的知識點(已經(jīng)上傳到 我的博客 上),碰到一些知識點是自己已經(jīng)忘記(用得少的知識點),于是也重新復習了一遍。 這篇文章要復習的 instanc...

    jimhs 評論0 收藏0
  • 原型模式故事鏈(3)--JS數(shù)據(jù)類型、以及區(qū)別、區(qū)分、轉(zhuǎn)化

    摘要:所以不論你媽媽是喊,狗蛋回家吃飯了,還是喊小明回家吃飯了,其實喊的都是你。當然的嘛狗蛋買了件新衣服,小明當然就有這件新衣服了。。。 上一章--原型鏈講解:傳送門:https://segmentfault.com/a/11... 在上一章講解原型鏈時提到了:所有的引用類型都有一個_proto_屬性,稱之為隱式原型。那么引用類型是什么鬼? 盡量簡單的講解一下javascript中的數(shù)據(jù)類...

    stdying 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<