狂神说Js视频学习笔记

1. 什么是JavaScript

1.1 概述

JavaScript是一门世界上最流行的脚本语言

Java、JavaScript

1.2 历史

JavaScript的起源故事

ECMAScript它可以理解为是JavaScript的一个标准

最新版本已经到es6版本~

但大部分浏览器还只停留在支持es5代码上!

开发环境——线上环境,版本不一致

关键字、变脸、流程控制、对象、数组、结构

2. 快速入门

2.1 引入JavaScript

1> 内部标签

<script>
	//...
</script>

2> 外部引入

abs.js

//....

test.html

<script src="abs.js"></script>

测试代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <!-- script标签内, 写JavaScript代码 -->
    <!-- <script>
        alert('hello,world');
    </script> -->
    
    
    <!-- 外部引入 -->
    <!-- 注意:script,必须成对出现 -->
    <script src="js/qs.js"></script>

    
    <!-- 不用显示定义type,也默认就是javascript -->
    <script type="text/javascript">
    
    </script>

</head>

<body>


<!-- 这里也可以存放 -->
</body>
</html>

2.2 基本语法入门

<!-- JavaScript严格区分大小写! -->
<script>
	// 1. 定义变量	变量类型		变量名 = 变量值;
	var num = 1;
	var score = "qinjiang";
	// 2. 条件控制
	if(score>60 && score<70){
		alert('60~70');
	}else if(score>70 && score<80){
		alert('70~80');
	}else{
		alert('other');

	// console.log(score) 在浏览器的控制台打印变量!	System.out.println(score)
	
	/*
		alt + shift + a 多行注释
	*/

浏览器必备调试须知:
在这里插入图片描述

2.3 数据类型

数值,文本,图形,音频,视频…

2.3.1 变量

var 王者荣耀 = ‘倔强青铜’;

2.3.1 number

js不区分小数和整数,Number

123		//  整数123
123.1		// 浮点数123.1
1.123e3  		// 科学计数法
-99		// 复数
NaN		// not a number
Infinity	// 表示无限大

2.3.2 字符串(String)

‘abc’ “abc”

  • 正常字符串使用单引号或者双引号包裹
  • 注意转义字符 \
\'			// \'
\n			// n
\t
\u4e2d	\u#### 	Unicode字符
\x41		Asc11字符
  • 多行字符串编写
//反引号
var msg = 
	`hello
	world
	你好ya
	'你好'`
  • 模板字符串
// 反引号
let name = 'qinjiang';
let age = 3;
let msg = `你好呀,${name}`;  // 你好呀,qinjiang
  • 字符串长度
str.length
  • 字符串的可变性:不可变
    在这里插入图片描述
  • 大小写转换
// 注意: 这里是方法,不是属性
student.toUpperCase();
student.toLowerCase();
  • 查询字符首次出现的位置student.indexOf('t')
  • substring
// [a,b)
student.substring(1); // 从第一个字符串截取到最后一个字符串
student.substring(1,3)  // 从1到3  [1,3)

### 2.3.3 布尔值(Boolean)
truefalse
### 2.3.4 逻辑运算
```js
&&	两个都为真,结果为真
||	一个为真,结果为真
!	真即假,假即真

2.3.5 比较运算符

= 赋值
== 等于(类型不一样,值一样,也会判断为true=== 绝对等于(类型一样,值一样,结果为true

这是一个Js缺陷,坚持不要使用 == 比较
须知:

  • NaN===NaN,这个与所有的数值都不相等,包括自己
  • 只能通过isNaN(NaN)来判断这个数是否是NaN

浮点数问题:

console.log((1/3) === (1-2/3));		// false

尽量避免使用浮点数进行运算,存在精度问题

console.log(Math.abs(1/3-(1-2/3))<0.000000001);		// true

2.3.6 null、undefined

  • null 空
  • undefined 未定义

2.3.7 数组(array)

Java的数值必须是相同类型的对象~,Js中不需要这样!

// 保证代码的可读性,尽量使用[]
var arr = [1,2,3,4,'hello',null,true];
new Array(1,2,3,4,'hello');
取数组下标:如果越界了,就会```undefined```

Array可以包含任意的数据类型

var arr = [1,2,3,4,5,6]; // 通过下标取值和赋值
arr[0]
arr[0] = 1
  • 长度
arr.length

注意:假如给arr.length 赋值,数组大小就会发生变化。如果赋值过小,元素就会丢失

  • indexOf,通过元素获取下标索引
arr.indexOf(2)  // 1

字符串的‘1’和数字1是不同的

  • slice() 截取Array的一部分,返回一个新数组,类似于String中的substring
  • push,pop
push:压入到数组尾部
pop: 弹出尾部的一个元素
  • unshift() ,shift() 头部
unshift:压入到头部
shift:弹出头部的一个元素
  • 排序sort()
['b','c','a']
arr.sort()
['a','b','c']
  • 元素反转 reverse()
['a','b','c']
arr.reverse();
['c','b','a']
  • concat() 拼接数组
['c','b','a']
arr.concat([1,2,3]);
['c','b','a',1,2,3];
arr
['c','b','a']

注意:concat() 并没有修改数组,只是会返回一个新的数组

  • 连接符 jion()
    打印拼接数组,使用特定的字符串连接
['c','b','a']
arr.jion('-');
'c-b-a'
  • 多维数组
var arr = [[1,2],[3,4],['5','6']]'
console.log(arr[1][1]); // 4

数组:存储数据 (如何存,如何取,方法都可以自己实现!)

2.3.8 对象(Object)

若干个键值对

var 对象名{
	属性名: 属性值,
	属性名: 属性值,
	属性名: 属性值
}

// 定义了一个person对象,它有四个属性!
var person = {
	name: 'kuangshen',
	age: 3,
	email: '24736743@qq.com',
	score: 0
}

Js中的对象,(……)表示一个对象,键值对描述属性xxxx:xxxx,多个属性之间使用逗号隔开,最后一个属性不加逗号。
对象是大括号,数组是中括号

// 每个属性之间使用逗号隔开 最后一个不需要添加
// Person person = new Person(1,2,3,4,5);
var person = {
	name:'qinjiang',
	age:3,
	tags:['js','java','web','...']
}

取对象的值:

person.name
> 'qinjiang'
person.age
> 3

JavaScript中的所有的键都是字符串,值是任意对象!

  • 对象赋值
person.name = 'qinjiang'  // qinjiang
person.name;  // qinjiang
- **使用一个不存在的对象属性,不会报错!**
```js
person.haha;   // undefined
  • 动态的删减属性,通过delete删除对象的属性
delete person.name
true
person
- **动态的添加,直接给新的属性添加值即可**
```js
person.haha = 'haha'
'haha'
person
  • 判断属性值是否在这个对象中! xxx in xxx!
'age' in person
true

'toString' in person
true
  • 判断一个属性是否是这个对象自身拥有的hasOwnProperty()
person.hasOwnProperty('toString')
false
person.hasOwnProperty('age')
true
## 2.4 严格检查模式
```js
<!-- 前提:IEDA 需要设置支持ES6语法
'use strict';  严格检查模式,预防JavaScript的随意性导致产生的一些问题
必须写在JavaScript的第一行!
局部变量都建议使用 let 去定义~
-->
<script>
	'use strict';
	// 全局变量
	i = 1; // undefined;
	// ES6 let
	let i = 1;
	console.log(i);  // 1

2.3.9 流程控制

  • 1> if判断
var age = 3;
if( age>3 ){ 		// 第一个判断
	alert('haha');
}else if(age <5){		// 第二个判断
	alert('kuwa~');
}else{		// 否则,,
	alert('kuwa');
}
  • 2> 循环
    while 循环,避免程序死循环
   while(age<100){
   	age = age + 1;
   	console.log(age);
   }

   do{
   	age = age +1;
   	console.log(age)
   }while(age<10)

for 循环

	for ( let i = 0; i<100; i++){
		console.log(i);
	}

forEach 循环

es 5.1 引入

	var age = [2,413,12,45,67,8,90];
	age.forEach(function (value){
		console.log(value);
	)}	

forIn 循环

//for(var index in object){}
for(var key in age){
	if(age.hasOwnProperty(key)){
		console.log('存在');
		console.log(age[key]);
	}
}

2.3.10 Map 和 Set

ES6 新特性

  • Map:
var map = new Map([['tom',100],['jack',90],['haha',80]]);
var name = map.get('tom'); // 通过key获得value
map.set('admin',123456); // 新增或修改
map.delete('tom'); // 删除
console.log(name);
console.log(map);
  • Set: 无序不重复的集合
var set = new Set([3,1,1,1,1]); // set可以去重
set.add(2); // 添加
set.delete(1); // 删除
console.log(set.has(3)); // 是否包含某个元素!

2.3.11 iterator

ES6 新特性
使用 iterator 来遍历迭代 Map,Set!

  • 遍历数组
// 通过 for of /
	var arr = [3,4,5];
	for (var x of arr){
		console.log(x)
	}
  • 遍历map
	var map = new Map([['tom',100],['jack',90],['haha',80]]);
	for(var i of map){
		console.log(i)
	}
  • 遍历set
var set = new Set([5,6,7]);
for( let x of set ) {
	console.log(x);
}

3. 函数

3.1 定义函数

定义方式一
绝对值函数

	public 返回值类型  方法名(){
		return 返回值;
	}

	function abs(x){
		if(x>=0){
			return x;
		}else{
			return -x;
		}
	}

一旦执行到 return 代表函数结束,返回结果!
如果没有执行return,函数执行完也会返回结果,结果就是undefined

定义方式二

var abs = function(x){
	if(x>=0){
		return x;
	}else{
		return -x;
	}
}

function(x){……} 这是一个匿名函数,但是可以把结果赋值给 abs,通过abs就可以调用函数!

调用函数

abs(10) //10
abs(-10) //10

参数问题: JavaScript可以传任意个参数,也可以不传递参数~
参数进来是否存在问题?假设不存在参数,如何规避

var abs = function(x){
if(type x !== 'number'){
	throw 'Not a Number';
}
	if(x>=0){
		return x;
	}else{
		return -x;
	}
}

arguments

arguments 是一个JS免费赠送的关键字
代表,传递进来的所有参数,是一个数组

    var abs = function (x) {
        console.log('x=>' + x);
        for (var i = 0; i < arguments.length; i++) {
            console.log(arguments[i]);
        }
        if (x >= 0) {
            return x;
        } else {
            return -x;
        }
    }

在这里插入图片描述
问题:arguments 包含所有的参数,我们有时候想使用多余的参数来进行附加操作。需要排除已有参数~

rest

以前:

if (arguments.length>2){
	for (var i = 2; i<arguments.length;i++){
		// ....
	}
}

ES6 引入的新特性,获取除了已经定义的参数之外的所有参数

    function aaa(a,b,...rest){
        console.log('a=>'+a);
        console.log('b=>'+b);
        console.log(rest);
    }

rest 参数只能写在后面,必须使用…标识
在这里插入图片描述

3.2 变量的作用域

在JavaScript中,var 定义变量实际是有作用域的。
假设在函数体中声明,则在函数体外不可以使用~ (闭包)

function aj(){
        var x = 1;
        x +=1;
    }
    x + = 2;

如果两个函数使用了相同的变量名,只要在函数内部,就不冲突

    function aj1(){
        var x = 1;
        x +=1;
    }
    function aj2(){
        var x = 1;
        x +=1;
    }

内部函数可以访问外部函数的成员,反之则不行

    function aj1() {
        var x = 1;

        function aj2() {
            var y = x + 1;
        }
        var z = y + 1; // y is not defined
    }

假设,内部函数和外部函数的变量,重名!

    function aj1() {
        var x = 1;

        function aj2() {
            var y = 'A';
            console.log('inner'+x); //innerA
        }
        console.log('outer'+y); // outer1
        aj2();
    }
    aj1();

假设在JavaScript 中 函数查找变量从自身函数开始~,由‘内’向‘外’查找,假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量。

提升变量的作用域

function aj(){
    var x = 'x' + y;
    console.log(x);
    var y = 'y';
}

结果: xundefined
说明:js执行引擎,自动提升了y的声明,但是不会提升变量y的赋值;

function aj(){
    var y;
    var x = 'x' + y;
    console.log(x);
    y = 'y';
}

这个是在JavaScript建立之初就存在的特性。养成规范:所有的变量定义都放在函数的头部,不要乱放,便于代码维护;

    function aj() {
        var x = 1;
        y = x + 1;
        z, i, a; // undefined

        // 之后随意用
    }
    aj();

全局函数

    // 全局变量
    var x = 1;
    function f() {
        console.log(x);
    }
    f();
    console.log(x);

全局对象window

    var x = 'xxx';
    alert(x);
    alert(window.x); //默认所有的全局变量,都会自动绑定在 window对象下

alert() 这个函数本身也是一个window的变量

    var x = 'xxx';
    window.alert(x);
    var old_alert = window.alert;
    // old_alert(x);
    window.alert = function(){
        
    };
    // 发现alert()失效了
    window.alert(123);

    // 恢复
    window.alert = old_alert;
    window.alert(456);

JavaScript 实际上只有一个全局作用域, 任何变量 (函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,报错RefrenceEror

规范

由于我们所有的全局变量都会绑定到我们的window上。如果不同的js文件,使用了相同的全局变量,冲突~>如何能够减少冲突?

    // 唯一全局变量
    var KuangApp = {};

    // 定义全局变量
    KuangApp.name = 'kuangshen';
    kuangApp.add = function (a, b) {
        return a + b;
    }

把自己的代码全部放入自己定义的唯一的空间名字中,降低全局命名冲突的问题~

局部作用域 let

	function aaa() {
        for (var i = 0; i < 100; i++) {
            console.log(i);
        }
        console.log(i + 1); // i 出了这个作用域还可以使用
    }
    aaa();

ES6 let 关键字 ,解决局部作用域冲突问题

    function aaa() {
        for (let i = 0; i < 100; i++) {
            console.log(i);
        }
        console.log(i + 1); // Uncaught ReferenceError:i is not defined
    }
    aaa();

建议使用let去定义局部作用域的变量;

常量const

在ES6之前,怎么定义常量:只有用全部大写字母命名的变量就是常量;建议不要修改这样的值

	var PI = '3.14';
	console.log(PI);
	PI = '213'; // 可以改变这个值
	console.log(PI);

在ES6引入了常量关键字const

	const PI = '3.14'; // 只读变量
	console.log(PI);
	PI = '123';
	console.log(PI); //TypeError: Assignment to constant variable.

下期视频

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值