摘要:以下這個情況并非獨有,任何采用二進制浮點數,依據都會如此這是因為用二進制浮點表示并不精確。是,不過更準確的定義應該是,,因為實際上它還是個。是聲明變量的默認值。數字還有個特殊的數值數字和數字對象
原文
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對其操作后返回的也還是undefined
var a; typeof a; // "undefined" typeof b; // "undefined"
利用這點,我們可以做一些檢查而避免報錯
// 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" ); }值
討論數組時,字符串類型的數字索引會直接被當作數字。
var a = [ ]; a["13"] = 42; a.length; // 14
JavaScript中字符串是不可變的,數組是可變的,所有的字符串方法都返回新的字符串。
特別大或特別小的數字在顯示時會默認調用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
因為數字可以被Number對象包裹,所以數值可以調用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"
你也可以不通過變量直接訪問這些方法,不過要注意.。因為.是一個有效的數字字符,它會優先被當作數字的一部分。
// 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 )是錯誤的語法,因為.被當作數字的一部分。42..toFixed( 3 )中第一個.被當作數字的一部分,第二個.被當作屬性操作符。
也可以用科學計數法表示數字。
var onethousand = 1E3; // means 1 * 10^3 var onemilliononehundredthousand = 1.1E6; // means 1.1 * 10^6
以下這個情況并非JavaScript獨有,任何采用二進制浮點數,依據IEEE 754都會如此
0.1 + 0.2 === 0.3; // false
這是因為用二進制浮點表示 0.1 0.2 并不精確。為了解決這個問題,設置個輔助的數值進行比較,這個值是2^-52 (2.220446049250313e-16),這個數值在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",不過更準確的定義應該是"invalid number","failed number",因為實際上它還是個number。它出現在用算數操作符操作運算元時,并不是兩個都是數字的情形。
var a = 2 / "foo"; // NaN typeof a === "number"; // true
我們知道
0 == false // true "" == false // true
我們以為像NaN表示失敗的也會是false,實際上
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是聲明變量的默認值。
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
或者利用它自己都不等于自己的特點。
if (!Number.isNaN) { Number.isNaN = function(n) { return n !== n; }; }
數字還有個特殊的數值Infinity
var a = 1 / 0; // Infinity var b = -1 / 0; // -Infinity typeof b; // "number"
數字和數字對象
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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/89646.html
摘要:原文測試對象包裝基礎數據類型沒有屬性和方法,為了使用方法和函數,就需要對應的對象包裝它。注意,用構造器構造的對象,永遠是。它們都是對象。它們都是非空字符串。 原文 You Dont Know JS: Types & Grammar 測試 console.log(1+ 2+2); console.log(1+ +2+2); console.log(A- B+2); console.log...
摘要:語言中規定的類型為以及。這兩個值有不同的類型。內建類型定義了七種內建類型中新增提示以上類型,除的被稱為基本類型。新增列出的六種類型的值都會返回一個對應類型名稱的字符串。是中新增的數據類型,我們會在第三章詳細介紹。 譯者的前言 一直都想好好研究這個在 GitHub 上很有名氣的系列,而翻譯恰是最好的閱讀途徑之一。可以讓我閱讀的時候,不那么不求甚解。 圖靈社區出版了該系列兩部分的中文版——...
摘要:特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 本以為自己收藏的站點多,可以很快搞定,沒想到一入匯總深似海。還有很多不足&遺漏的地方,歡迎補充。有錯誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應和斧正,會及時更新,平時業務工作時也會不定期更...
摘要:的前部分內容講的是棧和隊列的實現。學習環境在學習這門課之前,先引入的概念,即抽象數據類型。鏈表實現學習,鏈表實現簡單的數組實現鏈表實現簡單的數組實現解決使用棧或者隊列時,的數據類型指定問題。 Week2 的前部分內容講的是棧和隊列的Java實現。學習環境:mac, inteliJ, java version 1.8.0_77 在學習這門課之前,先引入Abstract Data Type...
說明:本篇主要學習數據庫連接階段和編譯SQL語句部分相關源碼。實際上,上篇已經聊到Query Builder通過連接工廠類ConnectionFactory構造出了MySqlConnection實例(假設驅動driver是mysql),在該MySqlConnection中主要有三件利器:IlluminateDatabaseMysqlConnector;IlluminateDatabaseQuery...
閱讀 1571·2021-09-24 10:38
閱讀 1498·2021-09-22 15:15
閱讀 3059·2021-09-09 09:33
閱讀 905·2019-08-30 11:08
閱讀 638·2019-08-30 10:52
閱讀 1253·2019-08-30 10:52
閱讀 2345·2019-08-28 18:01
閱讀 521·2019-08-28 17:55