1.声明提前

es6语法以前JavaScript在执行代码的时候会将所有使用var声明的变量,放在作用域的顶部集中创建,赋值留在原地

  1. console.log("a="+a);
  2. var a = 20;
  3. //输出结果为a=undefined

在es6中用let声明变量,没有声明提前。

2.数据类型转换

字符串和布尔转成数字

Number()强制转换

  1. var a="12.132";
  2. var bool = true;
  3. var num1 = Number(a); //num1为12.132
  4. var num2 = Number(bool); //num2为1

缺点:Number()只能识别纯数字的字符串,遇到字符串中含由非数字的会返回NaN

parseInt和parseFloat

  1. var str = "12.323px";
  2. console.log(Number(str)); //输出为NaN
  3. console.log(parseInt(str)); //输出为12
  4. console.log(parseFloat(str)); //输出为12.323

开头的字符必须以数字开头,遇到非数字的字符就停止解析

另外,parseInt还可以将其他进制的数转化为十进制

  1. /* JavaScript里面:
  2. 八进制的数都是以0开头,类似:0750,060
  3. 十六进制的数都是0x开头,类似:0xAF,0x5631
  4. 在ECMA3中,“070”会被当成八进制字面量,会被转化为十进制的56
  5. “0xAF”会被当成十六进制字面量,会被转换为175*/
  6. var a = 012;
  7. var b = 0xAF
  8. console.log(a);//输出会是10
  9. console.log(b);//输出会是175
  10. /*parseInt()函数提供了第二个参数:转换时使用的基数(即多少进制)*/
  11. var num1 = parseInt("012",8); //10
  12. /*注意这里的012一定要用引号包住,否则会先被转换为10,然后成了parseInt(10,8)*/
  13. var num2 = parseInt("0xAF",16); //175

数字转成字符串和布尔

转字符串用String()或者toString(),注意toString是用num.toString()调用的
转布尔用Boolean()方法
注意只有5种情况才会返回false:1.”” 2.NaN 3.undefined 4.null 5.0

自动转换

算数计算中,先将两边的变量转换为Number再计算Number()
特殊情况:加运算中,碰到字符串,+会起到拼接符的作用

加法运算

  1. var a = 1;
  2. var b = true;
  3. var d = "2"
  4. var c = "hello world";
  5. var str = a+b;
  6. var sum = a+c;
  7. console.log(str);
  8. console.log(sum)
  9. console.log(a+d);

image.png

减法运算

  1. var a = true;
  2. var b = "3";
  3. var c = 4;
  4. console.log(a-b);
  5. /* Number(a)-Number(b) */
  6. console.log(c-b);
  7. console.log(c-a);

image.png

3.运算符和表达式

比较运算符

  1. >,<,>=,<=,==,!=

遇到比较运算符的时候会将对两边变量用number()方法,转换成Number类型再比较

  1. /*
  2. >,<,>=,<= 比较运算返回的结果是boolean
  3. 先将两边的值转换为Number再比较
  4. */
  5. var a = 10;
  6. var b = "20"
  7. var c = "true"
  8. console.log(a>b); //false
  9. // Number(a)>Number(b)
  10. console.log(a>c);
  11. // Number(a)>Number(c) 10>NaN NaN是不能参与计算的,它和任何值做计算,结果都是NaN

在转换的过程中会有特殊情况,例如字符串转数字会出现NaN
特殊情况NaN:NaN不等于,不大于,不小于任何值(包括自己)。 用isNaN(n):用来判断n是否为NaN

三目运算符

表达式?值1:值2
如果表达式为真 返回值1
如果表达式为假 返回值2
注意:值1和值2类型要一致

  1. var a = 30;
  2. var b = 20;
  3. var c = (a>b)?"a大于b":"a小于b";
  4. console.log(c)

相等和全等

一、相等(==)和不相等(!=)
相等和不相等这两个操作符都会先转换操作数(通常称为强制转型),然后再比较它们的相等性
在转换不同的数据类型时,相等和不相等遵循下列基本规则:
1.如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前会先将字符串转换为数值

  1. var s = "123";
  2. var num = 123;
  3. console.log(s==num); //true

2.如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较;

  1. var num1 = new Number(13); //num1为对象类型
  2. var num2 = 13; //num2为number基本类型
  3. console.log(num1==num2); //先去num1.valueOf()得到number类型的13,然后再比较

3.null和undefined是相等的,并且在比较相等性之前,不能将null和undefined转换成其他数据类型

  1. undefined == 0; //false
  2. null == 0; //false
  3. undefined == false; //false
  4. null == false; //false

4.如果有一个操作数是NaN,则相等操作符返回false
注意:NaN不等于任何数,包括他自己

5.如果两个操作数都是对象
如果两个都是对象(object)类型,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则是相等操作符返回true,否则返回false。

  1. var num1 = new Number(1);
  2. var num2 = new Number(1);
  3. console.log(num1==num2); //false
  4. //尽管这两个对象的valueOf()相等,但是不同的两个对象,并不是指向同一个对象

二、全等和不全等
除了在比较之前不转换操作数之外,全等和不全等与相等和不相等操作符没有什么区别。全等操作符只在两个操作数未经转换就相等的情况下返回true。

  1. var num1 = new Number(1); //类型为对象
  2. var num2 = 1; //类型为数字
  3. var result1 = (num1==num2); //true,因为转换后相等
  4. var result2 = (num1===num2); //false,因为不同的数据类型不相等