数据类型及数据转换、作用域
数据类型
数字,字符串,布尔值,null,undefined,对象(数组,函数,date,正则),NaN。。。。。
number,string,boolean,null,undefined,object
数字
十进制:255
16进制:0xff //15*16+15 = 255 以0x开始
8进制:0377 //3*64+8*7+7 = 255 以0开始
NaN和任何值都不相等,包括它本身
x!=x 当x为NaN时成立,为true,其他任何时候都为false
isNaN() //如果参数是NaN,或者非数字值(如字符串和对象),返回true,否则返回false
关于数字精度问题
var x = 0.3-0.2;
var y = 0.2-0.1;
console.log(x == y); //false:计算机用的是二进制,比如1/2,1/4,1/8等,非十进制,只能无限于相等
时间和日期
<script type="text/javascript"> var oP = document.querySelector('p'); var then = new Date(2011,0,1); //2011年1月1日 var now = new Date(); //当前日期和时间:Fri Jun 30 2017 16:54:47 GMT+0800 (中国标准时间) var later = new Date(2017,7,1,8,10,20); //未来时间2017年7月1日 8:00am var elapsed = later - now //日期减法,计算时间间隔的毫秒数 later.getFullYear(); //2017:获取年 later.getMonth(); //7:获取月份,从0开始计算 later.getDate(); //1:获取日期,从1开始计算 later.getDay(); //2:获取星期几,0表示星期天,5表示星期五 later.getHours(); //8:获取时 later.getMinutes(); //10:获取分 </script>
常见数学函数
Math.pow(2,10); //1024:2的10次幂
Math.round(0.6); //1.0:四舍五入
Math.ceil(0.6); //1.0:向上求整
Math.floor(0.6); //0:向下求整
Math.abs(-5); //5:求绝对值
Math.max(10,11,1,3,25); //25:求最大值
Math.min(10,11,1,3,-25); //-25:求最小值
Math.random(); //生成一个大于等于0小于1的随机数
Math.PI; //3.14:圆周率
Math.sqrt(4); //2:4的平方根
Math.pow(27,1/3); //3:27的立方根
Math.sin(0); //三角函数
字符串
在字符串中,'can't' 必须写成'can\'t'
字符串方法
var str = 'hello,world';
str.length; //11:字符串的长度
str[0]; //'h':获取第一个字符
str.charAt(0); //'h':获取第一个字符
str.charAt(str.length-1); //'d':获取最后一个字符
str.substring(1,4); //'ell':截取第2~4个字符
str.slice(1,4); //'ell':截取第2~4个字符
str.slice(-3); //'rld':为负数时,从最后开始数,最后3个字符
str.indexOf('l'); //2:字符l首次出现的位置
str.lastIndexOf('l'); //9:字符l最后一次出现的位置
str.indexOf('l',3); //3:在位置3及之后l首次出现的位置
str.split(','); //['hello','world']:以逗号为分割符,分割成有两个元素的数组
str.replace('h','H'); //'Hello,world':字符替换
str.toUpperCase(); //'HELLO,WORLD':变成大写
Note:JavaScript中字符串是固定不变的,replace()和toUpperCase()方法都返回新的字符串,原字符串本身并没有发生改变
布尔值 Boolean(true or false)
false --- undefined,null,0,-0,NaN,"" //空字符串
true --- 所有其他值,包含所有的对象和数组,函数
运算符
&& -- a && b a和b都为true,返回true,否则返回false
|| -- a || b a和b只要任何一个为true,返回true,否则返回false
! -- !a a为真,返回false;a为假,返回true
null和undefined
null--空值,用typeof null方法,得出的是object
undefined -- 未定义,属性或元素不存在
对象类型 -- 对象,数组,函数
对象
var obj = {
'username':'leo',
'sex':'man',
'password':'123'
};
获取对象值的方法 ---- obj.username //'leo'
obj.username = 'momo'; //修改userna值
obj.age = 38; //给对象添加一个age属性
数组
var arr = [1,2,3];
console.log(arr.length); //3:获取arr的长度
console.log(arr[0]); //1:获取arr中的第一个值
console.log(arr[arr.length-1]) //3:获取arr中的最后一个的值
arr[0] = 10; //修改arr中第一个值
arr[3] = 4; //给arr添加第4个值
函数
function fn(){
....
}
函数调用:
fn();
a = fn;
数据类型转换
转成数字
Number()
var obj = {'username':'leo'};
console.log(Number(1)); //1
console.log(Number(-0)); //-0
console.log(Number(NaN)); //NaN
console.log(Number('1')); //1
console.log(Number('abc')); //NaN
console.log(Number('12abc')); //NaN
console.log(Number("abc12")); //NaN
console.log(Number('a12bc')); //NaN
console.log(Number('')); //0
console.log(Number(true)); //1
console.log(Number(false)); //0
console.log(Number(null)); //0
console.log(Number(undefined)); //NaN
console.log(Number([])); //0
console.log(Number([1])); //1
console.log(Number([1,2,3])); //NaN
console.log(Number([1,'abc'])); //NaN
console.log(Number(['abc',12])); //NaN
console.log(Number(['abc'])); //NaN
console.log(Number({})); //NaN
console.log(Number(obj)); //NaN
console.log(Number(function fn(){})); //NaN
parseInt() -- 只解析整数;如果字符串前缀是'0x'或者'0X',则解析为十六进制数;会跳过任意数量的前导空格,尽可能解析更多的数值字符,忽略后面的内容;如果第一个为非空格字符是非法的数字直接量,返回NaN;可接收第二参数,指定数字的转换基数,取值范围2~36
parseFloat() -- 解析整数和浮点数;会跳过任意数量的前导空格,尽可能解析更多的数值字符,忽略后面的内容;如果第一个为非空格字符是非法的数字直接量,返回NaN
var n = parseInt('3 blind mice');
var m = parseFloat('0.1');
console.log(typeof n); //number
console.log(typeof m); //number
console.log(parseInt('3 blind mice')); //3
console.log(parseInt('3.14 meters')); //3
console.log(parseInt('$72.14')); //NaN
console.log(parseInt('-12.34')); //-12
console.log(parseInt('0xFF')); //255
console.log(parseInt('-0XFF')); //-255
console.log(parseInt('.1')); //NaN
console.log(parseInt('0.1')); //0
console.log(parseFloat('.1')); //0.1
console.log(parseFloat('0.1')); //0.1
console.log(parseFloat('3.14 meters')); //3.14
console.log(parseFloat('$72.14')); //NaN
console.log(parseInt('11',2)); //3
console.log(parseInt('ff',16)); //255
console.log(parseInt('zz',36)); //1295
console.log(parseInt('077',8)); //63
console.log(parseInt('077',10)); //77
转换成字符串
String()
var obj = {'username':'leo'};
console.log(String(1)); //'1'
console.log(String(undefined)); //'undefined'
console.log(String(null)); //'null'
console.log(String(true)); //'true'
console.log(String(false)); //'false'
console.log(String(NaN)); //'NaN'
console.log(String([])); //''
console.log(String([1])); //'1'
console.log(String([1,2,3])) //'1,2,3'
console.log(String(['abc'])); //'abc'
console.log(String(['abc',12])); //'abc,12'
console.log(String([12,'abv'])); //'12,abc'
console.log(String({})); //[object object]
console.log(String(obj)); //[object object]
console.log(String(function(){})); //'function(){}'
toString()方法,可以传递参数,范围2-36
var n =17
var str = n.toString(2);
console.log(n.toString()); //'17':默认转成10进制
console.log(n.toString(2)); //'10001':转成二进制
console.log(n.toString(8)); //'21':转成8进制
console.log(n.toString(16)); //'11':转成16进制
console.log(n.toString(3)); //'122':z转成3进制
console.log(typeof str); //string:用toString 转成字符串
当处理财务或者科学数据的时候,做数字到字符串的转换过程中,需要指定输出的小数点位置和有效数字位数,或者用指数计数法
toFixed() -- 根据小数点后的指定位数将数字转换成字符串
toExponential() -- 使用指数计数法将数字转换成指数形式的字符串,其中小数点前只有一位,小数点后的位数由参数指定
toPrecision() -- 根据指定的有效数字位数将数字转换成字符串,如果有效数字的位数少于数字整数部分的位数,则转换成指数形式。
var n =123456.789
var str1 = n.toFixed(0);
var str2 = n.toExponential(1);
var str3 = n.toPrecision(4);
console.log(typeof str1); //string
console.log(typeof str2); //string
console.log(typeof str3); //string
console.log(n.toFixed(0)); //'123457'
console.log(n.toFixed(2)); //'123456.79'
console.log(n.toFixed(5)); //'123456.78900'
console.log(n.toExponential(1)); //'1.2e+5'
console.log(n.toExponential(3)); //'1.235e+5'
console.log(n.toPrecision(4)); //'1.235e+5'
console.log(n.toPrecision(7)); //'123456.8'
console.log(n.toPrecision(10)); //'123456.7890'
转换成Boolean --- Boolean()
false --- undefined,null,0,-0,NaN,"" //空字符串
true --- 所有其他值,包含所有的对象和数组,函数
作用域
var a = 1; //全局变量
function fn() {
var a = 2; //局部变量
return a;
}
console.log(fn()); //2
console.log(a); //1
//尽管在全局作用域编写代码可以不写var语句,但声明局部变量的时必须使用var,不然会修改全局变量
b = 1; //不用var 声明全局变量
function fn1(){
b = 2; //不用var声明局部变量,这里会改变全局变量的值
c = 3; //相当于全局变量
return [b,c];
}
console.log(fn1()); //[2,3]
console.log(b); //2:全局变量被改变
console.log(c) //3
var b = 1; //用var 声明全局变量
function fn1(){
var b = 2; //用var声明局部变量,不会改变全局变量的值
var c = 3;
return [b,c];
}
console.log(fn1()); //[2,3]
console.log(b); //1:全局变量被改变
console.log(c); //报错,全局变量中没有声明c
// //多个函数嵌套
var m = 1;
function fn2(){
var m = 2;
function fn3(){
var m = 3;
return m;
}
return fn3();
}
console.log(m); //1
console.log(fn2()); //3
//声明提前
var scope = 'global';
function fn4(){
console.log(scope); //undefined
var scope = 'local';
console.log(scope); //local
}
fn4();