1.JS命名规则:
- 只能由数字、字符、下划线和美元符号($)组成
- 不能以数字开头
- 不能是保留字和关键字
- 大小写敏感
2.数据类型:
弱引用类型: 给赋值什么就是什么数据类型,不建议改变数据类型
值类型(基本类型): 字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。
复合数据类型/引用数据类型: 统称为object类型.里面包含的object类型、function、 Array、Date、RegExp
3.运算符:
-
算数运算符 + - * / %
-
关系运算符 > < >= <= != === !==
-
逻辑运算符:与&&,或|| 非! 短路运算
-
一元运算符 ++ –
-
赋值运算符 = += -=
自动数据类型转换: 不同数据类型之间是没有办法进行运算,将数据转成同一数据类型,再进行计算
- 其中有一个操作数是字符串,运算符为 + ,别的数据类型会转成字符串,进行字符串拼接
alert("hello"+100); //hello100
alert("hello"+true); //hellotrue
alert("hello"+null); //hellonull
alert("hello"+undefined); //helloundefined
alert("hello"+NaN); //helloNaN
-
任何数据和字符串 做+以外的操作,那么字符串要先转成数字再去进行运算
(1) 如果字符串是一个纯数字字符组成的字符串,转成对应的数字
alert(100-“20”); //80
(2) 如果字符串中含有纯数字以外的别的字符,转成NaN,NaN和任何数据运算都是NaN
alert(100-“20a”); //NaN -
除字符串以外的数据,再进行算数运算的时候,先转成数字,再进行运算。
alert(10+true); //11
alert(10+false); //10
alert(10-null); //null=>0 10
alert(10-undefined); //NaN
alert(10-NaN); //NaN
[注]计算机时不会进行小数运算(天生有bug)
alert(0.8-0.2); //0.6000000000000001
alert(10/0); // Infinity
alert(-10/0); // -Infinity
alert(Infinity+"hello"); // Infinityhello
alert(Infinity+100); //Infinity
4.强制类型转换:
其他类型转布尔值,非0即真,非空即真
alert(Boolean(""));//false null undefined NaN转布尔值均为false
转数字 Number(),只有数字的字符串,true,false才能转为数字
alert(Number("100a"));//NaN
alert(Number(parseInt("10b0a"))); //10
alert(Number(NaN)); //NaN
alert(Number(undefined)); //NaN
alert(Number(null)); //0
alert(undefined==null); //true
alert(!Infinity);//false
5.while循环
三种语法:while循环 、 do-while循环、for循环
arguments 是用来存储实际传入的参数
arguments.length 输出当前里面存储的参数个数
访问某一个数据 arguments[下标];
function show(){
alert(arguments[1]);}
show(10,true, "hello",40,50);
6.数组
数组声明
- 通过new创建数组 var arr=new Array(100,true, “hello”);
- 省略new运算符创建数组 var arr=Array(100,true, “hello”);
- 数组常量进行赋值 var arr=[100,true, “hello”]
[注] 前两种方式,如果传入一个数字,代表声明的数组长度
var arr=new array(10);声明一个长度为10的数组
数组的属性
数组.length
访问数组的元素:数组[下标]; 下标从0开始 arr[1]
Math.random() [0,1)
数组遍历: for for…in for…of forEach
for(var i in arr){
Document.write(arr[i]+ "<br/>");
}
var arr = [1, 2, 3, 4, 5, 6];
arr.forEach(function (item, index, arr) {
//item当前遍历到的元素
//index当前哪里到元素的下标
//arr数组本身
document.write(item + "," + index + "," + arr + "<br/>");
});
数组方法:
- 栈结构 :
- 数组.push(参数1,参数2,…)
功能:给数组的末尾添加元素
返回值:插完元素以后数组的长度,原数组发生改变
var arr=[1,2,3,4];
var res=arr.push(10,11);
alert(res); //6
alert(arr); //1,2,3,4,10,11
- 数组.pop()
功能:从数组末尾取下一个元素
返回值:取下的一个元素,原数组为去掉元素的数组
var arr=[1,2,3,4,5];
var res=arr.pop();
alert(res); //5
alert(arr); //1,2,3,4
- 队列结构
- push
- 数组.shift() 无参数
功能:从数组的头部取下一个元素
返回值:取下的元素,原数组为去掉取下的元素 - 数组.unshift(参数1,参数2,……)
功能:从数组的头部插入元素
返回值:插完元素以后数组的长度,原数组变为插入元素的数组
-
concat() 拷贝原数组,生成新数组
合并数组:数组.concat(数组,数据1,数据2…);
返回值:合并成的新数组,原数组不会改变
[注] 就算传入是数组,数组中元素中的元素要单独拆出来再进行合并
var arr1=[1,2,3];
var arr2=[10,20,30];
var newArr=arr1.concat(arr2, "hello");
alert(newArr); //1,2,3,10,20,30,hello
alert(newArr.length); //7
alert(arr1); //1,2,3
-
截取数组元素: 数组.slice(start,end); [start,end)不包含末尾元素
功能:可用基于当前数组获取指定区域元素[start,end),提取出元素生成新数组
返回值:生成的新数组,原数组不会发生任何改变 -
splice() :数组.splice(start,length,数据1,数据2,…);
start:开始截取的位置
length:截取的元素的长度
第三个参数开始:在start位置,插入的元素
返回值:截取下来的元素生成的数据 ,原数组为除去截取下来的元素
先截取元素,然后从第一个参数位置上添加数据
增加
var arr=[1,2,3,4];
var res=arr.splice(1,0, "hello");
alert(res);//空白
alert(arr); //1,hello,2,3,4
删除
var arr=[1,2,3,4];
var res=arr.splice(1,2);
alert(res);//2,3
alert(arr); //1,4
修改(先删除,再增加)
var arr=[1,2,3,4];
var res=arr.splice(2,1, "hello");
alert(res);//3
alert(arr); //1,2,hello,4
-
join() 数组.join(字符串)
功能:将数组中的元素,用传入的拼接符,拼接成一个字符串
返回值:拼接好的字符串,原数组不发生改变
var arr=[1,2,3,4];
var res=arr.join("=");
alert(res); //1=2=3=4
alert(arr); //1,2,3,4
- reverse 逆序 数组.reverse();
原数组发生改变
var arr=[true,100,8];
arr.reverse();
alert(arr); //8,100,true
- 数组排序 数组.sort() 默认从小到大排序,按照字符串排序,原数组发生改变
var arr =[30,20,10,50,40];
arr.sort();
alert(arr); //10,20,30,40,50
var arr =[30,2,10,5,40];
arr.sort();
alert(arr); // 10, 2, 30, 40, 5
数值大小排序,加入方法
//从小到大排序
var arr =[30,2,10,5,40];
arr.sort(function(value1,value2){
return value1-value2
});
alert(arr);
arr1=[1,2,3,4];
arr2=arr1;
arr1.push(5,6); //arr1,arr2均改变,指向同一个地址
如果不想改变arr1的值,可以使用concat方法
arr1=[1,2,3,4];
arr2=arr1,concat();
arr2.push(5,6);
- 数组.indexOf(item,start);
item任意的数据
start 下标 可以不传入,默认为0
功能:在数组中查找第一次出现item元素下标,从start开始取查找
返回值: -1没有查到 >=0查找到的元素的下标 原数组不发生改变
- map()映射 会遍历当前数组,然后调用参数中的方法,返回当前方法的返回值
map不会改变原有数组,而是将函数执行一次之后的返回值组成一个数组,返回回来
var arr = [2, 3, 4, 5, 6, 7];
var newArr = arr.map(function (item, index, arr) {
return item * 2;
});
alert(newArr); //4,6,8,10,12,14
alert(arr); //2, 3, 4, 5, 6, 7
- 过滤 filter() 不会改变原数组
var arr = [2, 3, 4, 5, 6, 7];
var newArr = arr.filter(function (item, index, arr) {
return item > 5;
});
alert(newArr); //6,7
alert(arr); //2, 3, 4, 5, 6, 7
- 某些 some 在数组中查找是否有符合条件的元素,有的话返回true,没有返回false
原数组不发生改变 短路操作
var arr = [2, 3, 4, 5, 6, 7];
var newArr = arr.some(function (item, index, arr) {
return item > 5;
});
alert(newArr); //true
alert(arr); //2, 3, 4, 5, 6, 7
- 每一个 every 每一个都符合条件返回true,否则返回false
不改变原数组
var arr = [2, 3, 4, 5, 6, 7];
var newArr = arr.every(function (item, index, arr) {
return item > 1;
});
alert(newArr); //true
alert(arr); //2, 3, 4, 5, 6, 7
- reduce 归并
var arr = [2, 3, 4, 5, 6, 7];
var res = arr.reduce(function (prev, next, index, arr) {
/* prev 第一次时 下标为0的元素
第二次开始, 上一次遍历return的值
next 从下标1开始 当前遍历到的元素
arr 数组本身
*/
alert(prev + "," + next);
return prev + next;
});
alert(res); //2,3 5,4, 9,5 14,6 20,7 27
7.声明提升
内存分配,一次分配
预编译: 在所有代码运行之前,计算机将代码从头到尾看一遍,将这个程序需要运行的空间一次性分配好
alert(num); //弹出undefined
var num=1;
变量可以声明提升,函数也可以声明提升
声明提升:在当前作用域,声明变量和函数,会直接提升在整个代码的最前面运行
局部作用域,声明提升的是在函数内部
省略var,直接取强制给一个变量赋值,这个比哪里会被JS强制声明为全局变量
【注】不建议,这属于语法错误
function show(){
num=10;
alert(num);//10
}
show();
alert(num);//10
8.二维数组
var arr1=[1,2,3,4];
var arr=[true,100,’hello’,arr1];
alert(arr.length); //4
9.严格模式(写在哪个作用域下,在哪个作用域下生效)
“use strict”;
【注】尽量注意不要严格模式写在全局
- 全局变量声明时,必须加var
- this不能指向全局变量
- 函数内重名属性 (形参不能相同)
- arguments对象,只存储传实参的值,实参改变,arguments值不发生改变
- 新增保留字
implements,interface,let,package,private,protected,public,static ,yield