在学习 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.nullundefined

null表示一个空值,0表示一个数值,''表示长度为 0 的字符串,但是null表示空

undefined表示未定义

但是区分两者意义不大,大多数还是在用nullundefined仅仅在判断函数参数是否传递的情况下有用

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至少循环一次,这是它与forwhile的区别

比如:

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	 							//控制台输入[ ]空数组,没有数据