gnosis23 / hello-world-blog

还是 issues 里面写文章方便
https://bohao.work
0 stars 0 forks source link

JavaScript 中的数据类型 #4

Closed gnosis23 closed 4 years ago

gnosis23 commented 6 years ago

感觉把这本 《You Don't Know JS: Types & Grammar》 看完就好了。

基本类型

比较神奇的是基本类型里没有函数,函数也是对象,只不过这个对象有 [[call]] 或者 [[constructor]] 属性。

Number

运行时对象类型判断

你去看流行的库里面基本上都有对参数对象类型的判断。这个可以参考 lodash 的代码。

typeof

Type Result
Undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
String "string"
Symbol (new in ECMAScript 2015) "symbol"
Function object (implements [[Call]] in ECMA-262 terms) "function"
Any other object "object"

类型转化

抽象值操作

标准中定义的一些“抽象操作”(即“内部使用的操作”)。

ToString

其他的基本类型转换为字符串没什么特别的地方。

对普通对象来说,除了自行定义,否则 Object.prototype.toString() 返回内部属性 [[class]] 的值,如 [object Object]

如果对象有自己的 toString 方法,字符串化时就会调用该方法并使用其返回值。

数组的 toString 方法:调用元素的 toString 然后拼在一起,中间加逗号。

ToNumber

对象会首先被转换为相应的基本类型值,如果返回的是非数字的基本类型,则再遵循以上规则将其强制转换为数字。

为了将值转换为相应的基本类型值,抽象操作 ToPrimitive 会首先检查该值是否有 valueOf 方法。如果有并且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用 toString 的返回值并进行强制类型转换。

var a = {
    valueOf: function() {
        return "42";
    }
};
var b = {
    toString: function() {
        return "42";
    }
};

var c = [4, 2];
c.toString = function() {
    return this.join(""); // "42"
};

Number( a ); // 42
Number( b ); // 42
Number( c ); // 42
Number( "" ); // 0
Number( [] ); // 0
Number( ["abc"] ); // NaN

ToBoolean

...

显式转换

字符串与数字

使用 String(...)Number(...) 进行转换,注意不用 new ,不会进行装箱。

var a = 42;
var b = String( a );
var c = "3.14";
var d = Number( c );

b; // "42"
d; // 3.14

除了上面的方法,还有其他转化方式

var a = 42;
var b = a.toString();  // 这个算隐式转换
var c = "3.14";
var d = +c; // 这里的+是一元操作符

解析字符串

parseFloat 与 Number 的区别在于前者接受后面有非字符串的情况

var a = "42";
var b = "42px";
Number(a);   // 42
parseInt(a); // 42
Number(b);   // NaN
parseInt(b); // 42

还有 JavaScript 中的数字有十进制、二进制、八进制和十六进制;还有科学计数法。 parseInt 不支持下面所有的数字解析,推荐 Number。

30
0b111
0o13
0xFF
1e3
-1e-2

隐式转换

字符串和数字之间的隐式转换

+ 号:

根据 ES5 规范 11.6.1 节,如果某个操作数是字符串或者能够通过以下步骤转换为字符串的话, + 将进行拼接操作。如果其中一个操作数是对象(包括数组),则首先对其调用 ToPrimitive 抽象操作,该抽象操作在调用 [[DefaultValue]],以数字作为上下文。

gnosis23 commented 5 years ago

_20190206101258