摘要:以下這個(gè)情況并非獨(dú)有,任何采用二進(jìn)制浮點(diǎn)數(shù),依據(jù)都會(huì)如此這是因?yàn)橛枚M(jìn)制浮點(diǎn)表示并不精確。是,不過更準(zhǔn)確的定義應(yīng)該是,,因?yàn)閷?shí)際上它還是個(gè)。是聲明變量的默認(rèn)值。數(shù)字還有個(gè)特殊的數(shù)值數(shù)字和數(shù)字對(duì)象
原文
You Don"t Know JS: Types & Grammar
類型null
undefined
boolean
number
string
object
symbol -- added in ES6
值得注意的情形
typeof Symbol() === "symbol"; // true typeof function a(){} === "function"; // true typeof null === "object"; // true
An "undefined" variable is one that has been declared in the accessible scope, but at the moment has no other value in it.
An "undeclared" variable is one that has not been formally declared in the accessible scope.
var a; a; // undefined b; // ReferenceError: b is not defined
盡管b沒有定義,但用typeof對(duì)其操作后返回的也還是undefined
var a; typeof a; // "undefined" typeof b; // "undefined"
利用這點(diǎn),我們可以做一些檢查而避免報(bào)錯(cuò)
// oops, this would throw an error! if (DEBUG) { console.log( "Debugging is starting" ); } // this is a safe existence check if (typeof DEBUG !== "undefined") { console.log( "Debugging is starting" ); }值
討論數(shù)組時(shí),字符串類型的數(shù)字索引會(huì)直接被當(dāng)作數(shù)字。
var a = [ ]; a["13"] = 42; a.length; // 14
JavaScript中字符串是不可變的,數(shù)組是可變的,所有的字符串方法都返回新的字符串。
特別大或特別小的數(shù)字在顯示時(shí)會(huì)默認(rèn)調(diào)用toExponential()
var a = 5E10; a; // 50000000000 a.toExponential(); // "5e+10" var b = a * a; b; // 2.5e+21 var c = 1 / a; c; // 2e-11
因?yàn)閿?shù)字可以被Number對(duì)象包裹,所以數(shù)值可以調(diào)用Number.prototype的方法。
var a = 42.59; a.toPrecision( 1 ); // "4e+1" a.toPrecision( 2 ); // "43" a.toPrecision( 3 ); // "42.6" a.toPrecision( 4 ); // "42.59" a.toPrecision( 5 ); // "42.590" a.toPrecision( 6 ); // "42.5900"
你也可以不通過變量直接訪問這些方法,不過要注意.。因?yàn)?b>.是一個(gè)有效的數(shù)字字符,它會(huì)優(yōu)先被當(dāng)作數(shù)字的一部分。
// invalid syntax: 42.toFixed( 3 ); // SyntaxError // these are all valid: (42).toFixed( 3 ); // "42.000" 0.42.toFixed( 3 ); // "0.420" 42..toFixed( 3 ); // "42.000"
42.toFixed( 3 )是錯(cuò)誤的語法,因?yàn)?b>.被當(dāng)作數(shù)字的一部分。42..toFixed( 3 )中第一個(gè).被當(dāng)作數(shù)字的一部分,第二個(gè).被當(dāng)作屬性操作符。
也可以用科學(xué)計(jì)數(shù)法表示數(shù)字。
var onethousand = 1E3; // means 1 * 10^3 var onemilliononehundredthousand = 1.1E6; // means 1.1 * 10^6
以下這個(gè)情況并非JavaScript獨(dú)有,任何采用二進(jìn)制浮點(diǎn)數(shù),依據(jù)IEEE 754都會(huì)如此
0.1 + 0.2 === 0.3; // false
這是因?yàn)橛枚M(jìn)制浮點(diǎn)表示 0.1 0.2 并不精確。為了解決這個(gè)問題,設(shè)置個(gè)輔助的數(shù)值進(jìn)行比較,這個(gè)值是2^-52 (2.220446049250313e-16),這個(gè)數(shù)值在ES6中為Number.EPSILON。
if (!Number.EPSILON) { Number.EPSILON = Math.pow(2,-52); } function numbersCloseEnoughToEqual(n1,n2) { return Math.abs( n1 - n2 ) < Number.EPSILON; } var a = 0.1 + 0.2; var b = 0.3; numbersCloseEnoughToEqual( a, b ); // true numbersCloseEnoughToEqual( 0.0000001, 0.0000002 ); // false
Number.MAX_SAFE_INTEGER // 9007199254740991 2^53-1 Number.MAX_VALUE // 1.7976931348623157e+308 Number.MIN_SAFE_INTEGER // -9007199254740991 Number.MIN_VALUE // 5e-324
NaN是"not a number",不過更準(zhǔn)確的定義應(yīng)該是"invalid number","failed number",因?yàn)閷?shí)際上它還是個(gè)number。它出現(xiàn)在用算數(shù)操作符操作運(yùn)算元時(shí),并不是兩個(gè)都是數(shù)字的情形。
var a = 2 / "foo"; // NaN typeof a === "number"; // true
我們知道
0 == false // true "" == false // true
我們以為像NaN表示失敗的也會(huì)是false,實(shí)際上
var a = 2 / "foo"; a == NaN; // false a === NaN; // false a == a; // false 它連自己都不等于 +0 === -0; // true NaN == false; // false undefined == false; // false null == false; // false
與之相比,undefined和null都是種類型,該類型的值都只有一種。undefined是聲明變量的默認(rèn)值。
var b = null var c = null b === c // true var d = undefined var e = undefined d === e // true
用Number.isNaN()代替isNaN()
var a = 2 / "foo"; var b = "foo"; a; // NaN b; // "foo" window.isNaN( a ); // true window.isNaN( b ); // true
if (!Number.isNaN) { Number.isNaN = function(n) { return ( typeof n === "number" && window.isNaN( n ) ); }; } var a = 2 / "foo"; var b = "foo"; Number.isNaN( a ); // true Number.isNaN( b ); // false
或者利用它自己都不等于自己的特點(diǎn)。
if (!Number.isNaN) { Number.isNaN = function(n) { return n !== n; }; }
數(shù)字還有個(gè)特殊的數(shù)值Infinity
var a = 1 / 0; // Infinity var b = -1 / 0; // -Infinity typeof b; // "number"
數(shù)字和數(shù)字對(duì)象
function foo(x) { x = x + 1; x; // 3 } var a = 2; var b = new Number( a ); // or equivalently `Object(a)` foo( b ); console.log( b ); // 2, not 3
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89646.html
摘要:原文測(cè)試對(duì)象包裝基礎(chǔ)數(shù)據(jù)類型沒有屬性和方法,為了使用方法和函數(shù),就需要對(duì)應(yīng)的對(duì)象包裝它。注意,用構(gòu)造器構(gòu)造的對(duì)象,永遠(yuǎn)是。它們都是對(duì)象。它們都是非空字符串。 原文 You Dont Know JS: Types & Grammar 測(cè)試 console.log(1+ 2+2); console.log(1+ +2+2); console.log(A- B+2); console.log...
摘要:語言中規(guī)定的類型為以及。這兩個(gè)值有不同的類型。內(nèi)建類型定義了七種內(nèi)建類型中新增提示以上類型,除的被稱為基本類型。新增列出的六種類型的值都會(huì)返回一個(gè)對(duì)應(yīng)類型名稱的字符串。是中新增的數(shù)據(jù)類型,我們會(huì)在第三章詳細(xì)介紹。 譯者的前言 一直都想好好研究這個(gè)在 GitHub 上很有名氣的系列,而翻譯恰是最好的閱讀途徑之一??梢宰屛议喿x的時(shí)候,不那么不求甚解。 圖靈社區(qū)出版了該系列兩部分的中文版——...
摘要:特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點(diǎn)多,可以很快搞定,沒想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯(cuò)誤的地方,還請(qǐng)斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會(huì)及時(shí)更新,平時(shí)業(yè)務(wù)工作時(shí)也會(huì)不定期更...
摘要:的前部分內(nèi)容講的是棧和隊(duì)列的實(shí)現(xiàn)。學(xué)習(xí)環(huán)境在學(xué)習(xí)這門課之前,先引入的概念,即抽象數(shù)據(jù)類型。鏈表實(shí)現(xiàn)學(xué)習(xí),鏈表實(shí)現(xiàn)簡(jiǎn)單的數(shù)組實(shí)現(xiàn)鏈表實(shí)現(xiàn)簡(jiǎn)單的數(shù)組實(shí)現(xiàn)解決使用棧或者隊(duì)列時(shí),的數(shù)據(jù)類型指定問題。 Week2 的前部分內(nèi)容講的是棧和隊(duì)列的Java實(shí)現(xiàn)。學(xué)習(xí)環(huán)境:mac, inteliJ, java version 1.8.0_77 在學(xué)習(xí)這門課之前,先引入Abstract Data Type...
說明:本篇主要學(xué)習(xí)數(shù)據(jù)庫連接階段和編譯SQL語句部分相關(guān)源碼。實(shí)際上,上篇已經(jīng)聊到Query Builder通過連接工廠類ConnectionFactory構(gòu)造出了MySqlConnection實(shí)例(假設(shè)驅(qū)動(dòng)driver是mysql),在該MySqlConnection中主要有三件利器:IlluminateDatabaseMysqlConnector;IlluminateDatabaseQuery...
閱讀 1587·2021-09-24 10:38
閱讀 1520·2021-09-22 15:15
閱讀 3070·2021-09-09 09:33
閱讀 912·2019-08-30 11:08
閱讀 647·2019-08-30 10:52
閱讀 1260·2019-08-30 10:52
閱讀 2354·2019-08-28 18:01
閱讀 529·2019-08-28 17:55