javascript 基础

143 阅读8分钟
//1. 变量:可以变化的量,存储数据
//定义变量: 变量的声明:var num; 变量的赋值:num = 11; var num = 11;
//命名规则:
//1. 字母、数字、下划线、$组成,数字不能开头
//2. 区分大小写
//3. 不能是关键字和保留字
//2. 数据类型
//简单数据类型:number string boolean null undefined
//复杂数据类型: Object Array Math Date 基本包装类型: String Number Boolean function
//怎么判断一个变量的数据类型:typeof
//3. 类型转换
//转换成字符串: String() toString() +""
//转换成数值类型:Number() parseInt() parseFloat() +str; str ‐ 0
//转换成布尔类型:Boolean() !!num
//4. 运算符
() 优先级最高
//算术运算符: + ‐ * / % 一元运算符 前置++i 后置i++ 前置--i 后置++i
var a = 1; var b = ++a + ++a; console.log(b); ++a值为 2 ++a值为3 相加等于5
var a = 1; var b = a++ + ++a; console.log(b); a++ 值为1 ++a 值为3 相加为4
a++后置加加不会再当前行立即执行+1 a的值会在这一行过后+1
var a = 1; var b = a++ + a++; console.log(b); 3
var a = 1; var b = ++a + a++; console.log(b); 4 a++会在下一行执行
总结:前置递增或者递减操作符的执行顺序是在该值在被求值之前就执行+1或者-1的操作,而后置递增或者递减操作符是在该值被求值之后才执行+1或者-1的操作。
关系运算符 > >= < <=
相等运算符 == != === !==
//逻辑运算符:&& || !
//5. 语句
//顺序结构
//分支结构
// if..else if elseif
switch (expression) {
case 常量1:
语句;
break;
default:
语句;
break;
}
break:立即跳出整个循环,continue:立即跳过当前循环

三元运算符 表达式1 ? 表达式2 : 表达式3

//循环结构
在javascript中,循环语句有四种,while、do..while、for、for..in循环。
// while do..while for for..in
// break; 立即跳出整个循环(跳出大括号)continue;跳出当前循环
//6. 数组
//创建数组:字母量 var arr = []; 构造函数方式 var arr = new Array();
//下标(索引) 从0开始
//长度: length 最大下标 = length ‐ 1
//存值和取值: arr[下标]
//数组的遍历:
//7. 函数
// 定义一个函数
// 函数声明 function fn(){}
// 函数表达式 var fn = function(){}
// 调用函数 函数名()
//函数的参数: 形参和实参
//函数的返回值 arguments
//匿名函数
(function () {
alert(123);
})();
//自调用函数
//回调函数
//递归函数
一个典型阶乘递归函数:
function fact(num){
if (num<=1){
return 1;
}else{
return num*fact(num-1);
}
}
// 用递归求斐波那契额数列中第n个数的值
// 1 1 2 3 5 8 13 21 34......
//n 代表的是传进来的第几个数
function fn(n){
if(n==1 || n==2){
return 1;
}
return fn(n-1) + fn(n-2);
}
var result = fn(9);
//8. 对象
// 定义对象 1.对象字面量 var obj = {}
2. Object构造函数创建 var obj = new Object()
var person = new Object();
person.name = 'lisi';
person.sayHi = function(){
}
3.自定义构造函数
1.没有return语句2.函数首字母为大写3.使用new创建对象3.直接将方法和属性赋值到this对象上
能够识别对象(这正是构造函数胜于工厂函数的地方)
function Person(name,age,job){
this.name=name;
this.age=age;
this.sayHi=function(){
}
}
实例化对象 var p =new Person('张三',14‘,’actor‘)
A instanceof b instanceof方法可以判断b是否是A的实例化对象
3.工厂函数
function createJPerson(name,age,job){
var person=new Object();
person.name=name;
person.aga=age;
person.job=job
person.sayHi=function(){
}
return Person
}
var p=createPerson(’张三‘,22,’actor‘)
4.构造函数+原型模式
function Blog(name,url,firend){
this.name=name
this.url=url
this.firend=firend
}
Blog.prototype.alertInfo=function(){
}
// 构造函数 总与new一起使用创建对象的语句中
// 对象的操作:
// .语法
// []语法
// 对象的遍历:for..in for(var key in obj)
//9. 内置对象
// Date 对象
// var date = new Date(); 获取距1970年1月1日(世界标准时间)起的毫秒数
date.valueOf() 获取距1970年1月1日(世界标准时间)起的毫秒数
// date.getFullYear(); 年 var year = now.getFullYear(),
// date.getMonth() + 1; 月
// date.getDate(); 日
// date.getDay(); 星期
// date.getHours(); 时
// date.getMinutes(); 分
// date.getSeconds(); 秒

// Math对象不是构造函数
// Math.random() 随机数 0<=random<1
// Math.ceil() 向上取整
// Math.floor(); 向下取整
// Math.max(); 最大值 Math.max(10, 20);
可以 获取一组数值中的最大值和最小值,但是参数不能接受数组,可以写一个函数遍历之类的,有2个快捷方式,可以接受数组类型的参数
1.Math.min.apply(null,arr)
2.Math.min(...[2,38,1])es6解构
// Math.min(); 最小值
// Math.abs() 绝对值
Math.round()四舍五入
求最大值
Math.max.apply(null,arr)

// String对象
// new String(); 创建字符串对象 var str=new String
str.length 获取字符窜个数
// charAt(索引); 获取指定位置的字符
查找指定字符串
// indexOf('字符',开始处/N); 获取指定字符的第一次出现的位置,如果没有返回-1
"abcoefoxyozzopp"查找字符串中所有o出现的位置
var s = 'abcoefoxyozzopp';
var array = [];
do {
var index = s.indexOf('o', index + 1);
if (index != -1) {
array.push(index);
}
} while (index > -1);
console.log(array);
lastIndexOf:从后面开始查找第一次出现的位置。如果没有,返回-1
// trim(); 去空格
// toUpperCase(); 转大写
// toLowerCase(); 转小写
// 字符串1.concat(字符串2); 拼接
// slice(开始,结束/N); ★截取 返回一个新的字符串
substr : 从start开始,截取length个字符。(推荐)
// split(以此字符切割); 切割成数组,原字符串不变 var arr = str.split(",");
// replace(被换,换); 替换
//match(正则) 在字符串内检索指定的值,或找到一个或多个正则表达式的匹配,返回一个数组

// Array对象
// isArray 判断是否数组,是返回true
// join(字符); 数组成字符串 arr.join(),不传默认逗号拼接
arr.toString()把数组转换字符窜,逗号分开每一项
// push(); 增加‐后 arr.push(参数);
// unshift(); 增加‐前
// pop(); 删除‐后
// shift(); 删除‐前
// reverse(N); 翻转 array.reverse();
// sort(funtion(a,b){ return a‐b} )正 排序 return b-a 倒排序
// concat(); 合并,不影响原来数组,返回新数组 var newArray=arr1.concat(arr2)
// slice(开始,结束/N); ★截取 包含头不包含尾 arr.slice(0,3) 返回新数组
arr.slice(-1) 截取最后一个
arr.slice(1)截取从索引为1到最后一个
arr.slice(1,-1)截取从索引为1到倒数第2个

// splice(开始,个数); 截取 可以替换原数组内容,原数组被改变
以新元素来替换旧元素,以此来修改数组的内容,返回被替换的内容,原数组被改变
start:开始位置 deleteCount:删除的个数 items:替换的内容
array.splice(start, deleteCount, [items[,items...]);
var arr = [1,2,3,4,5]
var newArray = arr.splice(0,3,"a","b","c","d")
console.log(newArray)//[1, 2, 3]
console.log(arr)// ["a", "b", "c", "d", 4, 5]
// indexOf(值,开始/N); 查找‐前 找不到时为‐1(查找第一次出现的位置)
// lastIndexOf(值,开始/N); 查找‐后
// forEach(function(ele,i,arr){}); 遍历数组,没有返回值
// 数组.map(function(v,i)){ ..... return... }) 遍历并处理数组(返回新数组)
数组中的每个元素都调用一次提供的函数,将调用的后的结果存放到一个新数组里并返回。
some() 方法测试数组中的某些元素是否通过由提供的函数实现的测试.只要有一个符合就返回true
filter()符合条件的返回true,表示保留该元素,不符合的返回false,则不保留
every() 方法测试数组的所有元素是否都通过了指定函数的测试,所有的元素都符合条件,就返回true
// 数组.filter(function(v,i){}) 过滤 (返回布尔值) 符合规则的元素会被存放到新数组里
// 数组.reduce(function(first,last){.... return...},init) 对数组遍历并调用回调函数(返回值为积// 箭头函数 var arr = function(a,b,c){函数体}
简化 (a,b,c)=>{函数体}
一个参数(return必须省略) a=>函数体
清空数组 1.var arr=[] 2.arr.length=0 3.arr.splice(0,arr.length)
9.转移符

10.数据类型转换
转换成字符串类型
1.toString() 2.String()强制转换 ,有些值没有toString,这个时候可以用String,例如null和undefine 3.拼接字符窜
转换为数值类型
1.Number() 2.parseInt()把字符窜转换为整数3.parseFloat()把字符串转换为浮点数
把字符串转换成数字并保留2位小数 parseFloat(s).toFixed(2)
+ ,-等运算
var str = '500';
console.log(+str); // 500
console.log(-str); // -500
console.log(str - 0);
转换为布尔类型
Boolean()强制转换 0 "" null undefine NaN会转换为false,其他的都会转换为true
!运算符 !"123" false
11.作用域
不用var声明的变量可能是隐式全局变量,不推荐使用
词法作用域
变量的作用域在定义时就决定了,而不是执行时决定的

在js中词法作用域规则
函数允许访问函数外的数据
整个代码结构中只有函数可以限定作用域
作用域规则首先使用提升规则分析
如果当前作用域中有名字了,就不考虑外面的名字

作用域链 函数内指向函数外的链式结构
预解析
  1. 把声明的变量提升到当前作用域的最前面,只会提升声明,不会提升赋值。
  2. 把声明的函数提升到当前作用域的最前面,只会提升声明,不会提升调用。
  3. 先提升function,在提升var
  4. 如果在同一个作用域中申明的变量和申明的函数重名,那么函数的优先级更高