toString()
方法返回一个表示该对象的字符串。
每个对象都有一个toString()
方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString()
方法被每个Object
对象继承。如果此方法在自定义对象中未被覆盖,toString()
返回 “[object type]”,其中type
是对象的类型。
toString()
调用 null
返回[object Null]
,undefined
返回[object Undefined]
Number
对象覆盖了Object
对象上的toString
方法,不是直接继承的Object.prototype.toString
RangeError
toString()
方法返回表示指定数组及其元素的字符串。
toString
方法连接数组并返回一个字符串,其中包含用逗号分隔的每个数组元素。将非数字值转换为数字值
在转换对象时,会先转换为对应的基本类型值,当返回非数字的基本类型值,在进行进一步的转换,转换规则如下
Number('23') //23
Number('12f') //NaN
Number(true) //1
Number(false) //0
Number(undefined) //NaN
Number(null) //0
Number(['23']) //23
Number({}) //NaN
Symbol.toPrimitive
指将被调用的指定函数值的属性转换为相对应的原始值。
Symbol.toPrimitive
属性可以将一个对象转换为原始值。该函数由字符串参数 hint 调用,
目的是指定原始值转换结果的首选类型。 hint 参数可以是number
,string
, 和 default
中的一种。
在没有Symbol.toPrimitive
的时候,会首先检查对象是否有valueOf
方法,如果存在并且返回值为基本类型则使用此方法,否则继续查看对象是否存在toString
方法,如果存在并且返回值为基本类型则使用此方法,否则将抛出TypeError
// MDN的示例
// 没有 Symbol.toPrimitive 属性的对象
var obj1 = {};
console.log(+obj1); // NaN
console.log(`${obj1}`); // "[object Object]"
console.log(obj1 + ""); // "[object Object]"
// 拥有 Symbol.toPrimitive 属性的对象
var obj2 = {
[Symbol.toPrimitive](hint) {
if (hint == "number") {
return 10;
}
if (hint == "string") {
return "hello";
}
return true;
}
};
console.log(+obj2); // 10 -- hint is "number"
console.log(`${obj2}`); // "hello" -- hint is "string"
console.log(obj2 + ""); // "true" -- hint is "default"
将JavaScript值转换为布尔值。
转换规则如下
//以下情况为false
Boolean('') //false
Boolean(+0) //false
Boolean(-0) //false
Boolean(NaN) //false
Boolean(undefined) //false
Boolean(null) //false
Boolean(false) //false
显式强制类型转换是通过显而易见的、目的明确的代码将数据进行强制类型转换。
字符串和数字之间是通过String()
和Number()
来进行呼吸那个转换的
String()
按照ToString
规则,将值转换为字符串基本类型。
Number()
按照ToNumber
规则,将值转换为数字基本类型。
+
运算符可以显式的将字符串或者日期转换为数字
!!
显式的将类型转换为布尔值
隐式强制类型转换往往是一些操作的附带产物,如if(){}中会将括号内的部分转换为布尔类型。
参考数学运算符
对非Number类型进行运算符运算时,会先将非Number类型转换为Number类型
[1, 2] + [3, 4]
//1,23,4
String
类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型。Number
类型,另一侧为原始类型,则将原始类型转换为Number
类型。Number
类型,另一侧为引用类型,将引用类型和Number
类型转换成字符串后拼接。[] + {} // [object Object]
{} + [] // 0
左侧转换为"",右侧转换为"[object Object]"
涉及JavaScript的语法解析规则。
{}被解析为一个空的代码块
"+[]"被解析为对于空数组的一元操作“+”,也就是将数组强制转换为数字
NaN
和其他任何类型比较永远返回false
null == undefined
比较结果是true
,除此之外,null、undefined
和其他任何结果的比较值都为false
。
Boolean
和其他任何类型比较,Boolean
首先被转换为Number
类型。
String
和Number
比较,先将String
转换为Number
类型。
当基本类型和引用类型做比较时,对象类型会依照ToPrimitive
规则转换为原始类型:
[] == ![] // true
!
的优先级高于==
,![]
首先会被转换为false
,然后false
转换成Number
类型0
,左侧[]
转换为0
,两侧比较相等。
[null] == false // true
[undefined] == false // true
根据数组的ToPrimitive
规则,数组元素为null
或undefined
时,该元素被当做空字符串处理,所以[null]、[undefined]
都会被转换为0
。
###宽松相等/严格相等
==
允许在相等比较中进行强制类型转换,而===
不允许。
比较运算x==y, 其中x和y是值,产生true或者false。这样的比较按如下方式进行:
1. 若Type(x)与Type(y)相同, 则
a. 若Type(x)为Undefined, 返回true。
b. 若Type(x)为Null, 返回true。
c. 若Type(x)为Number, 则
i. 若x为NaN, 返回false。
ii. 若y为NaN, 返回false。
iii. 若x与y为相等数值, 返回true。
iv. 若x 为 +0 且 y为−0, 返回true。
v. 若x 为 −0 且 y为+0, 返回true。
vi. 返回false。
d. 若Type(x)为String, 则当x和y为完全相同的字符序列(长度相等且相同字符在相同位置)时返回true。 否则, 返回false。
e. 若Type(x)为Boolean, 当x和y为同为true或者同为false时返回true。 否则, 返回false。
f. 当x和y为引用同一对象时返回true。否则,返回false。
2. 若x为null且y为undefined, 返回true。
3. 若x为undefined且y为null, 返回true。
4. 若Type(x) 为 Number 且 Type(y)为String, 返回comparison x == ToNumber(y)的结果。
5. 若Type(x) 为 String 且 Type(y)为Number,返回比较ToNumber(x) == y的结果。
6. 若Type(x)为Boolean, 返回比较ToNumber(x) == y的结果。
7. 若Type(y)为Boolean, 返回比较x == ToNumber(y)的结果。
8. 若Type(x)为String或Number,且Type(y)为Object,返回比较x == ToPrimitive(y)的结果。
9. 若Type(x)为Object且Type(y)为String或Number, 返回比较ToPrimitive(x) == y的结果。
10. 返回false。
Object.toString
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive
https://juejin.im/post/5b3b76de5188251afc25567f
https://juejin.im/post/5cec1bcff265da1b8f1aa08f