day0316
数值类型转换
字符串转换为数值
通过Number构造函数,强制转换数值,把对象的值转换为数字。
Number(object)
如果字符串是由数字构成,强转后将会变为数值,否则变成NaN
NaN 是非数值,是数值类型
如果参数是 Date 对象,Number() 返回从 1970 年 1 月 1 日至今的毫秒数。
如果对象的值无法转换为数字,那么 Number() 函数返回 NaN。
<script type="text/javascript">
var test1= new Boolean(true);
var test2= new Boolean(false);
var test3= new Date();
var test4= new String("999");
var test5= new String("999 888");/*有空格,无法转换*/
document.write(Number(test1)+ "<br />");
document.write(Number(test2)+ "<br />");
document.write(Number(test3)+ "<br />");
document.write(Number(test4)+ "<br />");
document.write(Number(test5)+ "<br />");
</script>
var a="5a",
b="FF",
c="101";
a=Number(a);
console.log(a);
b=Number(b);
console.log(b);
c=Number(c);
console.log(c);
Number强制转换会将布尔值转换为数值true>1 false>0
parseInt(string, radix) 函数可解析一个字符串,并返回一个整数。
小数部分舍去
radix可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。根据字符串的进制来转换成十进制数值如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。
<script type="text/javascript">
document.write(parseInt("10") + "<br />")
document.write(parseInt("19",10) + "<br />")
document.write(parseInt("11",2) + "<br />")
document.write(parseInt("17",8) + "<br />")
document.write(parseInt("1f",16) + "<br />")
document.write(parseInt("010") + "<br />")
document.write(parseInt("He was 40") + "<br />")
</script>
var d="5a",
e="FF",
f="101";
d=parseInt(d);
//parseInt转换数值时,如果字符串时纯实在构成或者第一个字符时是数字则转换时从头开始转换到字母之前
console.log(d);
e=parseInt(e);
console.log(e);
f=parseInt(f);
console.log(f);
//根据字符串的进制来转换成十进制数值
var d="5a",
e="FF",
f="101";
d=parseInt(d,16);
console.log(d);
e=parseInt(e,16);
console.log(e);
f=parseInt(f,2);
console.log(f);
parseFloat(string) 函数可解析一个字符串,并返回一个浮点数。
该函数指定字符串中的首个字符是否是数字。如果是,则对字符串进行解析,直到到达数字的末端为止,然后以数字返回该数字,而不是作为字符串。
<script>
document.write(parseFloat("10") + "<br>");
document.write(parseFloat("10.00") + "<br>");
document.write(parseFloat("10.33") + "<br>");
document.write(parseFloat("34 45 66") + "<br>");
document.write(parseFloat(" 60 ") + "<br>");
document.write(parseFloat("40 years") + "<br>");
document.write(parseFloat("He was 40") + "<br>");
</script>
三个函数的区别
var b=true;
console.log(b);
//Number强制转换会将布尔值转换为数值true-->1 false-->0
console.log(Number(b));
//parseInt的第一个参数要求是字符串,但是true和false都不是字符串 parseInt首先会自动隐式转换为字符串
console.log(parseInt(b));
console.log(parseInt(b,30));//把true当成30进制
console.log(parseFloat(b));
布尔值相关
var b=true;
//布尔值转换为字符串,都是直接变成字符串
console.log(String(b));
//字符串,数值变为布尔值
//强转布尔值
console.log(Boolean(4));
以下六种强转布尔值时会变成false,其他都是true
console.log(Boolean());
console.log(Boolean(""));
console.log(Boolean(false));
console.log(Boolean(NaN));
console.log(Boolean(undefined));
console.log(Boolean(null));
console.log(Number(undefined));//NaN
console.log(Number(null));//0 特殊记忆
console.log(Number({a:1}));//NaN
console.log(String({a:1}));//[object Object] 有对象都显示这个,特殊记忆
//小写object代表当前类型 大写Object代表总类型
console.log(typeof "a");
console.log(typeof 1);
五种基础数据类型string,number,boolean,undefined,null都是存在内存的栈中,object是存在内存的堆中。
存储在栈中的数据读取速度快,但是栈中可以存储的数据较小堆中可以存储大量的数据,但是读取速度慢。
所有的基础类型都是基于Object构建而成,例如
var o={a:1,c:function(){
}};
o.a;
o.c();
console.log(); //console是一个对象
alert(); //window.alert()
var a=5;
a.toString()
var a=5;//数值 number 这种类型会存储在栈中 typeof是number类型
var b=new Number(5);//数值对象 Nubmer 会存储在堆中 typeof是object类型
console.log(a,b);
console.log(typeof b);
console.log(String(b));
//number可以理解为Number类型在栈中的映射
console.log(b+1);
console.log(a+1);
JavaScript中,控制台输出不同颜色数据的区别:
var a = 10; //数字
var b = "hello"; //字符串
var c = true; //布尔
var d; //undefined
var e = null; //null
var f = [1,2,3,4,5,6]; //数组
var g = {}; //对象
console.log(a)
console.log(b)
console.log(true)
console.log(d)
console.log(e)
console.log(f)
console.log(g)
可以看出数字和布尔类型控制台会输出蓝色数据,而null和undefined是浅灰色,字符串是黑色
运算符
任何运算符都会返回结果
运算符优先级
typeof 优先级较高
算术运算符 + - * / %(官方叫取模,意思是取余)
纯数值运算参考小学课本
字符串相加,首位相连,如果加号+运算符一端是字符串,另一端不管是任何类型都会隐式转换为字符串
减号-乘号*除号/将符号两端自动隐式转换为数值
隐式转换 自动默认转换,自动默认转换的方法是目标类型的构造函数强制转换,例如String
console.log("abc"+"def");
console.log("abc"+5);
console.log("cde"+true);
console.log("abc"+null);
var a;
console.log("abc"+null);
console.log("abc"+{a:1});
console.log({a:1}+"");//[object Object] 相当于强转成String
console.log(5+"");
数值+布尔值会隐式转为数值相加
console.log(1+true);
console.log(1+false);
数值+undefined会隐式转为数值相加 NaN
console.log(1+undefined);
null会隐式转换为0
console.log(2+null);
数值与除了字符串外的非数值相加都会隐式转换为数值类型相加
布尔值、undefined、null相加也会转换为数值
除了+以外,-,*,/,% 都会按照数值运算先将其他类型转换为数值型后
赋值运算符(优先级低优先级,仅高于逗号)
var a=5;
a+=2;
console.log(a);
//先运行等号右侧的内容,将运算的结果赋值给等号左侧
a=a+2;
console.log(a);
var a=5;
var b=a=a+2;
console.log(b,a);//7,7
a=a=a+2;
console.log(a);
连等 先a=2的结果返回赋值给b,然后再将2赋值给a
console.log(a=2);//2
var b=a=2;
a=a+2;
a+=2; //步长放右边,在原来的基础上累加一个2
将运算结果赋值回原来的变量覆盖原来值
a+=2;
a-=2;
a*=2;
a/=2;
a%=2;
var a=2;
var b=a+2;//不覆盖原来的a
a=a+2;//覆盖原来的a
a+=2;//覆盖原来的a
快速转换为字符类型:加空字符串
var a=5;
a+="";//转换为字符类型,相当于String
console.log(a);
快速转换位数值类型:减零
var a="10";
a-=0;//转换为数值,相当于Number
console.log(a);
运算符优先级
//有赋值就能用逗号连
var a=5,b=10,c=20;//运算赋值,就是赋值
a+=2,b+=2,c+=2;//赋值运算
console.log(a,b,c);
一元运算符
与赋值运算符区别:
var a="3";
a++;//4 会隐式转换为数值再进行+1
console.log(a);
var a="3";
a+=1;//31 参照算术运算符
console.log(a);
a++与++a
var a=1;
console.log(a++);
console.log(++a);
var a=2;
console.log(++a+a+++a+a+++a+a,a)//怎么断都行
var a=2;
//看成
console.log(++a + a++ + a + a++ + a + a,a)
var a=2;
console.log(++a + a-- - a + a-- - a++ + a - (a+a++),a);
关系运算符 < <= > >= 返回布尔值
var a=4;
console.log(a>4);//false
a=a-a>3;//false
console.log(a);
var a=4;
a+=1>3;//赋值运算+=优先级仅高于逗号,先算1>3
console.log(a);
双等号自动隐式转换两端类型相同后比较
三等号不转,比较值,也比较类型
== , === , != ,!== 返回布尔值
== , != 会自动隐式转换为**两端类型相同**后比较
先用三个等号,两个等号学好再用
===, !== 不会转换类型,除了比较值之外还会**比较类型**
console.log(1=="1"); //转换为字符串?
console.log(1==true);
console.log(1===true);
console.log(0==false);
console.log(false=="");
console.log(0=="");
console.log(0==null);
console.log(undefined==null);
双等号相等:
0 false ""空字符串 这3个双等号相等
null undefinde 相等 空或者未赋值 这2个双等号
if(a==undefined){
//能进入
//var a;
//var a=undefined;
//var a=null;
}
隐式转换根据 之后再学
toString() valueOf()
非数值永远不等
console.log(NaN==NaN);//false 非数值永远不等
因此不能用==NAN判断非数值
var a="4a";
console.log(Number(a)==NaN);//不能用==NaN判断非数值
用下面的两个方法:
console.log(isNaN(Number(a)));//直接写的方法就是window下面的方法
console.log(Number.isNaN(Number(a)));
两个方法的异同:
//都是判断数值类型,Number.isNaN非数值类型,不隐式转换返归false
console.log(Number.isNaN(a));
console.log(Number.isNaN(Number(a)));
//window.isNaN会先隐式转换为数值,然后在判断是否是非数值
console.log(isNaN(a));
if(a==undefined){
//能进入的
//var a;
//var a=undefined;
//var a=null;
}
if(a===undefined){
//能进入的
// var a;
// var a=undefined;
}
if(a==0){
//能进入的
//var a=false
// var a="";空字符串
// var a=" ";也是空字符串
// var a=0;
}
条件返回值是true,则进入条件语句块
返回的不是布尔值时会自动隐式转换为布尔值
if(a==true){
//除了 0 undefined null "" false NaN这六种都能进
}
if(a===true){
// true能进
}
if(a){
//除了 0 undefined null "" false NaN这六种都能进
}
!a 非a
非a叫取反,取布尔值的反,如果是布尔值就会变成相反的结果
如果值不是布尔值就会隐式转换为布尔值,然后再取反
console.log([]==[]);//false
//因为数组是对象类型,也是引用类型,两个数组是两个不同的引用对象,所以不相同
console.log([]==![]);//true
//!非,强制变成布尔值之后取反
//隐式转换类型 数组自动转换优先为字符串,空数组为空字符串
&&逻辑与 ||逻辑或 返回的值根据内容确定类型,不是一定返回布尔值的
逻辑与&&找false熔断
true && true 第二个true的结果
true && false 返回隐式转换布尔值为false的值
false && true 返回隐式转换布尔值为false的值
false && false 返回第一个false的结果
逻辑或||找true熔断
true || true 转布尔值只为判断,返回前面的原来值
true || false 返回隐式转换布尔值为true的值
false || true 返回隐式转换布尔值为true的值
false || false 返回最后一个false的值
var o;
//o=o || {a:1};相当于下面
//空则添加{a:1}
if(!o){
o={a:1}
}
进制
进制转换
8421码
ASCII GB2312 GB
unicode 万国码 utf-8 utf-16
#FF0000 #RGB 红绿蓝 光学三原色
图像存储
图像 像素点 每个像素点是一个纯色彩
图片72像素每英寸
文字96像素每英寸
位运算符
位非~
var a="abc";
//数值位非运算符加一取负
//两次就会还原取整
//双位非:还原,取整,任何内容转换为数值,如果是非数值(或者带小数点)变为0
console.log(~a);
var str="abcde";
//str.indexOf("f");//找到返回位置,找不到返回-1,只有-1位非是0
if(~str.indexOf("f")){
//当找到f是进入
}
&位与运算
console.log(30&45);
// 011110
// 101101
// 001100=12
//任何数&2 要么是0 要么是2
//30&2
//011110
//任何数&3 0123
//任何数&7 01234567
|位或运算
console.log(30|45);
// 011110
// 101101
// 111111=63
//任何数|3
^按位异或
//两个相同时为0,不同时为1
//console.log(30^45);
//011110
//101101
//110011
//可用于加密解密 对称加密
var a=274675^123456//钥匙 pin
console.log(a);
//381619
console.log(381619^123456);
右移运算符
// >>右移运算符
console.log(8<<2);//32
console.log(8>>2);//2
//32位回到原来
var a=1;
a<<=3;
a>>3;
javascript小数加法bug 解决方法:每位乘十最后总的除十
console.log(0.1+0.2);
三目运算符
叫三元运算符、条件运算符
返回true 或者false时不需要用
var a=5;
var b=a>3 ? 1:0;
console.log(b);
var b=a>5;
console.log(b);