JS(二)操作符与隐式转换

1.操作符

+ (正号)

  1. '+'的第一种用法:进行数据相加
  2. '+'放在数据的前面,就是取正数

  3. '+'与字符串运算时,就是字符串连接符

  4. '+'可以将数字字符串或布尔类型等隐式转换成number类型

 ​-(负号) 

  1. 正、负号可以对数字进行取正或取负,其他运算符不能转换

  2. 正、负号可以将字符串数字隐式转换成数字

    var num1 = '20';
    var num2 = '-20';
    console.log(-num1); //-20
    console.log(+num1, typeof +num1); //20 number
    console.log(-num2); //20
    console.log(+num2, typeof +num2); //-20 number 

++(递增)

通常用于循环语句,动画操作等。

++放在前面,并进行赋值:先累加,后赋值

++放在后面,并进行赋值:先赋值,后累加

--(递减)

通常用于循环语句,动画操作等。使用方法与++类似。

2.JavaScript隐式转换

(隐式转换:自动转换。低级向高级转换,转换后的数据类型的表示范围要比转换前的大)

隐式转换中主要涉及到三种转换:

1、将值转为原始值,ToPrimitive()。

2、将值转为数字,ToNumber()。

3、将值转为字符串,ToString()。

2.1通过ToPrimitive将值转换为原始值

js引擎内部的抽象操作ToPrimitive有着这样的签名:

ToPrimitive(input, PreferredType?)

input是要转换的值,PreferredType是可选参数,仅可以是Number或String类型。 他只是一个转换标志,转化后的结果并不一定是这个参数值的类型,但是转换结果一定是一个原始值(或者报错)。

对于Date求原始值比较特殊,PreferredType是String,其他Object对象均为Number。

2.2基本类型的转换

加减乘除:

1.字符串加数字,数字就会转成字符串。数字加数字或字符串加字符串不需要转换。

在加法的过程中,首先把等号左右两边进行了求原值ToPrimitive()操作,然后如果两个或多个原始值只要有一个是String类型,就把两个或多个原始值都进行转化字符串toString()操作,进行字符串拼接;否则把两个或多个原始值都进行转化数字toNumber()操作,进行数字相加。

var a = 1 + 2 + '3';
console.log(a, typeof a); // '33' string
var b = 1 + 2 + 3;
console.log(b, typeof b); // 6 number

JS(二)操作符与隐式转换

JS(二)操作符与隐式转换

2.数字减字符串,字符串转成数字。如果字符串不是纯数字就会转成NaN。字符串减数字也一样。两个字符串相减也先转成数字。  

// -
10 - '20'    //-10
10 - 'one'   //NaN
10 - '100a'  //NaN

3.乘,除,大于,小于跟减的转换也是一样。

// *
10*'20'      //200
'10'*'20'    //200
// /
20/'10'      //2
'20'/'10'    //2
'20'/'one'  //NaN

JS(二)操作符与隐式转换

  • 有关==的隐式转换

1.undefined等于null

2.字符串和数字比较时,字符串转数字

3.数字为布尔比较时,布尔转数字

4.字符串和布尔比较时,两者转数字

// ==
undefined == null;    //true
'0' == 0;            //true,字符串转数字再比较 0==0
0 == false;           //true,布尔转数字比较  0==1
'0' == false;       //true,两者转数字比较 0==0

 

2.3引用类型的转换

基本类型间的比较相对简单。引用类型和基本类型的比较就相对复杂一些,先要把引用类型转成基本类型,再按上 述的方法比较。

PreferredType转换策略

  • 如果PreferredType被标记为Number,则会进行下面的操作流程来转换输入的值。

1、如果输入的值已经是一个原始值,则直接返回它

2、否则,如果输入的值是一个对象,则调用该对象的valueOf()方法, 如果valueOf()方法的返回值是一个原始值,则返回这个原始值。

3、否则,调用这个对象的toString()方法,如果toString()方法返回的是一个原始值,则返回这个原始值。

4、否则,抛出TypeError异常。

  • 如果PreferredType被标记为String,则会进行下面的操作流程来转换输入的值。

1、如果输入的值已经是一个原始值,则直接返回它

2、否则,调用这个对象的toString()方法,如果toString()方法返回的是一个原始值,则返回这个原始值。

3、否则,如果输入的值是一个对象,则调用该对象的valueOf()方法, 如果valueOf()方法的返回值是一个原始值,则返回这个原始值。

4、否则,抛出TypeError异常。

注意:

PreferredType的值会按照这样的规则来自动设置:

1、该对象为Date类型,则PreferredType被设置为String

2、否则,PreferredType被设置为Number

//object 隐式转换
var obj = {
  name: 'zhangsan',
  age:18
}
// 如果输入的值是一个对象,则调用该对象的valueOf()方法,
//  如果valueOf()方法的返回值是一个原始值,则返回这个原始值。(对象的原始值string)
//  3、否则,调用这个对象的toString()方法,如果toString()方法返回的是一个原始值,则返回这个原始值。
console.log(obj,typeof(obj));//{ name: 'zhangsan', age: 18 }
console.log(obj.valueOf(),typeof(obj.valueOf()));//{ name: 'zhangsan', age: 18 } object
console.log(obj.valueOf().toString(),typeof(obj.valueOf().toString()));//[object Object] string
console.log(obj + 'hello');//{name:zhangsan,age:18}hello,这个是错误。[object Object]hello,才正确

上一篇:java基础初解一:数据类型、String、运算


下一篇:JavaScript