Closed gnosis23 closed 4 years ago
感觉把这本 《You Don't Know JS: Types & Grammar》 看完就好了。
比较神奇的是基本类型里没有函数,函数也是对象,只不过这个对象有 [[call]] 或者 [[constructor]] 属性。
[[call]]
[[constructor]]
你去看流行的库里面基本上都有对参数对象类型的判断。这个可以参考 lodash 的代码。
标准中定义的一些“抽象操作”(即“内部使用的操作”)。
其他的基本类型转换为字符串没什么特别的地方。
对普通对象来说,除了自行定义,否则 Object.prototype.toString() 返回内部属性 [[class]] 的值,如 [object Object]。
[[class]]
[object Object]
如果对象有自己的 toString 方法,字符串化时就会调用该方法并使用其返回值。
数组的 toString 方法:调用元素的 toString 然后拼在一起,中间加逗号。
对象会首先被转换为相应的基本类型值,如果返回的是非数字的基本类型,则再遵循以上规则将其强制转换为数字。
为了将值转换为相应的基本类型值,抽象操作 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
...
使用 String(...) 与 Number(...) 进行转换,注意不用 new ,不会进行装箱。
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]],以数字作为上下文。
感觉把这本 《You Don't Know JS: Types & Grammar》 看完就好了。
基本类型
比较神奇的是基本类型里没有函数,函数也是对象,只不过这个对象有
[[call]]
或者[[constructor]]
属性。Number
运行时对象类型判断
你去看流行的库里面基本上都有对参数对象类型的判断。这个可以参考 lodash 的代码。
typeof
类型转化
抽象值操作
标准中定义的一些“抽象操作”(即“内部使用的操作”)。
ToString
其他的基本类型转换为字符串没什么特别的地方。
对普通对象来说,除了自行定义,否则 Object.prototype.toString() 返回内部属性
[[class]]
的值,如[object Object]
。如果对象有自己的 toString 方法,字符串化时就会调用该方法并使用其返回值。
数组的 toString 方法:调用元素的 toString 然后拼在一起,中间加逗号。
ToNumber
对象会首先被转换为相应的基本类型值,如果返回的是非数字的基本类型,则再遵循以上规则将其强制转换为数字。
为了将值转换为相应的基本类型值,抽象操作 ToPrimitive 会首先检查该值是否有 valueOf 方法。如果有并且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用 toString 的返回值并进行强制类型转换。
ToBoolean
...
显式转换
字符串与数字
使用
String(...)
与Number(...)
进行转换,注意不用new
,不会进行装箱。除了上面的方法,还有其他转化方式
解析字符串
parseFloat 与 Number 的区别在于前者接受后面有非字符串的情况
还有 JavaScript 中的数字有十进制、二进制、八进制和十六进制;还有科学计数法。 parseInt 不支持下面所有的数字解析,推荐 Number。
隐式转换
字符串和数字之间的隐式转换
+
号: