JavaScript 基础

一、数据类型

字符串

定义

用 ' ' / " "包起来的内容,就称为字符串

字符串的对象方法

var str = "hello"

1. concat() // 字符串的拼接 (数组中也有改方法,且用法相同,处理的数据类型不同)
var str1 = " word"
str.concat(str1)
// 返回拼接后的字符串

2. replace() // 替换匹配内容
str.replace("h","1") 
// 返回替换后的新字符串 || 无匹配项,返回原字符串

3. toLocalUpCase() & toLocalLowerCase() // 原字符串转大小写
str.toLocaleUpperCase()
// 返回转大写后的新字符串

str.toLocaleLowerCase()
// 返回转小写后的新字符串

4. charAt(下标数) // 获取对应参数下标的字符 (伪数组特性)
str.charAt() // 不传默认返回(第一位)
str.charAt(4) 
// 返回下标数对应的字符 || 默认返回第一位 || 无匹配下标返回空字符串  

5. charCodeAt(下标数) // 获取对应参数下标的ascall码
str.charCodeAt(3)
// 返回下标数对应的ascll码 || 默认返回第一位的ascll码 || 无匹配下标返回NaN

6. indexOf('e') // 获取对应字符的下标
str.indexOf('e') 
// 返回对应字符在字符串中的下标 || 不存在则返回-1
// 应用: 判断字符 是否存在

7. split(",") // 按参数对字符串进行切割后,转为数组
str.split(",")
// 返回按匹配参数切割后的元素组成的数组 || 无匹配项直接整体作为单个元素返回数组 || ""空字符串切割按单个字符作为元素返回数组
// 作为开头和结尾,会单独形成一个""空字符串元素

数值

定义

可以用来做算术运算的数字

布尔值

定义

true / false

undefined

定义

null

定义

数组

定义

用来存储数据的集合

声明方式

1、
var arr = new Array()
2、
var arr = new Array(1,2,4,5,68)
3、
var arr = [1,4,5,6,"a"]

检测数组的方法

1、
Array.isArray([1,3,5,6])
2、关键字
[1,3,5,5] instanceof Array
3、
Object.prototype.toString.call([1,3,5,5])

数组的长度

[1,3,45,6].length

特殊:
	动态改变
	arr[arr.length] = 4  //相当于下面的语句
	arr.push(4)

案例

1、数组去重
2、冒泡排序
3、斐波那契数列

数组的对象方法

var arr = [1,4,6,72,634,4]

1. push() // 末尾添加一个元素
var res = arr.push(6) // [1,4,6,72,634,4,6]
// 返回新数组的 长度 

2. pop() // 末尾删除一个元素
arr.pop() // [1,4,6,72,634,4]
// 返回被删除的 元素

3. unshift() // 最开始的位置添加一个元素
arr.unshift(3)
// 返回新数组的 长度

4. shift() // 从开始位置删除一个元素
arr.shift()
// 返回被删除的元素

5. concat() // 数组的拼接
var arr2 = [4,5,6]
arr.concat(arr2)
// 返回两个数组拼接后的 新数组

6. join() // 通过参数将数组中的元素拼接成字符串
arr.join('-')
// 返回用-链接各个元素的字符串

7. reverse() // 数组的反转
arr.reverse()
// 返回将元素反转后的数组

8. slice(开始位置,结束位置) // 截取数组
arr.slice(1,3) // 结束位置取不到值
// 返回截取后的数组

9. splice(开始位置,取几个,替换值1,替换值2) // 删除/替换(可多个)/插入
arr.splice(3,2,5,6,7) // 替换:从下标3开始, 取2位, 将5,6,7三个元素添加进去
arr.splice(3,0,5) // 插入:参数2,取0,代表不删除, 将5,插入到第3位
arr.splice(1,3) // 删除:从下标1开始, 取3个
// 返回值为被截取的元素

10. sort() // 排序
function mode(a,b){
    return a - b // 从小到大
}
arr.sort(mode)

function mode(a,b){
    return b - a // 从大到小
}
arr.sort(mode)
// 返回排序后的数组

函数

定义

就是把一些重复性的功能,打包起来,然后哪里需要使用,就调用

调用

// 定义一个函数
function fun(msg){
	console.log("请重复调用我,我叫"+msg)
}

// 调用
fun("乌龟")

函数实例化

// 实例化: 将功能实现的代码
// 函数实例化: 将功能实现的代码封装起来,重复使用

function add(num1,num2){
    return num1 + num2
}

let res = add(3,4) //7

函数的检测

1. instanceof 
    let arr = [];
	let res = arr instanceof Array //true
    
2. Object.prototype.toString.call()
	let arr = [];
	let res = Object.prototype.toString.call(arr) //true

函数的返回值

//1. 函数 没有return 返回 undefined
function getNum(num){
    
    //2. return 后面如果没有接语句,返回 undefined
    return num
    
    //3. return 下面的代码不会执行
}

let res = getNum(5) //5

匿名函数

function(){
    console.log("我是一个没有名字的函数")
}

// 那要调用匿名函数怎么办?
// 用两个括号 ()()  => (函数)()

(function(){
    console.log("我是一个没有名字的函数")
})()

// 匿名函数的调用,也是自执行函数

函数内部调用函数

function fun1(num){
    return num
}
function fun2(num){
    fun1(num)
    return num
}

var res = fun2(5) // res == 5

arguments

1. 作为实参的伪数组
function sum(a,b,c){
    console.log(arguments) //伪数组: 有下标,有长度,没方法
}

var num1 = 10,num2 = 20,num3 = 30;
sum(num1,num2,num3); // arguments的长度为3  元素分别是 10,20,30
sum(num1,num2,num3); // 长度为2  元素分别是 10,20,undefined

2.用来实现函数的重载
// 重载: 用相同的函数名,完成功能相似的方法  在c/c++ 中是用来处理值类型不同,但功能相同的方法
function sum(a,b,c){
    if(arguments.length == 2){
        return a + b
    }else{
        return a + b + c
    }
}
sum(1,2) // 3
sum(1,2,3) // 6

作用域切割 & 作用域链

!!! 只有函数可以切割作用域
<script>
   // 全局作用域
    // 全局变量
    var num = 2
    var test = 4
    
    function (){
        // 局部作用域
          // 局部变量
          var num = 3
          var personal = 5
          // 作用域链规则 : 当前作用域内未定义,会到更高层去找
          console.log(test) // 4; 可以拿到全局的变量
        time = 3
    }
    
    console.log(personal) // 报错,拿不到局部的变量
    console.log(time) // 3; 不规则声明,即没有var, 局部变量会提升为全局变量,可以拿到,打印3
</script>

函数参数问题

// 简单数据类型, 形参 无法影响 实参
function fn(a){
	a = 1 
}

var a = 2
fn(a)
console.log(a) //2; 简单数据类型,为值引用; 形参的修改不用影响实参



// 复杂数据类型, 可以通过形参, 修改内部元素
function fn(a){
	a[2] = 7 
    a = 3
    console.log(a) // 3,会改变形参a, 为3
}

var a = [1,2,4]
fn(a)
console.log(a) // [1,2,7]; 复杂数据类型,为地址引用; 可以被修改内部元素, 但是不会被重新赋值

对象

定义

万物皆对象

创建

var pingguo = new Object()

添加 属性和方法

// 点语法
pingguo.name = "pingguo";
pingguo.price = 12
pingguo.go = function(){
    console.log('我会从树上掉下来')
}

获取 属性和方法

// 点语法
pingguo.name // "pingguo"
pingguo.price // 12
pingguo.go() // 控制台打印输出: '我会从树上掉下来'

this

// 谁调用, this 就指向谁

function getName(){
    console.log("我的名字叫"+this.name+"我的年龄是"+this.age)
}

var pig = new Object()
pig.name = "page"
pig.age = 3
pig.produce = getName

pig.produce() //我的名字叫page我的年龄是3

工厂模式创建对象

function getName(){
    console.log("我的名字叫"+this.name+"我的年龄是"+this.age)
}

function create(name,age){
    var obj = new Object()
    obj.name = name
    obj.age = age
    obj.produce = getName
    return obj
}

var pig = create("page",12)
console.log(pig.name)	// page
console.log(pig.age)	// 12
pig.produce()	// 我的名字叫page我的年龄是12

new 关键字创建

//使用new关键字,自定义构造函数
//new 到底做了什么事情

//1.先自己创建一个空的对象
//2.把this指向这个对象
//3.把参数赋值给这个对象
//4.将这个对象返回出去

function getStu(name,age) {
    this.name = name;
    this.age = age;
    this.sayHi = function () {
        console.log(this.name+this.age);
    };
    //为什么没有return,原因是new已经帮我们做了这件事情
}

var pig = new getStu('pig',14)

/**
var pig = new getStu('pig',14) 该表达式执行过程如下

理解性,翻译:
var new = new Object()
new.name = name
new.age = age
new.sayHi = function () {
        console.log(new.name+new.age);
    };
return new 
*/

//1. 创建一个新对象
//2. 将所有的this都替换成了这个新对象
//3. 将参数赋值给新对象
//4. 将新对象返回回去

对象的检测

Object.prototype.toString.call(被检测的对象) // 返回值: 会返回类型 [object Object]

var pig = new Object()

Object.prototype.toString.call(pig) // [object Object]

对象的声明方式

1. 内置构造函数声明法
var pig = new Object()

2. 工厂模式
function create(name,age){
    var obj = new Object()
    obj.name = name
    obj.age = age
    return oj
}
var pig = create("page",12)

3. new关键字
function create(name,age){
    obj.name = name
    obj.age = age
}
var pig = new create("page",12)

4. 内置构造函数中,直接初始化
var ll = new Object(
    {
        name:"蕾蕾",
        age:80,
        sayHi:function () {
            console.log(this.name);
        }
    }
)

5. 字面量法
var man = {
    name:"梁朝伟",
    age:17,
    sayHi:function () {
        console.log("你好啊,要不要,做我男朋友啊");
    }
}

操作对象属性的方法

1. 点语法
pig.name = "PGone"
pig.age = 34

2. 利用 关键字
pig[name] = "xiaozhuzhu"
pig[age] = 12

遍历对象的方法

for (var key in Obj) {
    // 对象中每个键值对的打印
    console.log(key) // 打印键
    console.log(obj.key) // 打印值
    console.log(key +":"+ obj.key) // 打印键值对
}

变量中可以有对象

 //一个对象中,拥有另外一个对象:一个人,拥有一只狗
var xy = {
    name:"熊熊",
    age:46,
    sayHi:function () {
        console.log("大家好");
    },
    dog:{
        name:"狗子",
        age:8,
        color:"绿毛",
        shout:function () {
            console.log("喵喵喵");
        }
    }
}

删除对象的属性

var xy = {
    name:"熊熊",
    age:46,
    sayHi:function () {
        console.log("大家好");
    },
}

delete xy.name 

数据类型的检测

typeof(被检测的数据)

二、变量

变量声明

var num

变量赋值

num = 2

变量初始化(声明 & 赋值)

var num = 2

三、算术运算符

  • 的两种情况

字符串 + 连接符

拼接字符串

数字 + 运算符

计算数值

  • 求差
  • 求积

/ 求商

% 求模(取余数)

算术表达式

用算术运算符连接的式子

var num = 3 + 4

算术优先级

先算 乘除求模,再算 加减,有 小括号先算小括号

四、关系运算符 & 关系表达式

关系运算符

< > == === >= <=

关系表达式

关系表达式,是有结果的

var res = a > b

== 与 !=

常用作 if 判断,注意与 = 区分

== 与 ===

== 判断内容

var a = "1"
var num = 1
a == num // true

=== 判断内容 & 判断类型

var a = "1"
var num = 1
a !== num // true

五、逻辑运算符

逻辑运算符

逻辑与 and &&

逻辑或 or ||

逻辑非 not !

逻辑表达式

a	&&	b	有假便是假	找假
a	||	b	有真便是真	找真
!a	取反
!b	取反

逻辑运算符的优先级

! > && > ||

短路运算

先进行逻辑运算,结果为真 => 赋值

			结果为假 => undefined

var res1 = a && b	有假便是假	a不管是真假,都会判断b	逻辑:假 => undefined	过滤a
var res1 = a || b	有便是真	a为真赋值a,a为假判断b	  逻辑:假 => undefined	  兼容

六、赋值运算符

+= -= *= /= %= 一种简写方法

num += b 相当于 num = num + b

七、Math对象方法

次方 pow

Math.pow(2,3) 2的3次方

四舍五入

Math.round(54.1) 54

Math.round(29.7) 30

注意与 random 随机数区分!

求绝对值

Math.abs(-49) 49

多个数的最大值与最小值

Math.max(13,12,99,0,8 ) 99

Math.min(13,12,99,0,8) 0

天花板函数

Math.ceil(24.26) 25 向上取整

地板函数

Math.floor(203.8) 203 向下取整

随机数

Math.random() 随机生成0-1之间的数

Math.floor(Math.random()) 随机生成0-100的数

八、自增 / 自减

相同点:	都是 +1


区别:
num++	先参与运算,再自己+1
	
++num	自己先+1,再参与运算

九、逗号表达式

(表达式1,表达式2,表达式3.....) 结果永远为最后一个表达式的结果

!注意,前面的表达式都是会执行的
var num1 = 10, num2 = 20;
var res = (++num1,num2++,num1 + num2);
console.log(res); // 32

十、三元表达式

var res = (判断?真的值:假的值)

var res = 5>3 ? "火腿" : 45

十一、数据类型转换

转换方式

显示转换 & 隐式转换

转字符串

str.toString()

var num = 13
var numStr = num.toString()
numStr == "13" //true

String(str)

var num = null
var numStr = String(null)
numStr === "null" //true

转数值

Number(str)

var str = "25"
var num = Number(str)
num === 25 //true

+str

var str = "25"
var num = +str
num === 25 //true

str*1

var str = "25"
var num = str * 1
num === 25 //true

转布尔值

Boolean(str)

var str = "25"
var bool = Boolean(str)
bool === true //true

!str

var str = "25"
var bool = !!"25"
bool === true //true

十二、表达式

最后能得出值的式子

可以放在任何需要值的地方
一元表达式

a = 3

二元表达式

a + b

三元表达式

a ? b : c

十三、语句

可以看作是一种行为

声明语句:
var a
赋值语句:
a = 4
判断语句:
if
循环语句:
for
注释语句:
//

十四、程序的三种基本结构

顺序结构

由上到下执行代码(浏览器默认)

分支结构

根据不同情况做事情

if语句

if(){}else{}
   
if(){事件1}else if{事件2}else{事件3}

三元表达式

a? b : c
判断a => true/fasle
true: b
false: c

switch语句

switch (expression) {//表达式得值
	case "小": //值匹配判断
        执行代码
	case "大":
        执行代码
    default:	//否则执行
        执行代码
        break	//结束循环(必须有)
}

循环结构

重复做同一件事情

for(var i = 1; i < 10; i++){
 	循环体   
	continue // 退出当次
    break	//	退出整个循环
}

while(判断语句){
      循环体
}

do{
   先执行一次
}while(判断语句,是否继续执行)

退出循环

break:
	破坏,完全退出,不再执行循环内容

continue:
	延续,退出当次,继续执行后续的循环
posted @ 2018-09-20 21:09  cubo  阅读(110)  评论(0)    收藏  举报