预备知识
- 输出信息,在开发的过程中,我们需要调试代码,这就用到了console.log,比如从接口拿到的数据data,可以这样打印:
console.log("data=>",data)复制代码
- 我们需要知道js代码具体写在哪里:
- html中
Title 复制代码 - 单独创建js文件,写在js文件中,开发中一般使用这个
变量声明
var a="a";//es6之前的声明方式let a1=1;//es6声明变量的方式const a2=2;//es6声明常量的方式console.log("a=>",a)//a=> aconsole.log("a1=>",a1)//a1=> 1console.log("a2=>",a2)//a2=> 2复制代码
数据类型
js的数据类型不同于c已经java,主要分为五大类:String、Number、Boolean、null、undefined。另外还有一种复杂的数据类型,Object。
字符串String
- 声明方式
var a="a";console.log("a=>",a)//a=> aconsole.log("a typeof=>",typeof a)//a typeof=> string复制代码
其中typeof是显示类型
- 其他类型转换成字符串
- toString()
var a=1;//number类型,先不用理解console.log("a typeof=>",typeof a)//a typeof=> numbervar a1=a.toString()//toString()是个方法,把其他类型转换成字符串,然后返回console.log("a1=>",a1)//a1=> 1console.log("a1 typeof=>",typeof a1)//a1 typeof=> string复制代码2.String()
var a=1;//number类型,先不用理解console.log("a typeof=>",typeof a)//a typeof=> numbervar a1=String(a)//String()是个方法,把其他类型转换成字符串,然后返回console.log("a1=>",a1)//a1=> 1console.log("a1 typeof=>",typeof a1)//a1 typeof=> string复制代码
- 字符串拼接
var a="hello";var a1="world!";var a2=a+" "+a1;console.log("a2=>",a2)//a2=> hello world!console.log("a2 typeof=>",typeof a2)//a2 typeof=> string复制代码
- 字符串方法
- charAt
var a="www.baidu.com";var a1=a.charAt(4)//获取到指定下标的字符,从0开始计算,拿到的就是bconsole.log("a1=>",a1)//a1=> b复制代码2.substring
var a="www.baidu.com";var a1=a.substring(4,9)//截取字符串,包前不包后console.log("a1=>",a1)//a1=> baidu复制代码3.slice
var a="www.baidu.com";var a1=a.slice(4,9)//截取字符串,包前不包后console.log("a1=>",a1)//a1=> baidu复制代码
4.indexOf
var a="www.baidu.com";var a1=a.indexOf("c")//c第一次出现的位置console.log("a1=>",a1)//a1=> 10复制代码
5.lastIndexOf
var a="www.baidu.com";var a1=a.lastIndexOf("c")//c最后一次出现的位置console.log("a1=>",a1)//a1=> 10复制代码
6.split
var a="www.baidu.com";var a1=a.split(".")//split的意思是分开,里面接分开的依据,这里是依据.分离a字符串,得到一个数组console.log("a1=>",a1)//(3) ["www", "baidu", "com"]console.log("a1 typeof=>",typeof a1)//a1 typeof=> object复制代码
7.toUpperCase和toLowerCase
var a="www.baidu.com";var a1=a.toUpperCase();//转成大写console.log("a1=>",a1)//WWW.BAIDU.COMvar a2=a1.toLowerCase();//转成小写console.log("a2=>",a2)//a2=> www.baidu.com复制代码
在开发中最常用到的是substring、slice和split,重点掌握这三个即可。
数值number
- 包含:正数、负数、零、小数、以及特殊的NaN
var a=1;//正数var a1=-1;//负数var a2=1.0;//小数var a3=0;//零var a4=NaN;//全称Not a Number,不是一个数值,但是它的类型还是一个数值console.log("a=>",typeof a)//a=> numberconsole.log("a1=>",typeof a1)//a1=> numberconsole.log("a2=>",typeof a2)//a2=> numberconsole.log("a3=>",typeof a3)//a3=> numberconsole.log("a4=>",typeof a4)//a4=> number复制代码
其中特别注意小数和NaN,对于小数,面试官特别喜欢问,我就被我的架构师组长问到小数的问题。
比如,他给我的面试题:
var a=0.1;//正数var a1=0.2;var a2=a+a1;console.log("a2=>",a2)//a2=> 0.30000000000000004复制代码
问我为什么会这样。那是因为js对小数的处理不够准确,也可以说多小数的处理不够好。答成这样,可以拿个毕业生的工资了。
如果要拿个程序员的工资,要这样答:
JS在运算过程中是先把十进制的运算数转换成二进制,再做运算,运算完成后再转换成十进制,转换时有些小数部分十进制不能正确转换成二进制。
为什么要注意这点,我在用typescript开发node后台的时候做过金额处理,如果以元为单位,就会有0.5元,0.05元这样的金额。解决办法:
我们可以乘以100再做运算
- Math对象
console.log(Math.pow(2,53)); //--> 2的53次方console.log(Math.round(.6)); //--> 1.0 四舍五入,返回的还是浮点型console.log(Math.ceil(.6)); //--> 1.0 向上取整console.log(Math.floor(.6)); //--> 0.0 向下取整console.log(Math.abs(-1)); //--> 1 取绝对值console.log(Math.max(2, 5, 6)); //--> 6 取最大值console.log(Math.min(-1, -2, 1));//--> -2 取最小值console.log(Math.random()); //--> 取0-1的随机数console.log(Math.PI) //--> 圆周率πconsole.log(Math.E ) //--> e: 自然对数的底数console.log(Math.sqrt(3)); //--> 3的平方根console.log(Math.pow(3, 1/3)); //--> 3的立方根console.log(Math.sin(0)); //--> 三角函数: 还有Math.cos(), Math.atan()等console.log(Math.log(10)); //--> 10的自然对数console.log(Math.log(100)/Math.LN10); //-->以10为底100的对数console.log(Math.exp(3)); //--> e的三次幂复制代码
这里面,经常用到的是Math.round、Math.ceil、Math.floor、Math.random、Math.abs、Math.max和Math.min。
Math.ceil和Math.floor,我们在学动画的时候就会用到,原生的js动画,当然现在插件很多,也不需要自己封装动画。
Math.random,在开发中,比如手机验证,我们发的手机收到的4个数字或者6个数字的短信就是用这个生成的数。
- 数值类型转换
var a="1";console.log("a typeof=>",typeof a);//a typeof=> stringvar a1=a-0;console.log("a1=>",a1);console.log("a1 typeof=>",typeof a1);//a1 typeof=> numbervar a2=a*1;console.log("a2=>",a2);//a2=> 1console.log("a2 typeof=>",typeof a2);//a2 typeof=> number复制代码
以上都是隐式转换
var a="1";console.log("a typeof=>",typeof a);//a typeof=> stringvar a1=Number(a);console.log("a1=>",a1);console.log("a1 typeof=>",typeof a1);//a1 typeof=> number复制代码
以上都是显式转换
- 数值方法
var a=1.5;var a1=parseInt(a);console.log("a1=>",a1);//a1=> 1复制代码
parseFloat():转成小数
布尔Boolean
开发中if的比较一般都需要用到它,可以说是非常常见的了。
console.log(Boolean(0));//falseconsole.log(Boolean(1));//trueconsole.log(Boolean(-0));//falseconsole.log(Boolean(undefined));//falseconsole.log(Boolean(null));//falseconsole.log(Boolean(NaN));//falseconsole.log(Boolean(''));//falseconsole.log(NaN==NaN);//false复制代码
Null和undefined
var a;console.log("a=>",a);//a=> undefinedvar a1=null;console.log("a1=>",a1);//a1=> null复制代码
null是很多语言都有的类型,意思是空,和go的nil一个意思。
undefined表示变量未定义的值,如果函数没有返回值,也会返回undefined。
这里要注意一个点,再比较的时候
null == undefined 返回true
null === undefined 返回false
对象Object
var a={};console.log("a typeof=>",typeof a);//a typeof=> objectvar a1=[];console.log("a1 typeof=>",typeof a1);//a typeof=> objectvar a2=null;console.log("a2 typeof=>",typeof a2);//a typeof=> objectvar a3=undefined;console.log("a3 typeof=>",typeof a3);//a3 typeof=> undefined复制代码
可能会有人奇怪,null为什么是obj,undefined还是undefined。因为null是特殊的object对象。
var a={};console.log("a=>",a);//a=> {}a.b=0;a.c="1"console.log("a=>",a);//a=> {b: 0, c: "1"}复制代码
var a=[];console.log("a=>",a);//a=> []a[0]=0;a[1]="1"console.log("a=>",a);//a=> (2) [0, "1"]复制代码
开发中最常用到这样的写法,可以很方便的给对象添加内容。