摘要:內(nèi)置類型中有其中內(nèi)置類型空值未定義布爾值數(shù)字字符串對(duì)象符號(hào)新增在中可以用運(yùn)算符來查看值的類型,他返回的是類型的字符串值。
內(nèi)置類型
JavaScript中有其中內(nèi)置類型
空值(null)
未定義(undefined)
布爾值(boolean)
數(shù)字(number)
字符串(string)
對(duì)象(object)
符號(hào)(symbol, ES6新增)
在javascript中可以用typeof運(yùn)算符來查看值的類型,他返回的是類型的字符串值。
typeof null === "object"; //true typeof undefined === "undefined"; //true typeof true === "boolean"; //true typeof 42 === "number"; //true typeof "42" === "string"; //true typeof {life: 42} === "object"; //true typeof Symbol() === "symbol"; //true
以上除了null類型之外,其他的六種類型均有同名的字符串值與之對(duì)應(yīng),并且null是基本類型中唯一的一個(gè)假值類型,typeof對(duì)他的返回值是object
除了上述的內(nèi)置類型,還有一種情況
typeof function a(){} === "function"; //true
如此看來,function(函數(shù))也是javascript中的一個(gè)內(nèi)置類型,但是通過instanceof這個(gè)屬性可以發(fā)現(xiàn),實(shí)際上它是object的一個(gè)子類型,具體來說,可以把函數(shù)當(dāng)作可調(diào)用對(duì)象,他是一個(gè)內(nèi)部屬性[[call]], 該屬性使其可以被調(diào)用,既然是對(duì)象,那函數(shù)也有自己的屬性,函數(shù)對(duì)象的length屬性是其聲明的參數(shù)的個(gè)數(shù)
function a(b, c){} a.length; //2值和引用
在javascript中,變量可能包含兩種不同數(shù)據(jù)類型的值,基本類型值和引用類型值。
基本類型值指的是簡(jiǎn)單的數(shù)據(jù)段: 總是通過值復(fù)制的方式來賦值/傳遞,包括null,undefined,字符串,數(shù)字,布爾和ES6中的symbol
引用類型值指那些可能有多個(gè)值構(gòu)成的對(duì)象(包括數(shù)組和封裝對(duì)象和函數(shù)),則總是通過引用復(fù)制的方式來賦值/傳遞
值復(fù)制:從一個(gè)變量像另一個(gè)變量復(fù)制基本類型的值,會(huì)在變量對(duì)象上創(chuàng)建一個(gè)新值,然后將該值復(fù)制到為新變量分配的位置上,此后這兩個(gè)變量可以參與任何操作不會(huì)有相互影響。
var a = 2; var b = a; //b是a的值的一個(gè)副本 b++ a; //2 b; //3
引用復(fù)制: 從一個(gè)變量像另一個(gè)變量復(fù)制引用類型的值時(shí),同樣將會(huì)存儲(chǔ)在變量對(duì)象中的值復(fù)制一份放到新分配的空間里中。不同的是,這個(gè)值的復(fù)本實(shí)際上是一個(gè)指針,而這個(gè)指針指向存儲(chǔ)在堆中的一個(gè)對(duì)象。,兩個(gè)變量實(shí)際上將引用同一個(gè)對(duì)象,其中改變其中一個(gè)變量,就會(huì)改變另一個(gè)變量
var c = [1,2,3]; var d = c; d.push(4); c; //[1,2,3,4] d; //[1,2,3,4]
而且由于引用指向的是值本身而非變量,所以一個(gè)引用無法更改另一個(gè)引用的指向
var a = [1,2,3] var b = a; a; //[1,2,3] b; //[1,2,3] b = [4,5,6] //b指向值[4,5,6] a; //[1,2,3] b; //[4,5,6]
b = [4,5,6]并不影響a指向值[1,2,3],除非b不是指向數(shù)組的引用,而是指向函數(shù)a的指針,但在javascript中不存在這樣的情況
函數(shù)傳參: 在javascript中所有函數(shù)的參數(shù)都是按值傳遞的,也就是說,把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù)。即在向參數(shù)傳遞基本類型的值時(shí),被傳遞的值會(huì)被復(fù)制給一個(gè)局部變量,在向參數(shù)傳遞引用類型的值時(shí),會(huì)將這個(gè)值在內(nèi)存中的地址復(fù)制給一個(gè)局部變量。
function foo(x){ x.push(4); x; //[1,2,3,4]; x = [4,5,6]; x.push(7); x; //[4,5,6,7] } var a = [1,2,3]; foo(a); a; // 是[1,2,3,4]而不是[4,5,6,7];
我們?cè)谙蚝瘮?shù)傳參的時(shí)候,實(shí)際上是把引用a的復(fù)本賦值給x了,而a仍指向[1,2,3]。
字符串字符串和數(shù)組很相似,都有l(wèi)ength屬性以及indexOf()和concat()方法,在javascript中字符串是不可變的,字符串的成員函數(shù)不會(huì)改變其原始值,而是創(chuàng)建并返回一個(gè)新的字符串。
var a = foo; var b = a.toUpperCase(); a === b //false a; //"foo"; b; //"FOO"
許多數(shù)組函數(shù)用來處理字符串很方便,雖然字符串沒有這些函數(shù),但可以通過借用數(shù)組的非變更方法來處理字符串;
var a = foo; a.join; //undefined a.map; //undefined var b = Array.prototype.join.call(a, "-"); var c = Array.prototype.map.call(a, function(v){ return v.toUpperCase() + "."; }).join(""); b; //"f-o-o" c; //"F.O.O"
例如常見的字符串反轉(zhuǎn)問題
var a = "foo"; var b = Array.prototype.reverse.call(a); b; //"oof"; //也可以是 var c = a.split("").resverse().join(""); c; //"oof"
上述方法對(duì)于包含復(fù)雜字符(Unicode, 星號(hào), 多字節(jié)字符等)的字符串不適用,需要特殊的庫來實(shí)現(xiàn)
數(shù)字javascript只有一種數(shù)值類型: number(數(shù)字), 包括整數(shù)和帶小數(shù)的十進(jìn)制數(shù),javascript中沒有真正意義上的整數(shù),javascript中的整數(shù)就是沒有小數(shù)的十進(jìn)制數(shù),所以42.0等同于整數(shù)42。 而數(shù)字類型常見的問題就是
0.1 + 0.2 === 0.3 //false
這是因?yàn)槎M(jìn)制浮點(diǎn)數(shù)中的0.1和0.2并不是十分精確,他們相加的結(jié)果并非剛好等于0.3,而是一個(gè)比較接近的數(shù)字,所以判斷結(jié)果為false。
對(duì)于這種情況,最常見的方法是設(shè)置一個(gè)誤差范圍值,從ES6開始,該值定義在Number.EPSILON中我們可以直接拿來用。
if(!Number.EPSILON){ Number.EPSILON = Math.pow(2, -52); } function foo(n1, n2){ return Math.abs(n1 - n2) < Number.EPSILON } var a = 0.1 + 0.2 var b = 0.3 foo(a, b); //true特殊的數(shù)字
1.不是數(shù)字的數(shù)字
如果數(shù)學(xué)運(yùn)算的操作數(shù)不是數(shù)字類型(或者無法解析常規(guī)的十進(jìn)制或十六進(jìn)制數(shù)字),就無法返回一個(gè)有效的數(shù)字,這種情況下返回值為NaN。例如
var a = 2 / "foo"; //NaN typeof a === "number"; // true
NaN是一個(gè)警戒值,用于指出數(shù)字類型中的錯(cuò)誤情況,即執(zhí)行數(shù)學(xué)運(yùn)算沒有成功,這是失敗后返回的結(jié)果。他是一個(gè)特殊值,她和自身不相等
var a = 2 / "foo" a === NaN; //false
我們可以用內(nèi)建的全局工具函數(shù)isNaN(..)來判斷一個(gè)值是否是NaN,但是這種方法有嚴(yán)重缺陷
var a = 2 / "foo"; var b = foo; window.isNaN(a); //true; window.isNaN(b); //true;
對(duì)于這種現(xiàn)象,ES6開始使用工具函數(shù)Number.isNaN(..)
if(!Number.isNaN){ Number.isNaN = function(n){ return n !== n; } } var a = 2 / "foo"; var b = foo; Number.isNaN(a); //true Number.isNaN(b); //false
2.無窮數(shù)
在javascript中1 / 0 和 - 1 / 0這種操作會(huì)返回Infinity或者-Infinity
javascript使用有限數(shù)字表示法,所以javascript的運(yùn)算結(jié)果容易溢出,此時(shí)結(jié)果為Infinity或者-Infinity。
3.零值
javascript中有一個(gè)常規(guī)的0,還有一個(gè)-0
var a = 0 / -3; // -0 var b = 0 * -3; // -0
對(duì)-0進(jìn)行字符串化會(huì)返回0
var a = 0 / -3; a.toString(); //"0"; a + ""; //"0"
將其從字符串轉(zhuǎn)換成數(shù)字,得到的結(jié)果是正確的
+ "-0"; //"0" Number("-0"); //"0"布爾
javascript中有兩個(gè)關(guān)鍵詞true和false,代表真和假,其他數(shù)據(jù)類型的值可以強(qiáng)制轉(zhuǎn)換為布爾值。在javascript中假值有這些:
undefined,null,false,+0, -0和NaN,""。除了這些值之外其他是真值。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/84810.html
摘要:對(duì)象數(shù)組初始化表達(dá)式,闖關(guān)記之上文檔對(duì)象模型是針對(duì)和文檔的一個(gè)。闖關(guān)記之?dāng)?shù)組數(shù)組是值的有序集合。數(shù)組是動(dòng)態(tài)的,根闖關(guān)記之語法的語法大量借鑒了及其他類語言如和的語法。 《JavaScript 闖關(guān)記》之 DOM(下) Element 類型 除了 Document 類型之外,Element 類型就要算是 Web 編程中最常用的類型了。Element 類型用于表現(xiàn) XML 或 HTML 元素...
摘要:專題系列共計(jì)篇,主要研究日常開發(fā)中一些功能點(diǎn)的實(shí)現(xiàn),比如防抖節(jié)流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點(diǎn)是研究專題之函數(shù)組合專題系列第十六篇,講解函數(shù)組合,并且使用柯里化和函數(shù)組合實(shí)現(xiàn)模式需求我們需要寫一個(gè)函數(shù),輸入,返回。 JavaScript 專題之從零實(shí)現(xiàn) jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實(shí)現(xiàn)一個(gè) jQuery 的 ext...
摘要:將元素作為對(duì)象的鍵,默認(rèn)鍵對(duì)應(yīng)的值為如果對(duì)象中沒有這個(gè)鍵,則將這個(gè)元素放入結(jié)果數(shù)組中去。 前言 數(shù)組去重在日常開發(fā)中的使用頻率還是較高的,也是網(wǎng)上隨便一抓一大把的話題,所以,我寫這篇文章目的在于歸納和總結(jié),既然很多人都在提的數(shù)組去重,自己到底了解多少呢。又或者是如果自己在開發(fā)中遇到了去重的需求,自己能想到更好的解決方案嗎。 這次我們來理一理怎么做數(shù)組去重才能做得最合適,既要考慮兼容性,...
摘要:進(jìn)階期理解中的執(zhí)行上下文和執(zhí)行棧進(jìn)階期深入之執(zhí)行上下文棧和變量對(duì)象但是今天補(bǔ)充一個(gè)知識(shí)點(diǎn)某些情況下,調(diào)用堆棧中函數(shù)調(diào)用的數(shù)量超出了調(diào)用堆棧的實(shí)際大小,瀏覽器會(huì)拋出一個(gè)錯(cuò)誤終止運(yùn)行。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo)) 本周正式開始前端進(jìn)階的第一期,本周的主題是調(diào)用堆棧,今天是第3天。 本計(jì)劃一共28期,每期重點(diǎn)攻...
摘要:之關(guān)鍵字保留字變量及數(shù)據(jù)類型個(gè)人總結(jié),分享也供自己日后查詢變量中變量通過關(guān)鍵字來聲明的。在使用聲明變量但未對(duì)其加以初始化時(shí),這個(gè)變量的值就是,例如在控制臺(tái)輸出是也就是未定義類型布爾類型該類型只有兩個(gè)字面值和。 javascript之關(guān)鍵字,保留字, 變量及數(shù)據(jù)類型 個(gè)人總結(jié),分享也供自己日后查詢 1.變量 javascript 中變量通過var關(guān)鍵字(variable)來聲明的。 變量...
摘要:以和為例,說明中的數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)。對(duì)象用來表示通用的固定長(zhǎng)度的原始二進(jìn)制數(shù)據(jù)緩沖區(qū)。中的數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)對(duì)和有了一個(gè)大概的了解,下面讓我們來看下它是如何進(jìn)行二進(jìn)制數(shù)據(jù)操作的。 概述 本文主要通過對(duì)JavaScript中數(shù)字?jǐn)?shù)據(jù)與二進(jìn)制數(shù)據(jù)之間的轉(zhuǎn)換,讓讀者能夠了解在JavaScript中如何對(duì)數(shù)字類型(包括但不限于Number類型)進(jìn)行處理。 二進(jìn)制數(shù)據(jù)在日常...
閱讀 3279·2021-10-11 11:08
閱讀 4424·2021-09-22 15:54
閱讀 912·2019-08-30 15:56
閱讀 864·2019-08-30 15:55
閱讀 3540·2019-08-30 15:52
閱讀 1352·2019-08-30 15:43
閱讀 1937·2019-08-30 11:14
閱讀 2504·2019-08-29 16:11