在学习 js 基本语法的过程中,把遇见的知识点和问题记录写下来,以便未来复习和参考。
数据类型有:数据,字符串,数组,数字,布尔值等。
一、数据类型
1.number
2.布尔值
只有 true 和 false 两种,可以直接用 true 和 false 来表达,比如:
true; //true
false; //false
2>1; //true
2>3; //fasle
与 &&
两者同时为true
,运算结果为true
或 ||
只要有一个为true
,运算结果就是true
非 !
当程序为true
时,运算结果取反为false
var age = 15;
if(age >= 18) {
alert('adult')
}else{
alert('teenager')
}
age 值是 15,当 age 大于且等于 18 的时候浏览器弹出 adult,反之弹出 teenager
3.字符串
4.比较运算符
==
和===
当使用==
进行比较的时候,一般会自动转换类型然后再进行比较
当使用===
进行比较的时候,如果数据类型不一样,直接返回false
,等到类型一致了,然后再进行比较
有一个特殊的number
就是NaN
,它不与任何值相等,包括它自己NaN
NaN === NaN //false
5.null
和undefined
null
表示一个空值,0
表示一个数值,''
表示长度为 0 的字符串,但是null
表示空
undefined
表示未定义
但是区分两者意义不大,大多数还是在用null
,undefined
仅仅在判断函数参数是否传递的情况下有用
6.数组 Array
[ ] ,表示一组按顺序排列的集合,其中的每个值称为元素
new Array(1,2,3) //[1,2,3]
数组的索引
二、对象和变量
var person = {
name: 'jack',
age: 20,
city: 'hangzhou'
}
person
是对象变量,name: 'jack'
这就是一个键值对,name
是属性名,'jack'
是属性
要获取一个对象的属性,用对象变量.属性
,也就是person.name
,结果是jack
person.name //jack
person.age //20
var
是一个动态语言,就算 var 定义了 x = 100,后面又有 x = x+ 100,所以就变成了 200,
var x = 100;
x = x+ 100;
console.log(x) //200
假如用 int 来定义 x,后面的 x = x + 100 就会报错
并且使用 var 定义的变量只会存在与该函数作用域,并不是默认的全局变量
而如果没有使用var
,直接定义i = 100
,变量 i 会被默认为全局变量
三、字符串
需要用到转义字符\
1.模板字符串
var name = '小明';
var age = 20;
var message = name + '今年' + age + '了';
//小明今年20了
var message = `${naem},你今年${20}了`
//ES6新增的语法,一样的结果
字符串不可改变
如果对字符串的某个索引赋值,不会报错,不会发生任何改变
var a = 'hello,world!'
a[0]; //h
a[0] = k;
console.log(a); //结果为'hello,world!',不会发生改变
2.toUpperCase 大写
他会返回一个新的字符串
,把一个字符串全部变成大写
var a = 'hello';
a.toUpperCase(); //返回HELLO
3.toLowerCase 小写
他会返回一个新的字符串
,他会把一个字符串全部变成小写
var a = 'hello'
a.toLowerCase(); //HELLO
4.indexOf
他会返回指定字符串的索引,如果没有找到指定的字符串,则会返回-1
var a = 'hello,world!'
a.indexOf('world'); //6
5.substring
他会返回指定区间索引
的字符串,包括前一个数,不包括后一个数
var a = 'hello,world!'
a.substrng(0, 5); //hello
如果()
里面只有一个数值,则从这个数值的索引开始直到结束,比如:
var a = 'hello,world!';
a.substring(6); //返回world!
四、数组
数组Array
可以包含任何类型的数据,并通过索引来访问每个数据
1.length 属性
Array
的长度可以用length
属性来获取,它和索引不一样,从 1 开始计算
var arr = [1,2,3,'hello',null,true]
arr.length; //返回6
并且通过改变length
的值,可以改变数组的内容大小变化
var arr = [1,2,3,'hello',null,true]
arr.length; //6
arr.length = 8; //[1,2,3,'hello',null,true,undefined,undefined]
arr.length = 2; //[1,2]
2.通过索引改变数组
Array
可以直接通过索引修改对应的元素
var arr = [1,2,3]
arr[1] = 'hello'
console.log(arr); //[1,'hello',3]
js 允许直接通过索引改变数组的长度,不会报错,但是不建议这么做
3.indexOf
Array
可以通过indexOf
来搜索一个指定的元素的索引
var arr = [1,2,3,'hello']
arr.indexOf(1); //0
arr.indexOf(3); //2
4.slice
slice
属性与substring
类似,后者是截取字符串的内容,slice
是截取数组的内容,然后返回一个新的数组
如果有两个数值,包括前面的数值,不包括后面的数值;如果只有一个数值,则从它开始算起一直到结束
var arr = [1,2,3,4,5];
arr.slice[0,2]; //返回[1,2]
arr.slice[2]; //返回[3,4,5]
如果slice
不指定数值,则返回数组的全部内容,可以利用这个特性复制一个相同的数组出来
var arr = [1,2,3];
var arr1 = arr.slice();
console.log(arr1); //[1,2,3]
arr1 === arr; //true
注意:两个数组相比都是 false,就算数组内容一样也会 false
var arr = [1,2,3] var arr1 = [1,2,3] arr === arr1 //false
5.push 和 pop
push()
向数组的末尾添加元素
pop()
把数组的最后一个元素删掉
6.unshifth 和 shift
unshift()
向数组的头部添加元素
shift()
把数组的第一个元素删掉
7.sort
sort()
可以对数组进行排序,会直接修改当前数组的元素位置,直接调用时,会按照默认的方式排序
var arr = [B,A,C]
arr.sort();
arr //[A,B,C]
8.reverse
reverse()
会把整个数组调个个,不是反向排序
var arr = [2,1,3]
arr.reverse();
arr; //[3,1,2]
9.splice
这个属性是万能的方法,通过调用splice()
,可以从指定的索引删除元素或者添加元素
五、条件判断
在 js 中,使用 if() {...} else {...}
进行条件判断
var age = 22;
if(age>20) {
// 如果age>20成立,执行该语句
console.log('22>20')
}else {
// 如果age>20不成立,则执行该语句
conosle.log('22<20')
}
最终,控制台会打印出22>20
,因为条件成立
执行的语句要用
{}
包裹起来,防止其他情况会报错
多条件判断语句
三个或者三个以上多判断语句,被称为多条件判断语句
var a = 10
if(a<10) {
console.log('a<10')
}else if(a>20){
console.log('a>10')
}else{
console.log('10<=a<=20')
}
如果多个条件中都满足,则取第一个满足的结果,执行其代码,之后满足的自动忽略掉,所以在 进行条件判断的时候,不要重复判断情况
一个复杂的多条件判断语句
var height = parseFloat(prompt('请输入身高(m):'));
var weight = parseFloat(prompt('请输入体重(kg):'));
var bmi = weight/(height*height);
if(bmi < 18.5) {
console.log('过轻')
}else if(bmi>18.5,bmi<25) {
console.log('正常')
}else if(bmi>25,bmi<28){
console.log('过重')
}else if(bmi>28,bmi<32){
console.log('肥胖')
}else{
console.log('严重肥胖')
}
parseFloat
可以解析一个字符串,并返回一个数字
六、循环
简单的运算可以手打出来
1 + 2 + 3
// 控制台输出 6
但是几百次,几千次,几万次的运算无法手打,可以依靠循环语句来进行计算,为了让计算机能够进行成千上万次的运算
循环语句有两种 for 和 while,他们有不同的用法,适应不同的情况
1. for 循环
通过初始条件,结束条件和递增条件来循环执行语句块
var x = 0
var i
for(i = 1; i <= 1000; i++) {
x = x + i
}
i = 1 是初始条件,i 从 1 开始算起 i<=是判断条件,满足就执行循环,不满足就退出循环 i++ 是递增条件,每次循环过后都是+1,当无数次后不满足了 i<=1000,会跳出循环
2. 通过 for 语句遍历数组
var arr = ['apple', 'banana', 'oringen']
var x,i
for(i = 0; i <= arr.length; i++) {
x = arr[i]
console.log(x)
}
3. 用 break 终止 for 循环
var x = 0;
for ( ; ; ) { // 将无限循环下去
if (x > 100) {
console.log(x)
break; // 通过if判断来退出循环
}
x ++;
}
4. for…in
可以把一个对象对属性循环遍历出来
var person = {
name: 'jack',
age: 20,
city: 'beijing'
};
for(var i in person) {
console.log(i)
console.log(person[i])
}
var i in person
会把 person 里面所有对属性遍历,然后通过console.log(i)
可以把属性名打印出来,console.log(person[i])
可以把属性值打印出来
如果对一个数组进行这样的操作,就可以把数组元素对索引打印出来,打印结果是字符串
形式
5. while 循环
while
循环适用于忽视判断条件的情况,for
适用于明确了初始条件和结束条件的情况
比如要计算 1-100 之间的寄数和,可以用while
循环
var x = 0
var n = 99
while (n > 0) {
x = x + n
n = n - 2
}
x
在变量内部,n 不断自减,直接 n=-1,不满足判断条件,此时退出循环
6. do…while
do...while
循环是先循环,然后再判断条件,所以不论条件是否满足,do...while
至少循环一次,这是它与for
和while
的区别
比如:
var n = 0
do{
n = n + 1
}while(n > 1)
n; //1
先定义n=0
,然后执行n=n+1
,所以n=1
,再判断条件,当 n>1 的时候执行,不符合,退出循环,控制台输出n
,结果为 1
七、Map 和 Set
1. Map
Map
是一组键值对的结构,具有极快的查找速度
只要我们定义一个属性名和属性值对应的数组,就可以从这个数组里面通过 name 直接查找数据
var m = new Map([['jack', 95], ['Bob', 94], ['linda', 93]])
m.get('jack')
首先,要初始化一个Map
数组
var m = new Map(); //空map
m.set('jack', 95) //添加一个新的键值对 key-value
m.has('jack') //检查是否存在 ' jack'key
m.get('jack') //获取'jack'对应的数据 value
m.delete('jack') //删除'jack'键值对 key-value
m.get('jack') //undefined
一个 key 只能对应一个 value,所以如果重复赋值的话,后面的数据会把前面的数据覆盖掉
var m = new Map();
m.set('Adam', 67);
m.set('Adam', 88);
m.get('Adam'); // 88
2. Set
set
中值储存key
,不储存value
,而且在set
中,key
不能重复,如果重复了,会自动忽略掉重复
首先,创建一个空的set
var m = new Set() //空set
m.add(1) //添加一个key
m.delete(1) //删除一个key
m //控制台输入[ ]空数组,没有数据