0508 day3 js
js基础语法
<script src="">
引入script文件- REPL环境:read读→eval执行→print打印→loop循环
- 前端三层:结构层html,样式层css,行为层js
- 变量声明提升:
console.log(x);
var x , y = 2;
console.log(y);
y = 123;
<!--console输出结果为undefine 2,前者原因是变量声明提升(不会报错导致无法运行),后者原因是顺序执行,值不会覆盖-->
- javascript五种基本数据类型:Number, String, Boolean, Undefined, Null
- 二进制0b,八进制0,十六进制0x,科学计数法3e8/3e-8
- 进行数学运算,但结果得不到数学值的时候,输出NaN
- NaN是个值,typeof为Number,特点是不自等;
- Infinity:无穷大
substring(a,b)
:从a到b
substr(a,b)
:从a开始数b个
charAt(a)
:第a个
slice(a,b)
:从a到b-1
toUpperCase()
:全大写
toLowerCase()
:全小写
indexOf(a)
:返回a出现的首个位置,0表示第一个位置typeof null
返回值为Object
Number();
函数
Number("123.456")//123.456
Number("");//0
Number("1+1")//NaN
Number("123123dsd")//NaN
Number(true)//1
Number(false)//0
Number(null)//0
Number(undefined)//NaN
Boolean()
函数
Boolean(0); //false
Boolean(NaN); //false
Boolean(Infinity); //true
Boolean(""); //false
Boolean(undefined); //false
Boolean(null); //false
Boolean(false); //false
Boolean('false'); //true
parseFloat()
:
var a = "0123456.123n456";
console.log(parseFloat(a));//123456.123
var a = "dsahjdsai123.123";
console.log(parseFloat(a));//NaN
表达式和运算法
- 隐式类型转换:
3 * '4' //12
true + true //2
false + 2 //2
3 * '2天' //NaN
- 使用
toFixed()
保留小数的方法解决IEEE754造成的浮点数丢失精度问题 - Math函数
Math.pow();//平方
Math.sqrt();//开根号
Math.ceil();//向上取整
Math.floor();//向下取整
- ==判断值相等;===判断数据类型与值全部相等
- 短路计算
3 && 6 //6
undefined && 15 //undefined
15 && undefined //undefined
null && 2 //null
'' && 16 //''
NaN && undefined //NaN
<!--&&运算前假用前,前真用后;||同理,前真用前,前假用后-->
- 优先级:非>与>或
3 && 4 || 5 && 6 //结果为4
!0 //true
!1 //false
0509 辅修 摸了一天鱼
0510 day4 考完试 继续学习js
知识点(有点难了QAQ)
- 随机数函数:
<!--得到[a,b]之间的随机整数,其中Math.random()生成(0,1)之间的小数-->
parseInt(Math.random()*(b-a+1))+a;
continue label;
:立即跳过label所在循环的 当前的这次循环,并继续label所在循环的下一次循环
使用方法:
outer: for(){
for(){
blabla;
continue outer;
}
}
- 使用
arr.isArray()
方法或鸭式辨型判断数组 - 数组常用方法:
var arr = [1,2,3,4,5];
arr.push(6);//数组末尾添加6,插入多项需要用逗号分割
var item = arr.pop();//弹出数组末尾的项,并且该项可以被赋值给其他定义的变量。不需要参数
arr.unshift(0);//在数组起始位置添加项,可以添加多项
arr.shift();//删除首项,被删除的项可以被变量接收。不需要参数
join()方法:将数组以自定义方式转为字符串
arr.join();//1,2,3,4,5 相当于toString()
arr.join("-");//1-2-3-4-5
arr.join("");//12345
split()方法:将字符串以自定义方式转为数组 var str = 'qwer';
str.split();//["qwer"] 注:一般参数不留空,留空的话数组只有唯一一项,即字符串内容
str.split('');//["q","w","e","r"] 以空字符串分割
'q,w,e,r'.split(',');//["q","w","e","r"] 以逗号分割
concat()方法:合并连接多个数组
var arr1 = [1,2,3,4];
var arr2 = [5,6,7];
var arr3 = [8,9];
var arr = arr1.concat(arr2,arr3,...);//返回值为合并的数组,不会改变原数组
splice()方法:splice意思是拼接,是个多功能算法
arr.splice(3,2);//[1,2,3,6]功能一:删除指定位置指定数量的项 从3号位置开始删除,删除数量为2,其余数组元素顺序不变
arr.splice(3,2,44,55,66);//[1,2,3,44,55,66,6] 功能二:删除并替换项 从3号位置开始删除,删除数量为2,并由44,55,66在原位置进行替换
arr.splice(3,0,44,55,66);//[1,2,3,44,55,66,4,5,6]功能三:插入项 第二个参数为0时,可以实现在指定位置插入项
注:可以使用变量接收splice()方法删除的项
slice()方法:截取数组部分
var newArr = arr.slice(3,5);//[4,5] 从3号位开始,到5号位结束,不包括5号位
var newArr = arr.slice(3);//[4,5,6] 从3号位开始,截取后续所有
var newArr = arr.slice(3,-1);//[4,5] 从3号位开始,到最后一位结束,不包括最后一位
reverse()方法:数组元素顺序反转
indexOf();//搜索数组中某个元素的位置,返回值为下标,不存在则返回-1
includes();//判断数组中是否存在某个元素,返回值为布尔值
sort();//内置的排序函数
- 堆内存&引用类型
var arr1 = [1,2,3,4];
var arr2 = arr1;
arr1.push(5);
console.log(arr1);
console.log(arr2);
//输出结果为:[1,2,3,4,5]和[1,2,3,4,5],原因是数组不属于基础数据类型,且较为庞大,因此使用堆内存;而arr2 = arr1是引用类型,赋值时直接将arr2指向了堆内存中分配给arr1的地址,因此arr1的值改变时arr2也会改变
[1,2,3] == [1,2,3] //false
[] == [] //false
var arr = [1,2,3]; arr = arr //true
var newArr = arr; arr = newArr //true
二者都是因为引用类型进行比较时,不判断值是否相同,而判断地址是否相同
总结:
当var a = b变量传值时:基础类型会在内存中产生新的副本;而数组、对象等引用类型不会产生新的副本,而是将新变量指向同一个地址;
当用==比较时:基础类型会比较值是否相等;而引用类型会比较内存地址是否相同,即比较的是否是同一个对象
解决引用类型造成数组无法复制的问题:浅克隆(循环推入数组每一项(当数组中存在项为数组时,会“藕断丝连”,即仍旧存在result[3] == arr1[3]))、深克隆:递归