由字母,数字,下划线,美元符号组成.
严格区别大小写
不能以数字开头
不能以关键字和保留字命名
变量名必须有意义(使用英文单词)
两个单词之间不能有空格,并遵守驼峰命名法
number 数字型 (包含整数和小数 默认值0)
String 字符串类型
Boolean 布尔值类型 默认false
undefined 未定义数据类型
null 空值
isNaN(12) 判断非数字
字符类型的转换
转换为字符串类型
转换为字符串类型
转换为数字类型
转换为布尔型
字面量
字面量是在源代码中一个固定值的表示法,通俗来说,就是字面量表示如何表达这个值。
简单来说就一眼看过去就知道这个数据是什么类型的字面量
(先乘除后加减,有小括号先算小括号里的)
加(+)
减(-)
乘(*) 次方(**)
除(/)
取余(%)
浮点数(小数)进行算术计算时精确度远远不如整数,尽量避免用浮点数计算
同理,不能拿浮点数来进行比较 是否相等
表达式:由数字,运算符,变量等组成的式子 称为表达式
返回值:表达式计算后,返回的结果 称为返回值
必须和变量配合使用
前置运算符:++nub --nub 后置运算符: nub++ nub-- 让变量的值+1或者-1.
前置递增和后置递增单独使用时,运行效果相同.
前置:先自加,后运算
后置:先返回原值,后自加.
var nub= 10; nub++; 运算之后,nub++=10; nub=11;
小于号 <
大于号 >
大于等于号 >=
小于等于号 <=
判等号(会转型) ==
不等号 !=
全等号或者全不等 === !==
&& 逻辑与 简称与 and
|| 逻辑或 简称或 or
! 逻辑非,简称非 not
逻辑与短路运算(逻辑中断)
逻辑或短路运算(逻辑中断)
如果第一个表达式的值为假,则返回表达式2
= 直接赋值 var age =10; //10
+= -= 左边加减一个右边的值 var age= 10; age+=5; //15
*= /= %= 乘 除 取模 右边的值 var age=10; age/=5; //2
流程控制就是来控制我们的代码按照什么结构顺序来执行
if (条件表达式1) {语句1}
else if (条件表达式2) {语句2}
else if (条件表达式3) {语句3}
else {最后的语句}
和if else 类似,但是只有一个表达式,且表达式的值一般会是特定的值或一个固定的值.
switch(表达式) {
case value1:执行语句1;break;
case value2:执行语句2;break; ....
default:最后执行的语句;
}
表达式的值和哪个case 后面的值匹配 就会执行哪段代码,都不匹配则会执行最后一个.同样是只能执行一个.
表达式和值要全等 才能执行 值和数据类型一致!
case(小例子) break(退出)
for(var i = 0;i < 3 ;i++) {
console.log('hellow')
}
//会打印输出3次hellow
语法: for (初始化变量; 条件表达式; 操作表达式) {循环体}
for (var nub = 1; nub<=100; nub++) { 执行的代码 }
可以利用nub += 1和字符串的方式让循环体拼接在一行.
语法 do { //循环体} while (条件表达式)
和while 基本一直,但是do while 无论 是否达成条件,都会先执行一次循环体.
continue; 退出本次循环(当前次的循环) 继续执行其他循环;
可以利用if (条件表达式) 删除一些不想要的循环;
str = '';
for (i=1;i<10;i++) {
for (var j = 1;j<=i;j++){
str += j + 'x' + i + '=' + i * j+ '\t';
}
str+='\n';
}
console.log(str)
- 数组就是一串数据的集合,里面的数据称为数组元素
- 数组元素之间用逗号隔开, 数组元素的数据类型没有限制.
- 声明数组并赋值称为数组初始化.
表示某个数组元素在数组中的排列序号
用来提取数组里的某一个元素
提取数组元素 语法:数组名[索引号];
利用for循环将数组里的元素 按顺序全部访问一次
因为数组元素第一个是从0开始的,所以 i要等于0 , 输出的时候输出第 i 个
var arr = [1,2,3]
for (var i = 0;i < arr.length; i++) {
console.log(arr[i]) //分别输出1 2 3
}
//数组翻转原生写法
function overturn(arr){
var temp = 0;
var num = arr.length-1;
for (var i = 0; i < arr.length / 2 ; i++) {
temp = arr[i];
arr[i]=arr[num];
arr[num] =temp;
num--;
}
console.log(arr)
}
overturn([1,2,3,4,5,6])
var arr = [1,8,3,5,2,9,6]
var temp = 0;
for (var i = 0;i<arr.length;i++){
for(var j = 0;j<arr.length-i -1;j++) {
if (arr[j]<arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
console.log(arr)
语法:function 函数名(形参1,形参2… ) {函数体}
函数名(实参1,实参2…)
函数的形参实参个数不匹配时
实参个数多于形参个数 : 值取到形参的个数,多的实参传递无效
实参个数少于形参个数 : 多余的形参取不到值会定义为undefined 和数字运算会变为NaN
function 函数名(形参1,形参2… ) { return 返回的值 ; }
函数只是实现某种功能,最终的结果需要返回给函数的调用者(实参)才合理, 通过return实现的
只要函数遇到return 就把后面的结果返回给实参.
通常用一个变量来接收 函数的返回结果(实参) 使用更简单.
var 变量名 = 函数名(返回结果);
return终止函数只能返回一个值!
如果函数没有return , 返回的是undefined。
根据作用域的不同,分为全局变量和局部变量
全局变量:只有浏览器关闭的时候才会销毁,比较占内存
局部变量:当程序执行完毕就会销毁,比较节约内存资源
变量预解析(变量提升) 就是把变量的声明提升到当前作用域的最前面先执行
console.log(num);
var num = 10;
相当于:
var num;
console.log(num);
num=10;
//还没赋值就打印了 所以num结果为undefined
函数预解析(函数提升) 就是把函数的声明提升到当前作用域的最前面先执行(不调用)
fun();
var fun = function() {
console.log(22);
}
相当于:
var fun;
fun(); //fun()上面没有 变量fun
fun = function() {
console.log(22);
}
//所以会报错
//函数表达式的调用一定要放在函数表达式的下面
语法 var 对象名 = {}; 创建一个空的对象.
var 对象名 = {属性1:值, 属性2:值, 属性3:值, 属性4:值, 方法名: function () {函数体} }
调用对象的属性
调用对象的方法 : 对象名.方法名() 如:obj.fn()
语法 : var obj = new Object(); 创建了一个空的对象.
对象名.属性1= 值 ; 对象名.属性2= 值 ;
对象名.方法名 = function () {函数体} ;
function Star(uname,age,sex) {
this.name = uname;
this.age = age;
this.sex = sex;
this.sing = function(sang) {
console.log(sang);
}
}
var ldh = new Star('刘德华',18,'男'); //声明一个变量保存了返回的对象类型相当于 声明了一个对象名
console.log(ldh.name)
console.log(ldh['sex'])
ldh.sing('冰雨') //调用对象里的sing函数 将实参传给形参sang 函数执行形参的内容
var zxy = new Star('张学友',20,'男');
语法: for (var 变量 in 对象) { }
我们习惯用k或者key表示这个变量名
循环次数为属性和方法数量的和
for(var k in Obj) {
console.log(k); //变量 输出 得到的是属性名
console.log(Obj[k]); //对象[变量]输出 得到的是属性值
}
Math.max(1,20,5) 最大值
Math.min() 最小值
Math.abs() 绝对值
Math.floor() 向下取整
Math.ceil() 向上取整
Math.round() 四舍五入
Math.random() 随机数
function getRandom(min,max) {
return Math.floor(Math.random() * (max - min + 1)) +min;
}
getRandom(1,10)
var random = getRandom(1,10);
//随机max到min 之间的一个整数 并且包含这两个整数
date.getFullYear() 返回当前日期的年
date.getMonth()+1 返回(0-11) 返回的月份小1个月 记得+1
date.getDate() 返回的是几号
date.getDay() 返回(0-6) 返回的是星期几 0是周日
date.getHours() 返回时
date.getMinutes() 返回分
date.getSeconds() 返回秒
获取Date总的毫秒数(时间戳)
// d = parseInt(总秒数/ 60/60 /24); // 计算天数
// h = parseInt(总秒数/ 60/60 %24) // 计算小时
// m = parseInt(总秒数 /60 %60 ); // 计算分数
// s = parseInt(总秒数%60); // 计算当前秒数
function countDown(time) {
var nowTime = +new Date(); // 返回的是当前时间总的毫秒数
var inputTime = +new Date(time); // 返回的是用户输入时间总的毫秒数
var times = (inputTime - nowTime) / 1000; // times是剩余时间总的秒数
var d = parseInt(times / 60 / 60 / 24); // 天
d = d < 10 ? '0' + d : d;
var h = parseInt(times / 60 / 60 % 24); //时
h = h < 10 ? '0' + h : h;
var m = parseInt(times / 60 % 60); // 分
m = m < 10 ? '0' + m : m;
var s = parseInt(times % 60); // 当前的秒
s = s < 10 ? '0' + s : s;
return d + '天' + h + '时' + m + '分' + s + '秒';
}
console.log(countDown('2019-5-1 18:00:00'));
var date = new Date();
console.log(date);
new Array(2) 参数为数字型
new Array(2 , 3) 参数用逗号隔开了
检测是否为数组
翻转数组 arr.reverse();
冒泡排序 arr.sort()
只能排序个位数的 两位数以上会按数字的第一位数排序,解决方案:
数组名.sort(function(a,b){return a - b}? 升序排列(从小到大)
数组名.sort(function(a,b){return b - a}? 降序排列(从大到小)
数组转换为字符串 arr.toString()
数组名.join(分隔符) 返回一个字符串
var arr = [1,2,3]
var str = arr.join('&')
console.log(str) // 1&2&3
var arr = [1,5,1,6,5,3]
var newArr=[];
for (var i = 0;i<arr.length;i++) {
//如果新数组没有旧数组当前循环的元素返回值就是-1 将这个数组元素添加到新数组中
newArr.indexOf(arr[i]) == -1 && newArr.push(arr[i]);
}
console.log(newArr)
因为字符串的不可变 所以不要大量的拼接和重新赋值字符串,字符串的值虽然改变了,但只是地址改变了,原先的值还占着内存空间
字符串方法
求某个字符出现的次数和位置
var str ='ofafobeodsaodsi';
var index = str.indexOf('o');
var num = 0;
while (index != -1 ) {
console.log(index);
index = str.indexOf('o', index + 1);
num++
}
console.log(num);
根据位置返回字符
统计出现次数最多的字符
var str = 'sdadasdtfdgdadvadwq';
var o = {}; //先创建一个空对象
for (i=0;i<=str.length;i++) { //利用for循环遍历字符串
var j = str.charAt(i); //声明一个变量j等于此次循环遍历的str字符
if(o[j]) { //用if判断空对象o[j] 有没有这个属性,没有
o[j]++; //的话, o[j]=1 相当于创建了一个属性j=1;
} else { //如果有的话这个属性的值++;
o[j] = 1;
}
}
console.log(o); //这样就可以得到每个字符串出现的次数
var max = 0; //声明一个最大值 max = 0
var str1= '' ;
for(k in o) { //遍历对象
if (o[k] > max) { //当遍历的这个属性的值 >=max的时候
max = o[k]; //就用max 保存这个值
str1 = k; //因为k不能再外面使用,需要用一个空字符保存
}
}
console.log(str1); //输出出现次数最多的次数的字符
console.log(max); //输出出现次数最多的次数
字符串的操作方式
var arr =["c", "a", "z", "a", "x", "a"];
var obj = {};
for (var i = 0; i < arr.length;i++) {
var index = arr[i];
// if (obj[index]) { //判断函数是否有这个属性
// obj[index]++; //如果有的话 值+1;
// } else {
// obj[index] = 1; //如果函数里面没有这个属性 则创建一个并赋值为1
// }
obj[index] ? obj[index]++ : obj[index] = 1;
}
console.log(obj);