JS基础篇

318 阅读11分钟

JS介绍

  1. JavaScript和ECMAScript的关系

    ​ JavaScript的创造者Netscape公司,将JavaScript提交给国际标准化组织ECMA,希望这种语言能够成为国际标准,后来ECMA发布标准文件的第一版(ECMA-262),规定了浏览器脚本语言的标准,并将这种语言称为ECMAScript。该标准从一开始就是针对JavaScript语言制定的,之所以不叫JavaScript,有两个原因:一是商标,Java是Sun公司的商标,根据授权协议,只有Netscape公司可以合法地使用JavaScript这个名字,且JavaScript本身也已经被Netscape公司注册为商标;二是想体现这门语言的制定者是ECMA,不是Netscape,有利于保证这门语言的开放性和中立性。

    ECMAScript是一种语言标准,JavaScript是对ECMAScript的一种实现。

  2. Javascript的三个组成部分

    • 核心(ECMAScript)
      • 变量
      • 测试语句
      • 数据类型
      • 运算符
      • 数据类型转换
      • 流程控制
      • 常用内置对象
    • 文档对象模型(DOM)
      • DOM节点
      • 获取DOM节点的三种方式
      • 值的操作
      • 样式操作
      • 属性操作
      • DOM操作
    • 浏览器对象模型(BOM)
      • 浏览器的前进、后退、关闭、最小化等按钮

引入Javascript

  1. 在页面内部可以直接编写JS代码,但是要用一对<script></script>标签阔起来;

  2. 外部引入JS代码在<script>中加一个src属性引入js文件的路径,外部的JS代码不需要用<script></script>,直接编写JS代码即可。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    
    <script>
        // 在这里编写JS代码
    </script>
</head>
<body>

<!-- 外部引入JS -->
<script src="js/myjs.js"></script>
</body>
</html>

变量

定义变量需要在前面加上数据类型,但是要加一个 var关键字。

1. 基本数据类型
  • Number
  • String
  • Boolean
  • Undefind
  • null(空对象)
// 用typeof 来检查数据类型
var pai = 3.1415;
alert(typeof pai);

// 结果
>>> Number
2. 引用数据类型
  • Object
  • Array
  • Function
  • --> (指针)

3. 深入了解变量

  • JS的变量都是保存在栈内存中的,基本数据类型的值直接在栈内存中存储,值与值之间是独立存在的,修改一个变量不会影响其他变量。

    (堆内存与栈内存.ppt)

  • 对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间,而变量保存的是对象的内存地址(对象的引用)

数组

定义一个Javascript数组对象:

// 创建一个数组
var arr = ["value1", "value2", [1, 2]];

// 创建一个数组对象
var arr = new Array();


两种创建的方式是等价的。
1. 数组的内置方法
获取数组的长度
var array = ["red", "blue"];
alert(array.length);

>>> 2
判断一个对象是否为数组
var array = ["red", "blued"];
alert(Array.isArray(array));

>>> True
把一个数组转换成字符串
var array = ["red", "blue"];
var arrToStr = array.toString();
alert(arrToStr);

>>> red,blue
用指定的字符分割数组变成字符串
var array = ["red", "white", "black"];
var arrToStr = array.join("|");
alert(arrToStr);

>>> red|white|black
2. 数组排序

数组的排序规则是将数组元素转换成字符串,按照字符串顺序排序。

倒序
var array = ["red", "white", "black"];
array.reverse();

>>> array = ["black", "white", "red"]
升序
var numArray = [6, 2, 4, 0, 1, 9, 22,67];
numArray.sort();

>>> numArray = [0, 1, 2, 22, 4, 6, 67, 9]
# 为什么4会排在22后面呢?
# 因为sort()方法在对数组排序是依照对应ASCII码进行排序的,22它只会看成是"22"

# 首先查看几个数值的ASCII"1".charCodeAt();
"2".charCodeAt();
"22".charCodeAt();
"9".charCodeAt();

>>> 49
>>> 50
>>> 50
>>> 57
# 222对应的数值都是50,可知是由首字符获取对应ASCII码的,9对应的数值为57,故而排序在22后面

// 如果需要对数字列表进行正确排序,需要通过一个比值函数进行矫正                                      
function compare (a, b){              
    if (a < b){                       
        return -1;                    
    }                                 
    else if (a > b){                  
        return 1;                     
    }                                 
    else{                             
        return 0;                     
    }                                 
}                                     
console.log(numArray.sort(compare));  

>>> numArray = [1, 2, 4, 6, 9, 22, 67];
3. 数组的操作方法
数组合并、扩展
var color = ["red", "blue"];

// concat()参数可以是列表、对象、字符串
var newColor = color.concat({name: "hjd"}, ["white", "black"], "purple");

// 合并结果 列表并不会作为一个元素扩展,而是把里面的元素拆开
>>> newColor = ["red", "blue", {name: "hjd"}, "white", "black"]
切割数组
// 类似于字符串切片 顾头不顾尾
var array = ["green", "black", "red", "pink"];
var re = array.slice(1, 3);

// slice()不会对原数组进行切割修改
>>> re = ["black", "red"]
>>> array = ["green", "black", "red", "pink"]
删除、插入、替换
// 删除从起始下标到结束下标的数据(顾头顾尾)
array.splice("起始下标", "结束下标");

// 在指定的下标添加两个value	0表示不删除任何元素
array.splice("下标", 0, "value1", "value2");

// (替换)删除本身再插入一个新的值
array.splice(1, 1, "newValue");
4. 栈和队列方法
栈方法

栈是一种后进先出的数据结构

  • push() 往数组的最后一项添加内容

    array = ["red"]
    array.push("blue");		// 没有返回值
    
    >>> array = ["red", "blue"]
    
  • pop() 从数组末尾删除最后一项

    array = ["red", "pink", "blue"];
    array.pop();		// 没有返回值
    
    >>> arrat = ["red", "pink"]
    
队列方法

队列是一种先进先出的数据结构

  • unshift() 往数组里的第一位添加内容

    // unshift()方法会返回添加数据后数组的长度
    var array = ["red", "pink"];
    var re = array.unshift("black");	// 用一个re接收返回值
    
    >>> re = 3
    >>> array = ["black", "red", "pink"]
    
  • pop() 删除数组第一位数据

    // shift()会返回删除后的数据
    var array = ["green", "black", "red", "pink"]
    var re = array.shift();		// 用一个re接收返回值
    
    >>> re = "green"
    

array = ["black", "red", "pink"]





##### 5. 数组的迭代方法

对数组元素进行过滤、相除、相加、遍历等

###### 过滤方法

```javascript
/* 过滤数组中大于10的元素 */
var numbers = [1, 2, 3, 6, 19, 40, 7];

/* 
  value: 数组的元素
  index:元素的下标
  array:数组
*/
var re = numbers.filter(function (value, index, array) {
  	# console.log("value:" + value);
  	# console.log("index:" + index);
  	# console.log("array:" + array);

  	return item > 10;
  	});

console.log(re);

>>> re = [19, 40];
map方法()
var numbers = [2, 4, 6, 8, 10, 12];

/* 将数组的每个元素 *2运算 */
var mapResult = numArr.map(function (value, index, array) {
            return value * 2;
        })

console.log(mapResult);

>>> mapResult = [4, 8, 12, 16, 20, 24];
遍历方法
var colors = ["red", "blue", "green", "pink"];

/* for 循环遍历 */
for (var i = 0; i < colors.length; i++){
		console.log(colors[i]);
}

>>> red blue green pink


/* forEach() 方法遍历 */
colors.forEach(function (value, index, array) {
		console.log(value);
});

>>> red blue green pink
map()方法的一个小应用
/* 假如有一个数组里面存放有多个对象 把多个对象的值迭代到新的数组中 */

var colors = [
            {
                color: "red",
                value: "#12312",
            },

            {
                color: "black",
                value: "#FFFFF"
            },

            {
                color: "white",
                value: "#00000"
            }
        ]

var newColor = colors.map(function (value, index, array) {
            return value.color;
        });

>>> newColor = ["red", "black", "white"];

字符串

JS的字符串用 "" 单双引号括起来,但是单双引号不能同时使用。

需要输出一个特殊的符号可以用转义字符:

/t /b // /" /'
1. 字符方法
var str = "hello world";

console.log(str.lenth);	// 获取长度
>>> 11

console.log(str.charAt(1));		// 获取指定字符
>>> "e"

console.log(str.charCodeAt(1));		// 获取指定字符对应的ASCII码
>>> 101
2. 切片方法
var str = "hello world";

// 这两种方法顾头不顾尾 不会改变原字符串
console.log(str.slice(2));
console.log(str.substring(2, 7));

>>> "llo world"
>>> "llo w"

// 这种方法起始下标到结束下标都会打印出来
console.log(str.substr(2, 6);
            
>>> "llo wo"
3. 其他方法
var str = "hello world";

// 找到第一个指定出现的字符下标
console.log(str.indexOf("o"));
>>> 4

// 指定位置开始查找
console.log(str.indexOf("o", 6));
>>> 7

// 找到最后一个指定出现的字符下标
console.log(str.lastIndexOf("o"));
>>> 7

// 清除字符串的前后空格
var str = "    hello world  ";
var newStr = str.trim();
>>> hello world


// 字符大小写转换
var str = "Hello World";

console.log(str.toUpperCase());	// 转大写
console.log(str.toLowerCase());	// 转小写

>>> "HELLO WORLD"
>>> "hello world"

字符串和数值相互转换

1. 字符转数字
解析字符串中的数字
var strNum = "131312.123123";
console.log(parseInt(strNum));		// 解析遇到不是整数部分的就停止
console.log(parseFloat(strNum));	// 遇到不是数字或小数点的停止

>>> 131312
>>> 131312.123123
强转类型
var strNum = "12312a";
console.log(Number(strNum));

>>> NaN <==> Not a Number

// 可以通过isNaN()来判断字符串是否由数字组成
var re = Number(strNum);
console.log(isNaN(re));

>>> true
2. 字符串转数字
强制转换
var number = 1231.182312;
console.log(toString(number));
console.log(String(number));

>>> "1231.182312"
>>> "1231.182312"


// 保留小数点进位
console.log(number.toFiex(1));	// 保留1位小数
>>> "1231.2"
隐式转换
var number = 1231.182312;
console.log("" + number);
console.log("".concat(number));

>>> "1231.182312"
>>> "1231.182312"

条件判断

条件判断语句为 if 语句,其语法为:

if ("条件"){
		alert("run this code");
}

else if ("条件"){
  	alert("run this code");
}

else{
  	alert("run this code");
}

switch

switch() 传入的值匹配上哪一个模块就会执行哪个模块的代码,如果找不到对应的代码,则执行 default 模块。

(如果case里面没有 break 语句,模块执行完毕后不会结束,会顺序往下执行)

var parameter = "A";

switch (parameter) {
		case "A":
					console.log("run this case A");
          break;

    case "B":
          console.log("run this case B");
           break;

     case "C":
          console.log("run this case C");
          break;

     default:
          console.log("other");
          break;
}

>>> run this case A

三元运算符

三元运算可以解决单个 if ...else 的结构体,从而使代码更加精简。

条件判断 ? 条件为真(run this code) : 条件为假(run this code);

// 例:如果1 < 2 结果为 true 否则结果为 false

var re = 1 < 2 ? "true" : "false";
>>> true

循环语句

1. for 循环
for (循环开始条件; 循环结束条件; 递增、减条件)
{
		run this code;
}
for (;;){
		“这是一个死循环的for”
}
2. while 循环
while ("条件判断语句"){
		run this code;
}
3. do-while

先判断后执行(至少执行一次)

do{
		run this code;
}while("循环的条件");

函数的定义

函数一般用来封装一些重复的代码,函数需调用才能执行。

function "函数名" ("形参")
{
		run this code;
		"函数体"
		
		return "返回一个结果";
}

函数表达式

函数表达式就是一个没有名字的函数,但是要用一个变量去接收。通过变量名去调用函数。

var "变量" = function (){
  	run this code;
  	"函数体"
  
  	return "返回一个结果";
}

作用域

在函数内部定义的变量叫局部变量,只能在函数体内使用;

var name;		// 全局变量

function myFunction (){
		var parame;		//局部变量 只能在函数内使用
}

Globle对象

1. 编码方法
encodeURI()
# 用于整个url 且改方法不会对特殊字符进行编码
var url = "http://www.test.com/test one.hml#frist";
console.log(encodeURI(url));

>>> http://www.test.com/test%20one.hml#frist
encodeURIComponent()
# 用于url的某一个片段,且会对任何非标准字符进行编码
url = "http://www.test.com/test one.hml#frist";
console.log(encodeURIComponent(url));

>>> http%3A%2F%2Fwww.test.com%2Ftest%20one.hml%23frist
2. 解码方法
decodeURI()

对应的解码是解encodeURI( ) 的反码。

decodeURIComponent()

对应解 encodeURIComponent() 可以解码任何特殊字符的编码。

[www.cnblogs.com/jjq-exchang…]:

对象Object

JS创建一个对象:

// 创建一个person对象, person有姓名、年龄、性别、爱好等属性
var person = {
		name: "hjd",
  	age: 18,
  	sex: "男",
  
  	// 对象里面可以放函数,函数可以有传参、返回值
  	fav: function(){
      	alert("爱好前端");
    }
}

// 输出一个对象
console.log(person);

// 获取对象的一个属性
conslole.log(person.name);

// 调用对象里的函数
console.log(person.fav());

日期对象

1. 创建一个日期对象
var date = new Date();
2. Date的常用方法
// Date()返回的只是一个对象 需要自己去构造格式化
var date = new Date();


var day = date.getDate();	// 获取日 1-31天
var month  = date.getMonth();	// 获取月份 0-11月  操作数据的时候要+1
var year = date.getFullYear();	//获取年份
var toDay = date.getDay();	// 获取天 周一 - 周日
var hours = date.getHours();	// 获取小时
var minutes = date.minutes();		// 获取分钟
var seconds = date.seconds();		// 获取秒
3. 日期格式化方法
date.toDateString();
>>> Sat Aug 22 2020

date.toTimeString();
>>> 14:01:45 GMT+0800 (中国标准时间)

date.toLocaleDateString();
>>> 2020/8/22

date.toLocaleTimeString();
>>> 下午 2:01:45

date.toLocaleString();
>>> 2020/8/22 下午 2:01:45

Math数学对象

1. 属性
2. 数学对象的一些方法
最大最小值
var max = Math.max(1, 2, 14);
var min = Math.min(10, 100, 69);

>>> max = 14
>>> min = 10


/* 获取数组的最大最小值 */
var array = [10, 89, 566, 1];

// 常规写法
var max = Math.max(arr[0], arr[1], arr[2], arr[3]);
>>> max = 566

// 简写
var max = Math.max.apply(null, arr);
>>> max = 556
进位
var number = 24.8;

console.log(Math.ceil(num));		// 天花板函数 不管多少 总是进一位
>>> 25

console.log(Math.floor(number));	// 地板函数 不管多少 前面数值不会进位
>>> 24

console.log(Math.round(number));	// 四舍五入函数
>>> 25
随机数
// 随机数random() 是0 - 1的范围
var re = Math.random();

>> re = 0.33170895713993165


// 获取某个区间的随机整数
function random(startNumber, endNumber) {
		var intNum = Math.floor(Math.random() * (endNumber - startNumber));
		return intNum;
}

console.log(random(1, 88));
获取随机颜色
// 颜色的格式为 rgb(0~255, 0~255, 0~255)

function randomColor() {
  	// 使用上面的random()函数
		var r = random(0, 256);
		var g = random(0, 256);
		var b = random(0, 256);

		// 模版字符串(构造输出)
		var re = `rgb(${r},${g},${b})`;
		return re;
}

randomColor();
获取随机验证码
// 获取随机验证码
function creatCode() {
		var code = "";
		var randomCode = [1, 2, 3, 4, 5, 6, 7, 8, 9, "A", "B", "C", "D", "E", "F", "G",
            "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "L", "S", "T",
            "U", "V", "W", "X", "Y", "Z"];

		for (var i = 0; i < 4; i++){
					var codeValue = random(0, 36);
          code += randomCode[codeValue];
       }

		return code;
}

creatCode();

Windows对象

windows对象是一个全局对象,任何在网页中声明的变量、函数、数组对象等都变成windows的属性和方法。

window.alert("data");		// 弹出提示框

window.confirm("data");	// 有返回值的提示框, 确定(true), 取消(flase)

window.prompt("data");	// 弹出一个带有输入的提示框