摘要:以下这个情况并非独有,任何采用二进制浮点数,依据都会如此这是因为用二进制浮点表示并不精确。是,不过更准确的定义应该是,,因为实际上它还是个。是声明变量的默认值。数字还有个特殊的数值数字和数字对象
原文
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
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/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
阅读 2344·2019-08-28 18:01
阅读 520·2019-08-28 17:55