操作符及类型转化

19 篇文章 0 订阅

1.操作符

+:加法

-:减法

*:乘法

/:除法

%:取余数,

进行数据运算时,除‘+’外,其他运算符可以自动将字符串数字隐形转化成数字

1.2.一元运算符

+:将操作数转化成数字,字符串的拼接

-:将操作数转化成数字,同时变为负数

!:逻辑取反运算符

++:递增

--:递减

delete:删除数组对象中特定索引的值

typeof:操作数放到typeof的后面,会返回当前操作数的类型,对于数值类型可以准确返回,对引用类型,Function会返回‘function’,其他都只会返回‘object’

void:运算符对任何返回值返回undefined

javaScript中的隐式转换

.javaScript中有两类数据类型:原始类型、对象类型:

原始类型(基础类型):

Undefined、null、String、Number、Boolean、Symbol(es6新推出的,暂不考虑)

对象类型

object

通过ToPrimitive将值转换为原始值

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

ToPrimitive(input, PreferredType?)

input是输入的值,即要转换的对象,必选;

preferedType是期望转换的基本类型,他可以是字符串,也可以是数字。选填,默认为number;

他只是一个转换标志,转化后的结果并不一定是这个参数值的类型,但是转换结果一定是一个原始值(或者报错)。

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

  • 基本类型的转换

加减乘除:

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

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

var a = 1+2 +'3';  //'33' string

var b= 1+2+3;  //6 number

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

10 - '20'  //-10

10 - 'one'  //NaN

'10' * '100a'  //NaN

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

10 * '10'  //100

'10' * '10'  //100

20 / ‘10’  //2

'20' / '10'  //2

'20' / 'one' //NaN

.有关==的隐式转换

1.undefined等于null

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

3.数字和布尔比较,布尔转数字

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

undefined == null  //true

'0' == 0;

0 == false;

'0'  == false;

引用类型的转换

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

PreferredType转换策略

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

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

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

3.否则,调用toString()方法,如果返回的是原始值,则返回这个原始值

4.否则,抛出TypeError异常

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

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

2.否则调用toString()方法,如果此方法返回的是原始值,则返回这个原始值

3.否则,如果输入的是一个对象,则调用该对象的valueOf()方法。

4.否则,抛出异常

注意:

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

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

2、否则,PreferredType被设置为Number

例:

[] + []  // ""

进行ToPrimitive,两个都是Array对象,不是Date对象 ,所以,以Number为转换标准,所以先调用valueOf(),结果还是[],不是原始值,所以再调用toStirng(),结果是""(空字符串),将""返回。第二个过程相同,结果相同,所以整体的结果是  "".

[] + {}  // [object object] 

[]的结果是"",

{}先调用valueOf(),返回{},所以继续调用toString(),返回[object object],是原始值,所以返回[object object]

{} + []  //0

{}的结果是[object onject]的字符串类型,{} + []可以看成 {}; + []的形式,前面的{}是一个完整的代码块,所以就还剩 +[],[]的值是"",所以 +""的值是0

{} + {}  // [object object]

1.3赋值运算符

=

+=

-=

*=

/=

%=

1.4比较运算符

比较运算符在逻辑语句中使用,以判定变量或值是否相等。通常用于条件判断语句中。

比较运算符的优先级低于算术运算符,高于赋值运算符运算结果一般都为boolean

== 等于

===值相等并且类型相等

!=不相等

!==值不相等或类型不相等

>大于

<小于

>=大于或等于

<=小于或等于

双等和三等的区别

双等只是值为真,三等是类型和值都要为真

1.5.逻辑运算符

&&与(同真才真,有假则假)

||或(有真才真,同假则假)

!非

1.6.三目运算符

JavaScript中的三目运算符用作判断时

基本语法为: expression ? sentence1 : sentence2

当expression的值为真时执行sentence1,否则执行 sentence2

2.类型转换

2.1.* => 字符串类型

toString()函数

除了null,undefined,其他三种基本数据类型的变量均有一个toString()函数,该函数可以获取该变量指定值的字符串表示。

2.2.* => 布尔类型

其他数据类型转换为Boolean

Boolean()包装器

使用!!转换任意其他数据类型都可以转换为布尔类型。

2.3.* => 数字类型

其他数据类型转换为Number

Number()包装器

如果转换的值是null,undefined,boolean,number

Number(true); //1
Number(false); //0
Number(null); //0
Number(undefined); //NaN
Number(10); //10 如果是数字值,原样输出

如果转换的值是string

Number("123"); //123  如果仅包含数值,转换为对应的数值
Number("234.1"); //234.1 解析为对应的小数
Number("+12.1"); //12.1 首位为符号位,其余为为数值,转换为对应的数值
Number("1+2.3"); // NaN 符号位出现在其他位置,解析为NaN
Number("0xa"); //10 如果仅包含十六进制格式,转为为对应的十进制的值
Number("010"); //10【注意】不会当做八进制被解析,结果为10。
Number(""); // 0 空字符串被转换为0
Number("123ac"); // NaN 包含其他字符: NaN
Number(12); //12

parseInt()函数

如果转换的值是null,undefined,boolean,均转换为NaN

如果转换的值是Number

parseInt(10); //10 如果是整数值,原样输出 parseInt(10.3); //10 如果是小数,舍去小数点一级后面的内容

如果转换的值是string

parseInt("123"); //123;如果仅包含数值,转换为对应的数值
parseInt("234.1"); //234;小数点后面的数值省略
parseInt("+12.1"); //12; 首位为符号位,其余为为数值,转换为整数
parseInt("1+2.7"); //1; 符号位出现在其他位置,保留符号位前面的数值
parseInt("0xa"); //10; 如果仅包含十六进制格式,转为为对应的十进制的值
parseInt("010"); //10; 【注意】不会当做八进制被解析,结果为10
parseInt(""); //NaN;空字符串被转换为NaN
parseInt("123ac"); //123;如果首位为数值,依次向后解析,找到连续的数值,直到遇到第一个非数值的,将之前获取的数值转换为Number返回 parseInt("123ac"); //123;

parseFloat()函数

如果转换的值是null,undefined,boolean,均转换为NaN

如果转换的值是Number

parseFloat(10); //10 如果是整数值,原样输出 parseFloat(10.1); //10.1 如果是小数,保留小数点,但是如果是10.0结果为10

如果转换的值是string

parseFloat("123"); //123;如果仅包含数值,转换为对应的数值
parseFloat("234.1"); //234.1;保留小数点后面的数值
parseFloat("+12.1"); //12.1; 首位为符号位,其余为为数值,转换为整数
parseFloat("1+2.6"); //1;符号位出现在其他位置,保留符号位前的数值
parseFloat("0xa"); //0; 【注意】不会当做十六进制来解析。
parseFloat("010"); //10; 【注意】不会当做八进制被解析,结果为10
parseFloat(""); //NaN;空字符串被转换为NaN
parseFloat("123.3ac"); //123.3;如果首位为数值,依次向后解析,找到连续的数值,直到遇到第一个非数值的,将之前获取的数值转换为Number返回 parseFloat("123.3ac");//123.3;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值