- 加法规则
- 布尔值和布尔值相加、数字和布尔值相加。布尔值默认会自动转成数值,然后相加。
console.log(true + false) // 1
console.log(2 + true) // 3
- 两个字符串相加。这时加法运算符会变成连接运算符,返回一个新的字符串。
console.log('abc' + 'def') // abcdef
- 字符串与非字符串相加。这时非字符串会转成字符串,再连接在一起。
console.log(123 + 'abc') // 123abc
- 对象相加。如果运算子是对象,必须先转成原始类型的值,然后再相加。
- 第一步:
自动调用valueOf方法(一般来说,对象的valueOf方法总是返回对象自身) ,如果返回原始类型的值,则不在调用toString方法。 - 第二步:
如果valueOf方法返回还是对象,再自动调用对象的toString方法,将其转为字符串。 - 第三步:
如果toSrting方法返回的是对象,就会报错。
如果想得到想要的结果,可以自定义valueOf方法或toString方法。
console.log({} + 'abc') // [object Object]abc
console.log([1] + 'abc') // 1abc
console.log([1,2,3] + 'abc') // 1,2,3abc
详解:
1. console.log({} + 'abc') // [object Object]abc
第一步:
{}会自动调用valueOf方法// {}.valueOf => {}
第二步:
这时再自动调用对象的toString方法,将其转为字符串。// {}.toString() => [object Object]
第三步:
[object Object] + 'abc' = '[object Object]abc'
- 非加法运算符减法、乘法、除法(一律转为数值,在进行相应的数字运算)
console.log('100' - 20) // 80
console.log('abc' - 1) // NaN
console.log(2 * '8') // 16
console.log(2 * 'abc') // NaN
console.log('12' / 2) // 6
console.log('abc' / 2) // NaN
3.数值运算符,负数值运算符 (+、-)
数值运算符的作用可以将任何值转换成数值类型;
console.log(+true) // 1
console.log(+[]) // 0
console.log(+{}) // NaN
console.log(-true) // -1
console.log(-[]) // -0
console.log(-{}) // NaN
- 指数运算符(**)
前一个数是底数,后一个数是指数。指数的运算是【右结合】。
console.log(2 ** 3) // 8
console.log(2 ** 3 ** 2) //512 => 相当于2**(3**2)
- 字符串的比较(区分大小写=>Unicode不同)
字符串按照字典顺序进行比较:JavaScript 引擎内部首先比较首字符的 Unicode 码点。如果相等,再比较第二个字符的 Unicode 码点,以此类推。
console.log('a' > 'A') // true 'a'.charCodeAt() => 97 'A'.charCodeAt()=> 65
- 非字符串的比较
- 如果两个运算子之中,至少有一个不是字符串,需要分成以下两种情况:
- 原始类型值
如果两个运算子都是原始类型的值,则会先转成【数值】再比较。 - 对象
如果运算子是对象,会转为【原始类型的值】,在进行比较。
7.undefined和null
undefined其他类型的值比较时,结果都是false,它们相互比较时结果为true.
console.log(undefined == null) // true
console.log(undefined === null) // false
console.log(123 > undefined) // false
console.log(123 < undefined) // false
console.log(123 > null) // true
console.log(123 < null) // false
console.log(0 > null) // false
console.log(0 < null) // false
console.log(0 == null) // false
- 数据类型转换-Number()
- 原始类型值
Number函数将字符串转为数值,只要有一个字符串无法转为数值,整个字符串就会被转为NaN。
console.log(Number('123')) // 123
console.log(Number('123abc')) // NaN
console.log(Number(true)) // 1
console.log(Number(false)) // 0
console.log(Number('')) // 0
console.log(Number(undefined)) // NaN
console.log(Number(null)) // 0
- 对象
console.log(Number({})) // NaN
console.log(Number([])) // 0
console.log(Number([6])) // 6
console.log(Number([1, 2])) // NaN
- 第一步:
调用对象自身的valueOf方法。如果返回原始类型的值,则直接对该值使用Number函数,不再进行后续步骤。 - 第二步:
如果valueOf方法返回还是对象,则改为调用对象只身的toString方法。如果toString方法返回原始类型的值,则对该值使用Number函数,不在进行后续步骤。 - 第三步:
如果toString方法返回的是对象,就报错。
- 数据类型转换-String()
- 原始数据类型
String函数可以将任意类型的值转发成字符串。
console.log(String('123')) // '123'
console.log(String(true)) // 'true'
console.log(String(false)) // 'false'
console.log(String(undefined)) // 'undefined'
console.log(String(null)) // 'null'
- 对象
console.log(String({})) // '[object Object]'
console.log(String([])) //
console.log(String([6])) // '6'
console.log(String([1, 2])) // '1,2'
String方法的参数如果是对象,返回一个类型字符串;如果是数组,返回该数组的字符串形式。[String([1,3,2]) // “1,3,2”]
- 第一步:
先调用对象自身的toString方法。如果返回原始类型的值,则对该值使用String函数,不再进行后续操作。 - 第二步:
如果toString方法返回的是对象,再调用原对象的valueOf方法。如果valueOf方法返回原始类型的值,则对该值使用String函数,不在进行以下步骤。 - 第三步:
如果valueOf方法返回的是对象,就报错。
- 数据类型转换-Boolean()
- 原始数据类型
console.log(Boolean('123')) // true
console.log(Boolean('')) // false
console.log(Boolean(0)) // false
console.log(Boolean(false)) // false
console.log(Boolean(undefined)) // false
console.log(Boolean(null)) // false
console.log(Boolean(NaN)) // false
Boolean函数可以将任意类型转为布尔值。
undefined、null、false、0、''、NaN 为false其它都为true
- 对象
所有的对象的布尔值都是true。
Boolean(new Boolean(false)) // true
console.log(Boolean({})) // true
console.log(Boolean([])) // true
console.log(Boolean([6])) // true
console.log(Boolean([1, 2])) // true
网友评论