摘要:的數(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/) // truenull 和 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
摘要:業(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ù)雜,邏輯就越...
本篇文章主要是講述在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)在就依次下面四種方法?! ⊥怠 ⊥盗恪 》?..
摘要:引用數(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ù)...
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)中,新的...
要是別人問(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)型后的值看值是否相等,...
有對(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代碼: <...
閱讀 651·2021-10-13 09:39
閱讀 1459·2021-09-09 11:53
閱讀 2653·2019-08-29 13:55
閱讀 730·2019-08-28 18:08
閱讀 2599·2019-08-26 13:54
閱讀 2413·2019-08-26 11:44
閱讀 1842·2019-08-26 11:41
閱讀 3791·2019-08-26 10:15