JavaScript基础

1.快速入门

如何写一段JS代码并运行

行内

<!-- 将JS代码写在HTML行内 -->
<input type="button" value="按钮" onclick="alert(123)">

标签

<!-- 将JS代码写在script标签中 -->
<script>
	alert(456)
</script>

单独文件

//js文件
//单独js文件中的代码,是不能直接在浏览器中打开运行的
//需要将js文件引入到html中
alert(789)
<!-- html文件 -->
<!-- 注意:那script标签中就不要再写其他js代码,写了也没用 -->
<script src="./1.js"></script>

声明变量并赋值

//声明一个
var i = 10;
//声明多个
var h1 = 11, h2 = 12, h3 = 13;

变量命名规则

  • 变量的名字必须是 数字、字母、下划线_ 和 $ 组成
  • 变量名字不能以数字开头
  • 变量名不能是关键字
  • 变量区分大小写
  • 变量的命名尽可能使用驼峰法命名
var a = 1;
var b = 2;
var c = a;

a = b;
b = c;

alert(a,b);

2.数据类型

//数值Number、字符串String、布尔Boolean、undefined、null、对象Object

//李四在这里不是字符串
//var str1 = 李四;

var str1 = '李四';

//如果在字符串中要使用引号,请加转义字符
var str = '这是一段需要转义的\'文本\'';

var s1 = '123';
var s2 = '456';

var s3 = s1 + s2;
var s4 = 1;
var s5 = 2;

// + 既可以作为数字运算使用也可以作为字符串拼接使用
// 从前往后进行运算,如果两个变量都是数值型那么加号作为数学运算符
// 直到遇到一个字符串,此后所有的加号都是字符串拼接
console.log(s4 + s5 + s3);	//3123456
console.log(s3 + s4 + s5);	//12345612

Boolean

true为1,false为0

Undefined和Null

  1. undefined表示一个声明了没有赋值的变量,变量只声明的时候值默认是undefined
  2. null表示一个空,变量的值如果想为null,必须手动设置

复杂数据类型

参考:

字符串的颜色是黑色的,数值类型是蓝色的,布尔类型也是蓝色的,undefined和null是灰色的

打印长度

console.log(s1.length);

获取变量的类型

typeof

var age = 18;
console.log(typeof age);	// 'number'

代码注释

//单行注释
/*
	多行注释
*/

其他类型转为字符串

var n = 5;

//方法一
var s = n.toString();

//方法二
console.log(typeof String(n));

//方法三
var s = '' + n;

数值类型转换

var a = '1';

//方法一
var b = Number(a);
console.log(typeof b);

var c = Number('c');		//NaN
var d = Number(null);		//0
var e = Number(undefined);	//NaN

console.log(c,d,e);	
/*
	NaN = not a number
*/

//方法二
var f = parseInt('2');		//2
var g = parseInt('k22');	//NaN
var h = parseInt(null);		//NaN
var i = parseInt(undefined); //NaN

console.log(f, g, h, i);
/*
	2 NaN NaN NaN
*/
parseFloat('1.23df');	//1.23
parseFloat('1.3.4.5');	//1.3

Number转的null为0,parseInt转的null为NaN

布尔类型转换

var a = Boolean('0');		//true
var b = Boolean(0);			//false
var c = Boolean('2');		//true
var d = Boolean(null);		//false
var e = Boolean(undefined);	//false
var f = Boolean('');		//false
var g = Boolean(' ');		//true

3.操作符与运算符

/*
	算数操作符
	+	-	*	/	%
	*/

/*
	一元运算符
	++ -- 对自身操作加一或者减一
	*/
var n1 = 5;
n1++;
n1--;
++n1;
--n1;

/*
	逻辑运算符
	&& 逻辑与运算符
	|| 逻辑或运算符
	! 逻辑非运算符
	*/

/*
	比较运算符
	> < >= <= == != === !==
	
	因为JS是一种弱类型语言
	变量的数据类型存在自动转换
	== 只比较值,不比较数据类型
	console.log(a==b);
	=== 全等比较 既比较值也比较数据类型
	!== 不全等
	*/
var a = '2';
var b = 2;
console.log(a===b);	// false

/*
	赋值运算
	=	+=	-=	/=	*=	%=
	*/

/*
	运算符的优先级
	()
	一元运算符	++ -- !
	算数操作符	先乘除后加减
	关系运算符	> < >= <=
	相等运算符	== != === !==
	逻辑运算符	先&& 后||
	赋值运算	 =
	*/

4.语句

if判断

if(2>1){
    console.log(1);
}else if(5>3){
    console.log(2);
}
//如果有代码执行,那么后面的代码不管成立还是不成立都不会执行

switch-case的用法

switch(i){
    case 1:
        语句;
        break;
    case 2:
        语句;
        break;
    default:
        语句;
        break;
}

while循环

while(条件){
    语句;
}

do-while循环

do{
    语句;
}while(条件);

for循环

for(var i = 1; i < 10; i++){
    语句;
}

for循环打印图形

//打印正方形
var s = '';
for(var i = 0; i < 10; i++){
    for(var h = 0; h < 10; h++){
        s += "* ";
    }
    s += '\n'
}
console.log(s);

//打印三角形
var str = '';
for(var i = 0; i < 10; i++){
    for(var h = i; h < 10; h++){
        str += "* ";
    }
    str += '\n';
}
console.log(str);

for循环乘法表

//打印九九乘法表
var s = '';
for(var i = 1;i < 10;i++){
    for(var h = i;h < 10;h++){ 
        s += i + ' * ' + h + ' = ' + i * h + '\t';
    }
    s += '\n';
}
console.log(s);

continue与break

//计算100以内不能被7整除的所有数的和
var sum = 0;
for(var i = 0;i <=100;i++){
    if(i%7){
        sum += i;
    }
}
console.log(sum);

//continue的写法
var sum = 0;
for(var i = 0; i <= 100; i++){
    if(i%7 == 0){
        continue;
    }
    sum += i;
}
console.log(sum);

//请打印在200--300之间 第一个 能被7整除的数字
for(var i = 200; i <= 300; i++){
    if(i%7 == 0){
        console.log(i);
        break;
    }
}

5.数组

var arr = ['1','2','3'];
var arr2 = [1,2,3];

console.log(arr[1]);

//字面量方式创建数组
var a1 = [];	//空数组
var a2 = [1,'d'];
console.log(a2);

//声明构造函数创建数组
var a3 = new Array();	//空数组
var a4 = new Array(1,3,'h','k');
console.log(a4);

//获取数组长度
a4.length

//数组里可以有数组,称为多维数组

6.函数

//函数声明
//关键字声明
function 函数名(){
    
}

//表达式声明
var f = function(){
    
}

//函数调用
function f1(){
    
}

f1();

//形参与实参
function fun(形参1,形参2,形参3){}
fun(实参1,实参2,实参3);

function f1(s){console.log(s);}

//返回值
function f(形参){
    语句;
    return 返回值;
}

var re = f(实参);
//如果函数没有return,那么函数调用之后接到的返回值就是undefined
//如果函数有return,但return后面没有值,那么函数调用之后接到的返回值就是undefined
//函数中return之后,不管有什么代码,均不执行;return后函数的调用结束

匿名函数与自调用

//匿名函数,函数本身是没有名字的
var fun = function(){
    alert(123);
}
fun();
//自调用匿名函数
(function(){
    alert(123);
})();
//两段代码形式上相同

//函数的意义
//作用域
//防止全局变量的污染,封装一个局部作用

函数当作参数1

//函数也是一种数据类型
function fn(){
    
}
//function 数据类型 --> 对象(数组、函数)
console.log(typeof fn);

//函数当作参数
function f1(s){
    s();
}

var f2 = function(){
    console.log(222);
}

f1(f2);
//回调:把函数当作值放到另一个函数里面执行

函数当作参数2

function f1(){
    var a = 10;
    var f2 = function(){
        alert(2);
    }
    return f2;
}

var k = f1();
k();
//闭包:把一个函数作为值返回到函数外面

新名词:回调、闭包

变量提升及代码执行阶段

全局变量和局部变量

不使用var声明的变量是全局变量,不推荐使用

变量退出作用域之后会销毁,全局变量关闭网页或浏览器才会销毁

console.log(a);	//undefined
var a = 2;
//变量提升:在代码执行之前变量已经在编译阶段被声明了;

//JS代码的运行分为两个阶段
//1:解释(编译)阶段:语法检查,变量及函数进行声明
//2:运行阶段:变量的赋值,代码流程的执行

//上面的代码相当于
var a;
console.log(a);
a = 2;

作用域与代码执行

var a = 12;
function abc(){
    alert(a);	//undefined
    var a = 10;
}
abc();
//因为在abc()中已经声明了变量a,所以外部的全局变量不使用

console.log(a);	//	function a(){console.log('aaaa');}
function a(){
    console.log('aaaa');
}
var a = 1;
console.log(a);	//1
//如果函数与变量同名,那么函数声明会替换变量声明

var a = 1;
function a(){
    console.log('aaaa');
}
console.log(a);	//1
//不管是函数声明还是变量声明,在运行阶段的赋值都会把a的值替换掉

作用域及作用域链

只有函数可以制造作用域结构,只要有代码,就至少有一个作用域

var a = 1;
function f1(){
    //var a = 5;
    function f2(){
        //var a = 4;
    	function f3(){
            //var a =3;
    		console.log(a);
		}
        f3();
	}
    f2();
}
f1();

7.对象

//字面量声明对象
var obj1 = {};

//对象里都是键值成对存在的
var obj2 = {
    age:12,
    name:'李四',
    fei:function(){}
};

/*
	通常来说,值是函数则称为方法,其他类型的值都是属性,但是在JS官方手册里面没有方法这个说法,之所以这么叫法是为了交流方便
*/

//实例化方式 声明对象(内置构造函数)
var obj2 = new Object();

//实例化自定义构造函数方式声明对象
function Fun(){
    
}

var f = new Fun();

//获取对象的属性或者方法	对象.属性名
var obj2 = {
    age:12,
    name:'李四',
    fei:function(){
        console.log(2);
    }
};

console.log(obj2.age);
obj2.fei();

this是个对象

var obj1 = {
    name:'李四',
    age:18,
    fun:function(){
        //在方法中的this指的就是这个方法所在的对象
        var s = this.age;
        console.log(s);
    }
}
obj1.fun();

示例一

function f(){
    console.log(this.a);	//undefined
}
f();

示例二

function f(){
    // 普通的函数中也是有this的
    // this 指向全局对象(window)
    console.log(this);
}
f();

// this永远指向一个对象
// this在什么情况下什么地方 指向哪个对象

this的指向

示例一

k = '678';
function fun(){
    var k = '89';
    console.log(this.k);
}

var o1 = {
    k:"123",
    f:fun,
}

var o2 = {
    k:"345",
    f:fun,
}

o1.f();	//123
o2.f();	//345

//this运行在哪个对象下,就指向哪个对象

示例二

var o1 = {
    age:18,
    fun:function(){
        console.log(this.age);
    }
}

var o2 = {
    age:16,
    fun:o1.fun,
}

o2.fun();

对象的遍历及删除

遍历

var o1 = {
    name:'李四',
    age:15,
    sex:'男'
}

// for...in
// for(键 in 对象)
// for...in循环不仅可以循环变量对象还可以,循环遍历数组

for(var k in o1){
    console.log(o1[k]);
}

//补充:for in 遍历数组
var arr = [2,4,7,8,4];
for(var k in arr){
    console.log(arr[k]);
}

删除

var o1 = {
    name:'李四',
    age:15,
    sex:'男'
}

console.log(o1);

delete o1.age;

console.log(o1);

包装对象

//var str = '123';
//console.log(str.length);

//包装对象
//三种原始类型	数值	字符串	布尔
//原始类型的数据在一定条件下可以自动转为对象	这就是包装对象

//var v1 = new Number(123);
//console.log(v1);

//原始值 可以自动当作对象来调用,可以调用各种属性及方法
//如果包装对象使用完成,会自动立即销毁

var a = '456';
a.length;

火狐开发手册https://developer.mozilla.org/zh-CN/docs/Web/JavaScript

数学对象

得到一个两数之间的随机数

这个例子返回了一个在指定值之间的随机数。这个值不小于 min(有可能等于),并且小于(不等于)max

function getRandomArbitrary(min, max) {
  return Math.random() * (max - min) + min;
}

得到一个两数之间的随机整数

这个例子返回了一个在指定值之间的随机整数。这个值不小于 min (如果 min 不是整数,则不小于 min 的向上取整数),且小于(不等于)max

function getRandomInt(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min)) + min; 
//不含最大值,含最小值
}
//获取随机数 
Math.random();
//获取最大的整数(向上取整) 
Math.floor();
//获取最大的整数(向下取整)
Math.ceil();

日期对象

//实例化构造函数获取时间对象
var da = new Date();
console.log(da);
var n = Date.now();
console.log(n);
console.log(da.getHours());

//JS中获取的时间是计算本地时间
//JS中月份的数组是从0开始的

数组对象

var arr = [1,6,4,8,2,4];
console.log(arr.length);

var k = 3;
arr.push(k);	//在最后添加元素[1,6,4,8,2,4,3]
arr.pop();		//删除最后一位元素[1,6,4,8,2,4]
console.log(arr);	

**slice()** 方法返回一个新的数组对象,这一对象是一个由 beginend 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变。

const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];

console.log(animals.slice(2));
// expected output: Array ["camel", "duck", "elephant"]

console.log(animals.slice(2, 4));
// expected output: Array ["camel", "duck"]

console.log(animals.slice(1, 5));
// expected output: Array ["bison", "camel", "duck", "elephant"]

**concat()** 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。

const array1 = ['a', 'b', 'c'];
const array2 = ['d', 'e', 'f'];
const array3 = array1.concat(array2);

console.log(array3);
// expected output: Array ["a", "b", "c", "d", "e", "f"]

**join()** 方法将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串。如果数组只有一个项目,那么将返回该项目而不使用分隔符。

const elements = ['Fire', 'Air', 'Water'];

console.log(elements.join());
// expected output: "Fire,Air,Water"

console.log(elements.join(''));
// expected output: "FireAirWater"

console.log(elements.join('-'));
// expected output: "Fire-Air-Water"

字符串对象

**indexOf()** 方法返回调用它的 String 对象中第一次出现的指定值的索引,从 fromIndex 处进行搜索。如果未找到该值,则返回 -1。

const paragraph = 'The quick brown fox jumps over the lazy dog. If the dog barked, was it really lazy?';

const searchTerm = 'dog';
const indexOfFirst = paragraph.indexOf(searchTerm);

console.log(`The index of the first "${searchTerm}" from the beginning is ${indexOfFirst}`);
// expected output: "The index of the first "dog" from the beginning is 40"

console.log(`The index of the 2nd "${searchTerm}" is ${paragraph.indexOf(searchTerm, (indexOfFirst + 1))}`);
// expected output: "The index of the 2nd "dog" is 52"

substring() 方法返回一个字符串在开始索引到结束索引之间的一个子集, 或从开始索引直到字符串的末尾的一个子集。

str.substring(indexStart, indexEnd)

**toLowerCase()** 会将调用该方法的字符串值转为小写形式,并返回。

toUpperCase() 方法将调用该方法的字符串转为大写形式并返回(如果调用该方法的值不是字符串类型会被强制转换)。

replace() 方法返回一个由替换值(replacement)替换部分或所有的模式(pattern)匹配项后的新字符串。模式可以是一个字符串或者一个正则表达式,替换值可以是一个字符串或者一个每次匹配都要调用的回调函数。如果pattern是字符串,则仅替换第一个匹配项。

const p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?';

const regex = /dog/gi;

console.log(p.replace(regex, 'ferret'));
// expected output: "The quick brown fox jumps over the lazy ferret. If the ferret reacted, was it really lazy?"

console.log(p.replace('dog', 'monkey'));
// expected output: "The quick brown fox jumps over the lazy monkey. If the dog reacted, was it really lazy?"

trim() 方法会从一个字符串的两端删除空白字符。在这个上下文中的空白字符是所有的空白字符 (space, tab, no-break space 等) 以及所有行终止符字符(如 LF,CR等)。

代码规范

缩进问题

语句结尾回车就可以,分号可以不加,压缩代码的时候会自动添加分号删除回车

posted @ 2020-11-24 22:30  颉颃  阅读(138)  评论(0编辑  收藏  举报