数据类型及数据转换、作用域

数据类型

数字,字符串,布尔值,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();
        

 

posted @ 2017-06-30 23:47  影子疯  阅读(380)  评论(0编辑  收藏  举报