1.声明提前
es6语法以前JavaScript在执行代码的时候会将所有使用var声明的变量,放在作用域的顶部集中创建,赋值留在原地
console.log("a="+a);
var a = 20;
//输出结果为a=undefined
2.数据类型转换
字符串和布尔转成数字
Number()强制转换
var a="12.132";
var bool = true;
var num1 = Number(a); //num1为12.132
var num2 = Number(bool); //num2为1
缺点:Number()只能识别纯数字的字符串,遇到字符串中含由非数字的会返回NaN
parseInt和parseFloat
var str = "12.323px";
console.log(Number(str)); //输出为NaN
console.log(parseInt(str)); //输出为12
console.log(parseFloat(str)); //输出为12.323
开头的字符必须以数字开头,遇到非数字的字符就停止解析
另外,parseInt还可以将其他进制的数转化为十进制
/* JavaScript里面:
八进制的数都是以0开头,类似:0750,060
十六进制的数都是0x开头,类似:0xAF,0x5631
在ECMA3中,“070”会被当成八进制字面量,会被转化为十进制的56
“0xAF”会被当成十六进制字面量,会被转换为175*/
var a = 012;
var b = 0xAF
console.log(a);//输出会是10
console.log(b);//输出会是175
/*parseInt()函数提供了第二个参数:转换时使用的基数(即多少进制)*/
var num1 = parseInt("012",8); //10
/*注意这里的012一定要用引号包住,否则会先被转换为10,然后成了parseInt(10,8)*/
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()
特殊情况:加运算中,碰到字符串,+会起到拼接符的作用
加法运算
var a = 1;
var b = true;
var d = "2"
var c = "hello world";
var str = a+b;
var sum = a+c;
console.log(str);
console.log(sum)
console.log(a+d);
减法运算
var a = true;
var b = "3";
var c = 4;
console.log(a-b);
/* Number(a)-Number(b) */
console.log(c-b);
console.log(c-a);
3.运算符和表达式
比较运算符
>,<,>=,<=,==,!=
遇到比较运算符的时候会将对两边变量用number()方法,转换成Number类型再比较
/*
>,<,>=,<= 比较运算返回的结果是boolean
先将两边的值转换为Number再比较
*/
var a = 10;
var b = "20"
var c = "true"
console.log(a>b); //false
// Number(a)>Number(b)
console.log(a>c);
// Number(a)>Number(c) 10>NaN NaN是不能参与计算的,它和任何值做计算,结果都是NaN
在转换的过程中会有特殊情况,例如字符串转数字会出现NaN
特殊情况NaN:NaN不等于,不大于,不小于任何值(包括自己)。 用isNaN(n):用来判断n是否为NaN
三目运算符
表达式?值1:值2
如果表达式为真 返回值1
如果表达式为假 返回值2
注意:值1和值2类型要一致
var a = 30;
var b = 20;
var c = (a>b)?"a大于b":"a小于b";
console.log(c)
相等和全等
一、相等(==)和不相等(!=)
相等和不相等这两个操作符都会先转换操作数(通常称为强制转型),然后再比较它们的相等性
在转换不同的数据类型时,相等和不相等遵循下列基本规则:
1.如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前会先将字符串转换为数值
var s = "123";
var num = 123;
console.log(s==num); //true
2.如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较;
var num1 = new Number(13); //num1为对象类型
var num2 = 13; //num2为number基本类型
console.log(num1==num2); //先去num1.valueOf()得到number类型的13,然后再比较
3.null和undefined是相等的,并且在比较相等性之前,不能将null和undefined转换成其他数据类型
undefined == 0; //false
null == 0; //false
undefined == false; //false
null == false; //false
4.如果有一个操作数是NaN,则相等操作符返回false
注意:NaN不等于任何数,包括他自己
5.如果两个操作数都是对象
如果两个都是对象(object)类型,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则是相等操作符返回true,否则返回false。
var num1 = new Number(1);
var num2 = new Number(1);
console.log(num1==num2); //false
//尽管这两个对象的valueOf()相等,但是不同的两个对象,并不是指向同一个对象
二、全等和不全等
除了在比较之前不转换操作数之外,全等和不全等与相等和不相等操作符没有什么区别。全等操作符只在两个操作数未经转换就相等的情况下返回true。
var num1 = new Number(1); //类型为对象
var num2 = 1; //类型为数字
var result1 = (num1==num2); //true,因为转换后相等
var result2 = (num1===num2); //false,因为不同的数据类型不相等