资讯专栏INFORMATION COLUMN

You-Dont-Know-JS / Types & Grammar 笔记

Drummor / 3373人阅读

摘要:以下这个情况并非独有,任何采用二进制浮点数,依据都会如此这是因为用二进制浮点表示并不精确。是,不过更准确的定义应该是,,因为实际上它还是个。是声明变量的默认值。数字还有个特殊的数值数字和数字对象

原文

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

与之相比,undefinednull都是种类型,该类型的值都只有一种。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 &amp; Grammar 笔记

    摘要:原文测试对象包装基础数据类型没有属性和方法,为了使用方法和函数,就需要对应的对象包装它。注意,用构造器构造的对象,永远是。它们都是对象。它们都是非空字符串。 原文 You Dont Know JS: Types & Grammar 测试 console.log(1+ 2+2); console.log(1+ +2+2); console.log(A- B+2); console.log...

    KitorinZero 评论0 收藏0
  • [你不知道的 JavaScript 类型和语法] 第一章:类型

    摘要:语言中规定的类型为以及。这两个值有不同的类型。内建类型定义了七种内建类型中新增提示以上类型,除的被称为基本类型。新增列出的六种类型的值都会返回一个对应类型名称的字符串。是中新增的数据类型,我们会在第三章详细介绍。 译者的前言 一直都想好好研究这个在 GitHub 上很有名气的系列,而翻译恰是最好的阅读途径之一。可以让我阅读的时候,不那么不求甚解。 图灵社区出版了该系列两部分的中文版——...

    Astrian 评论0 收藏0
  • 前端资源系列(4)-前端学习资源分享&amp;前端面试资源汇总

    摘要:特意对前端学习资源做一个汇总,方便自己学习查阅参考,和好友们共同进步。 特意对前端学习资源做一个汇总,方便自己学习查阅参考,和好友们共同进步。 本以为自己收藏的站点多,可以很快搞定,没想到一入汇总深似海。还有很多不足&遗漏的地方,欢迎补充。有错误的地方,还请斧正... 托管: welcome to git,欢迎交流,感谢star 有好友反应和斧正,会及时更新,平时业务工作时也会不定期更...

    princekin 评论0 收藏0
  • Stack &amp; Queue 栈和队列的学习笔记

    摘要:的前部分内容讲的是栈和队列的实现。学习环境在学习这门课之前,先引入的概念,即抽象数据类型。链表实现学习,链表实现简单的数组实现链表实现简单的数组实现解决使用栈或者队列时,的数据类型指定问题。 Week2 的前部分内容讲的是栈和队列的Java实现。学习环境:mac, inteliJ, java version 1.8.0_77 在学习这门课之前,先引入Abstract Data Type...

    peixn 评论0 收藏0
  • Laravel 学习笔记之 Query Builder 源码解析(中)

    说明:本篇主要学习数据库连接阶段和编译SQL语句部分相关源码。实际上,上篇已经聊到Query Builder通过连接工厂类ConnectionFactory构造出了MySqlConnection实例(假设驱动driver是mysql),在该MySqlConnection中主要有三件利器:IlluminateDatabaseMysqlConnector;IlluminateDatabaseQuery...

    zhou_you 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<