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

資訊專(zhuān)欄INFORMATION COLUMN

JS數(shù)據(jù)類(lèi)型& 判斷

zhangxiangliang / 1841人閱讀

摘要:的數(shù)據(jù)類(lèi)型,共有六種。通常,數(shù)值字符串布爾值這三種類(lèi)型,合稱(chēng)為原始類(lèi)型的值,即它們是最基本的數(shù)據(jù)類(lèi)型,不能再細(xì)分了。運(yùn)算符返回一個(gè)布爾值,表示某個(gè)對(duì)象是否為指定的構(gòu)造函數(shù)的實(shí)例。

以下內(nèi)容摘自阮一峰-JavaScript-標(biāo)準(zhǔn)參考教程

數(shù)據(jù)類(lèi)型

JavaScript 語(yǔ)言的每一個(gè)值,都屬于某一種數(shù)據(jù)類(lèi)型。JavaScript 的數(shù)據(jù)類(lèi)型,共有六種。(ES6 又新增了第七種 Symbol 類(lèi)型的值)

數(shù)值(number):整數(shù)和小數(shù)(比如1和3.14)
字符串(string):文本(比如Hello World)。
布爾值(boolean):表示真?zhèn)蔚膬蓚€(gè)特殊值,即true(真)和false(假)
undefined:表示“未定義”或不存在,即由于目前沒(méi)有定義,所以此處暫時(shí)沒(méi)有任何值
null:表示空值,即此處的值為空。
對(duì)象(object):各種值組成的集合。

通常,數(shù)值、字符串、布爾值這三種類(lèi)型,合稱(chēng)為原始類(lèi)型(primitive type)的值,即它們是最基本的數(shù)據(jù)類(lèi)型,不能再細(xì)分了。對(duì)象則稱(chēng)為合成類(lèi)型(complex type)的值,因?yàn)橐粋€(gè)對(duì)象往往是多個(gè)原始類(lèi)型的值的合成,可以看作是一個(gè)存放各種值的容器。至于undefined和null,一般將它們看成兩個(gè)特殊值。

對(duì)象是最復(fù)雜的數(shù)據(jù)類(lèi)型,又可以分成三個(gè)子類(lèi)型。

對(duì)象(object)

數(shù)組(array)

函數(shù)(function)

判斷數(shù)據(jù)類(lèi)型

JavaScript 有三種方法,可以確定一個(gè)值到底是什么類(lèi)型。

typeof運(yùn)算符

instanceof運(yùn)算符

Object.prototype.toString方法

typeof運(yùn)算符

typeof運(yùn)算符可以返回一個(gè)值的數(shù)據(jù)類(lèi)型。

數(shù)值、字符串、布爾值分別返回number、string、boolean。

typeof 123 // "number"
typeof "123" // "string"
typeof false // "boolean"

函數(shù)返回function。

function f() {}
typeof f
// "function"
      

undefined返回undefined

typeof undefined
// "undefined"

這個(gè)特點(diǎn)通常用在判斷語(yǔ)句

if (typeof v === "undefined") {
  // ...
}  
  

對(duì)象返回object。

typeof window // "object"
typeof {} // "object"
typeof [] // "object"*

null返回object。

 `typeof null // "object"
instanceof 運(yùn)算符

instanceof運(yùn)算符可以區(qū)分?jǐn)?shù)組和對(duì)象。
instanceof運(yùn)算符返回一個(gè)布爾值,表示某個(gè)對(duì)象是否為指定的構(gòu)造函數(shù)的實(shí)例。

var o = {};
var a = [];

o instanceof Array // false
a instanceof Array // true

var v = new Vehicle();
v instanceof Vehicle // true

上面代碼中,對(duì)象v是構(gòu)造函數(shù)Vehicle的實(shí)例,所以返回true。

instanceof運(yùn)算符的左邊是實(shí)例對(duì)象,右邊是構(gòu)造函數(shù)。它會(huì)檢查右邊構(gòu)建函數(shù)的原型對(duì)象(prototype),是否在左邊對(duì)象的原型鏈上。因此,下面兩種寫(xiě)法是等價(jià)的。

 v instanceof Vehicle
// 等同于
Vehicle.prototype.isPrototypeOf(v)
    

由于instanceof對(duì)整個(gè)原型鏈上的對(duì)象都有效,因此同一個(gè)實(shí)例對(duì)象,可能會(huì)對(duì)多個(gè)構(gòu)造函數(shù)都返回true。

var d = new Date();
d instanceof Date // true
d instanceof Object // true

上面代碼中,d同時(shí)是Date和Object的實(shí)例,因此對(duì)這兩個(gè)構(gòu)造函數(shù)都返回true。

instanceof的原理是檢查原型鏈,對(duì)于那些不存在原型鏈的對(duì)象,就無(wú)法判斷。

Object.create(null) instanceof Object // false

上面代碼中,Object.create(null)返回的新對(duì)象的原型是null,即不存在原型,因此instanceof就認(rèn)為該對(duì)象不是Object的實(shí)例。

除了上面這種繼承null的特殊情況,JavaScript 之中,只要是對(duì)象,就有對(duì)應(yīng)的構(gòu)造函數(shù)。因此,instanceof運(yùn)算符的一個(gè)用處,是判斷值的類(lèi)型。

var x = [1, 2, 3];
var y = {};
x instanceof Array // true
y instanceof Object // true

上面代碼中,instanceof運(yùn)算符判斷,變量x是數(shù)組,變量y是對(duì)象。

注意,instanceof運(yùn)算符只能用于對(duì)象,不適用原始類(lèi)型的值。

var s = "hello";
s instanceof String // false

上面代碼中,字符串不是String對(duì)象的實(shí)例(因?yàn)樽址皇菍?duì)象),所以返回false。

此外,對(duì)于undefined和null,instanceOf運(yùn)算符總是返回false。

undefined instanceof Object // false
null instanceof Object // false

利用instanceof運(yùn)算符,還可以巧妙地解決,調(diào)用構(gòu)造函數(shù)時(shí),忘了加new命令的問(wèn)題。

function Fubar (foo, bar) {
  if (this instanceof Fubar) {
    this._foo = foo;
    this._bar = bar;
  }
  else {
    return new Fubar(foo, bar);
  }
}

上面代碼使用instanceof運(yùn)算符,在函數(shù)體內(nèi)部判斷this關(guān)鍵字是否為構(gòu)造函數(shù)Fubar的實(shí)例。如果不是,就表明忘了加new命令。

Object.prototype.toString()

toString方法的作用是返回一個(gè)對(duì)象的字符串形式,默認(rèn)情況下返回類(lèi)型字符串。

var o1 = new Object();
o1.toString() // "[object Object]"

var o2 = {a:1};
o2.toString() // "[object Object]"

上面代碼表示,對(duì)于一個(gè)對(duì)象調(diào)用toString方法,會(huì)返回字符串[object Object],該字符串說(shuō)明對(duì)象的類(lèi)型。
字符串[object Object]本身沒(méi)有太大的用處,但是通過(guò)自定義toString方法,可以讓對(duì)象在自動(dòng)類(lèi)型轉(zhuǎn)換時(shí),得到想要的字符串形式。

var obj = new Object();

obj.toString = function () {
  return "hello";
};

obj + " " + "world" // "hello world"

上面代碼表示,當(dāng)對(duì)象用于字符串加法時(shí),會(huì)自動(dòng)調(diào)用toString方法。由于自定義了toString方法,所以返回字符串hello world。

數(shù)組、字符串、函數(shù)、Date 對(duì)象都分別部署了自定義的toString方法,覆蓋了Object.prototype.toString方法。

[1, 2, 3].toString() // "1,2,3"

"123".toString() // "123"

(function () {
  return 123;
}).toString()
// "function () {
//   return 123;
// }"

(new Date()).toString()
// "Tue May 10 2016 09:11:31 GMT+0800 (CST)"

上面代碼中,數(shù)組、字符串、函數(shù)、Date 對(duì)象調(diào)用toString方法,并不會(huì)返回[object Object],因?yàn)樗鼈兌甲远x了toString方法,覆蓋原始方法。

**toString() 的應(yīng)用:判斷數(shù)據(jù)類(lèi)型
Object.prototype.toString方法返回對(duì)象的類(lèi)型字符串,因此可以用來(lái)判斷一個(gè)值的類(lèi)型。**

var obj = {};
obj.toString() // "[object Object]"

上面代碼調(diào)用空對(duì)象的toString方法,結(jié)果返回一個(gè)字符串object Object,其中第二個(gè)Object表示該值的構(gòu)造函數(shù)。這是一個(gè)十分有用的判斷數(shù)據(jù)類(lèi)型的方法。

由于實(shí)例對(duì)象可能會(huì)自定義toString方法,覆蓋掉Object.prototype.toString方法,所以為了得到類(lèi)型字符串,最好直接使用Object.prototype.toString方法。通過(guò)函數(shù)的call方法,可以在任意值上調(diào)用這個(gè)方法,幫助我們判斷這個(gè)值的類(lèi)型。

Object.prototype.toString.call(value)

上面代碼表示對(duì)value這個(gè)值調(diào)用Object.prototype.toString方法。

不同數(shù)據(jù)類(lèi)型的Object.prototype.toString方法返回值如下。

數(shù)值:返回[object Number]。
字符串:返回[object String]。
布爾值:返回[object Boolean]。
undefined:返回[object Undefined]。
null:返回[object Null]。
數(shù)組:返回[object Array]。
arguments 對(duì)象:返回[object Arguments]。
函數(shù):返回[object Function]。
Error 對(duì)象:返回[object Error]。
Date 對(duì)象:返回[object Date]。
RegExp 對(duì)象:返回[object RegExp]。
其他對(duì)象:返回[object Object]。

這就是說(shuō),Object.prototype.toString可以看出一個(gè)值到底是什么類(lèi)型。

Object.prototype.toString.call(2) // "[object Number]"
Object.prototype.toString.call("") // "[object String]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(Math) // "[object Math]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call([]) // "[object Array]"

利用這個(gè)特性,可以寫(xiě)出一個(gè)比typeof運(yùn)算符更準(zhǔn)確的類(lèi)型判斷函數(shù)。

    var type = function (o){
      var s = Object.prototype.toString.call(o);
      return s.match(/[object (.*?)]/)[1].toLowerCase();
    };
    
    type({}); // "object"
    type([]); // "array"
    type(5); // "number"
    type(null); // "null"
    type(); // "undefined"
    type(/abcd/); // "regex"
    type(new Date()); // "date"

在上面這個(gè)type函數(shù)的基礎(chǔ)上,還可以加上專(zhuān)門(mén)判斷某種類(lèi)型數(shù)據(jù)的方法。

var type = function (o){
  var s = Object.prototype.toString.call(o);
  return s.match(/[object (.*?)]/)[1].toLowerCase();
};

["Null",
 "Undefined",
 "Object",
 "Array",
 "String",
 "Number",
 "Boolean",
 "Function",
 "RegExp"
].forEach(function (t) {
  type["is" + t] = function (o) {
    return type(o) === t.toLowerCase();
  };
});

type.isObject({}) // true
type.isNumber(NaN) // true
type.isRegExp(/abc/) // true
null 和 undefined

null與undefined都可以表示“沒(méi)有”,含義非常相似。將一個(gè)變量賦值為undefined或null,老實(shí)說(shuō),語(yǔ)法效果幾乎沒(méi)區(qū)別。

在if語(yǔ)句中,它們都會(huì)被自動(dòng)轉(zhuǎn)為false,相等運(yùn)算符(==)甚至直接報(bào)告兩者相等。

if (!undefined) {
  console.log("undefined is false");
}
// undefined is false

if (!null) {
  console.log("null is false");
}
// null is false

undefined == null
// true

null是一個(gè)表示“空”的對(duì)象,轉(zhuǎn)為數(shù)值時(shí)為0;undefined是一個(gè)表示”此處無(wú)定義”的原始值,轉(zhuǎn)為數(shù)值時(shí)為NaN

Number(null) // 0
5 + null // 5

Number(undefined) // NaN
5 + undefined // NaN

null,undefined 用法
對(duì)于null和undefined,大致可以像下面這樣理解。

null表示空值,即該處的值現(xiàn)在為空。調(diào)用函數(shù)時(shí),某個(gè)參數(shù)未設(shè)置任何值,這時(shí)就可以傳入null,表示該參數(shù)為空。比如,某個(gè)函數(shù)接受引擎拋出的錯(cuò)誤作為參數(shù),如果運(yùn)行過(guò)程中未出錯(cuò),那么這個(gè)參數(shù)就會(huì)傳入null,表示未發(fā)生錯(cuò)誤。

undefined表示“未定義”,下面是返回undefined的典型場(chǎng)景。

// 變量聲明了,但沒(méi)有賦值
var i;
i // undefined

// 調(diào)用函數(shù)時(shí),應(yīng)該提供的參數(shù)沒(méi)有提供,該參數(shù)等于 undefined
function f(x) {
  return x;
}
f() // undefined

// 對(duì)象沒(méi)有賦值的屬性
var  o = new Object();
o.p // undefined

// 函數(shù)沒(méi)有返回值時(shí),默認(rèn)返回 undefined
function f() {}
f() // undefined

布爾值

布爾值代表“真”和“假”兩個(gè)狀態(tài)。“真”用關(guān)鍵字true表示,“假”用關(guān)鍵字false表示。布爾值只有這兩個(gè)值。

下列運(yùn)算符會(huì)返回布爾值:

兩元邏輯運(yùn)算符: && (And),|| (Or)
前置邏輯運(yùn)算符: ! (Not)
相等運(yùn)算符:===,!==,==,!=
比較運(yùn)算符:>,>=,<,<=

如果 JavaScript 預(yù)期某個(gè)位置應(yīng)該是布爾值,會(huì)將該位置上現(xiàn)有的值自動(dòng)轉(zhuǎn)為布爾值。轉(zhuǎn)換規(guī)則是除了下面六個(gè)值被轉(zhuǎn)為false,其他值都視為true。

undefined
null
false
0
NaN
""或""(空字符串)

布爾值往往用于程序流程的控制,請(qǐng)看一個(gè)例子。

if ("") {
  console.log("true");
}

// 沒(méi)有任何輸出
上面代碼中,if命令后面的判斷條件,預(yù)期應(yīng)該是一個(gè)布爾值,所以 JavaScript 自動(dòng)將空字符串,轉(zhuǎn)為布爾值false,導(dǎo)致程序不會(huì)進(jìn)入代碼塊,所以沒(méi)有任何輸出。

注意,空數(shù)組([])和空對(duì)象({})對(duì)應(yīng)的布爾值,都是true。

if ([]) {
  console.log("true");
}
// true

if ({}) {
  console.log("true");
}
// true

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

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

相關(guān)文章

  • 溫故js系列(9)-相等==&amp;嚴(yán)格相等===&amp;代碼里的那些判斷

    摘要:業(yè)務(wù)越復(fù)雜,邏輯就越復(fù)雜,判斷就越多比較判斷比較判斷是比較兩個(gè)值,返回一個(gè)布爾值,表示是否滿(mǎn)足比較條件。對(duì)于非布爾值的數(shù)據(jù),取反運(yùn)算符會(huì)自動(dòng)將其轉(zhuǎn)為布爾值。 前端學(xué)習(xí):教程&開(kāi)發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:========== JavaScript-判斷 代碼中,多多少少會(huì)有判斷語(yǔ)句。業(yè)務(wù)越復(fù)雜,邏輯就越...

    libin19890520 評(píng)論0 收藏0
  • 解析JavaScript判斷兩個(gè)值相等的方法

      本篇文章主要是講述在JavaScript中判斷兩個(gè)值相等,不要認(rèn)為很簡(jiǎn)單,要注意的是在JavaScript中存在4種不同的相等邏輯。  ECMAScript 是 JavaScript 的語(yǔ)言規(guī)范,在ECMAScript 規(guī)范中存在四種相等算法,如下圖所示:  上圖中每個(gè)依次寫(xiě)下來(lái),很多前端應(yīng)該熟悉嚴(yán)格相等和非嚴(yán)格相等,但對(duì)于同值零和同值卻不熟悉,現(xiàn)在就依次下面四種方法?! ⊥怠 ⊥盗恪 》?..

    3403771864 評(píng)論0 收藏0
  • 溫故js系列(1)-基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型判斷&amp;存儲(chǔ)訪問(wèn)&amp;類(lèi)型轉(zhuǎn)換

    摘要:引用數(shù)據(jù)類(lèi)型引用數(shù)據(jù)類(lèi)型值指保存在堆內(nèi)存中的對(duì)象。訪問(wèn)方式是按引用訪問(wèn)。數(shù)據(jù)類(lèi)型檢測(cè)操作符是檢測(cè)基本類(lèi)型的最佳工具。未定義布爾值字符串?dāng)?shù)值對(duì)象或函數(shù)用于檢測(cè)引用類(lèi)型,可以檢測(cè)到它是什么類(lèi)型的實(shí)例。 前端學(xué)習(xí):教程&開(kāi)發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:數(shù)據(jù)類(lèi)型 回味,無(wú)窮! 數(shù)據(jù)類(lèi)型定義 數(shù)據(jù)類(lèi)型分類(lèi) 基本數(shù)據(jù)...

    jone5679 評(píng)論0 收藏0
  • 解析ES6變量賦值和基本數(shù)據(jù)類(lèi)型

      let和const  let和const兩者并不存在變量提升  這里要說(shuō)明的是變量一定要在聲明后使用,否則報(bào)錯(cuò)。  vara=[];   for(vari=0;i<10;i++){   a[i]=function(){   console.log(i);   };   }   a[6]();//10  變量i是var聲明的,我們要知道這里在全局范圍內(nèi)都有效。我們要知道在每一次循環(huán)中,新的...

    3403771864 評(píng)論0 收藏0
  • JavaScript中讓x==1&&x==2&&x==3等式成立演示

      要是別人問(wèn)您:如何讓 x 等于 1 且讓 x 等于 2 且讓 x 等于 3 的等式成立?  咋地,知道如何實(shí)現(xiàn)?想罵人有不  現(xiàn)在我們一起來(lái)分解思路:  我們先來(lái)講講寬松相等== 和嚴(yán)格相等 ===,這兩個(gè)都能用來(lái)判斷兩個(gè)值是否相等,但們明確上文提到的等于指的是哪一種,二者的區(qū)別看下:  (1) 這兩個(gè)基礎(chǔ)直接的區(qū)別:  (1.1) 不同類(lèi)型間比較,== 比較轉(zhuǎn)化成同一類(lèi)型后的值看值是否相等,...

    3403771864 評(píng)論0 收藏0
  • 簡(jiǎn)化until封裝watch常用邏輯代碼

      有對(duì)回調(diào)進(jìn)行控制的watchWithFilter,有適用于當(dāng)watch的值為真值時(shí)觸發(fā)回調(diào)的whenever,還有只觸發(fā)一次的watchOnce和最多觸發(fā)一定次數(shù)的watchAtMost。怎么樣?是不是很多相似場(chǎng)景都有用到,主要是被觀察的變量在滿(mǎn)足某個(gè)具體條件時(shí)則觸發(fā)回調(diào),本篇文章until就是直到滿(mǎn)足某種條件時(shí)則觸發(fā)一次回調(diào)函數(shù)。我們直接看代碼。  1.示例  關(guān)于demo代碼:  <...

    3403771864 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<