javascript知识点

本文主要介绍了JavaScript的基础知识,包括引入方式、语言规范、数据类型、运算符、流程控制等。还阐述了函数的定义、作用域和词法分析,以及对象、Date对象、JSON对象、Math对象和正则表达式的相关内容,如创建方法和常用方法等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如无特殊说明,均是ECMAScript5

一、JavaScript 基础

1、JavaScript引入方式

1.Script标签内写js

<script>
	// 在这里写你的JS代码
	console.log('hello word!') 
	// f12建打开浏览器的调试窗口,然后在console这个调试台就能看到这个内容了
	alert('hello word!')  
	// 这个是浏览器窗口一打开咱们这个文件,就弹出一个窗口
</script>

2.Script标签引入JS文件

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

2.语言规范

1.注释

// 单行注释

/*
多行注释
*/

2.结束符

语句以分号(;)结束

3.变量声明

  1. 可以使用数字,字母,下划线_,$组成,不能以数字开头
  2. 声明变量使用var 变量名;的格式来进行声明
  3. 注意:
  • 变量名是区分大小的
  • 推荐使用驼峰命名规则,即首字母大写
  • 保留字不能变量名

ES6
let 用于声明变量。其用法类似与var,但是所有声明的变量只在let声明所在的代码块内有效。

4.数据类型

  1. 数值(Number)
    包括整数、浮点数、NaN(Not a Number)
  • 方法
parseInt("123") //返回123
parseInt("1a23") //返回1
parseInt("abc") //返回NaN

parseFloat("123.3") //返回123.3
  1. 字符串(String)
    常用方法
方法说明注意
.length返回长度不加括号,是一个属性
.trim()移除空白会得到一个新值
.trimLeft()移除左边的空白
.trimRight()移除右边的空白
.charAt(n)返回第n个字符n类似索引,从0开始,超过最大值返回’'空字符串
.concat(value)拼接var s1 = “hello”; var s2 = s.concat(“xx”) s2=“helloxx”
.indexOf(substring,start)子序列位置从strat开始找,没有返回-1
.slice(start,end)切片前包后不包
.toLowerCase()变小写
.toUpperCase()变大写
.split(delimiter,limit)分割delimiter分割符号,limit分割后元素个数

ES6 引入模板字符串,是增强版的字符串,用反引号(`)标识,可以定义单行,也可以定义多行

var name = "xxx";

var str1 = `Hello ${name}`;
  1. 布尔值(Boolean)
    true、false
    “”(空字符串)、0、null、undefined、NaN都是false。
    null表示值是空的
    undefined声明一个变量但未初始化
  2. 对象(Object)
    JavaScript 提供多个内建对象,比如 Number、String、Date、Array 等等,通过new实例化的对象都是object类型(var s = new String(‘hello’),var n = new Number(12)等),数组不需要new声明,类型就是object类型。
  3. 数组(Array)
    常用方法
方法说明注意
.length数组的大小
.push(element)尾部追加元素
.pop()删除尾部元素并返回会返回值
.unshift(element)头部插入元素
.shift()头部移除元素
.slice(start,end)切片
.reverse()反转就地修改
.join(seq)将数组元素连接成字符串lst.join("+")
.concat(val1,val2,…)链接数组合并数组,得到一个新数组,原数组不变
.sort()排序注意用法,有坑
.splice(index,howmany,item1,…,itemX)按条件删除
.forEach()将数组的每个元素传递给回调函数

sort() 没有参数会将按照ASCII码就行排序

var array1 = [1,21,11,13,3];
array1.sort();
array1 //  [1, 11, 13, 21, 3]

按照数字排序

function sortNumber(a,b){
    return a - b
}
var arr1 = [11, 100, 22, 55, 33, 44]
arr1.sort(sortNumber)
arr1 // [11, 22, 33, 44, 55, 100]

遍历数组两种方式:

var a = [10, 20, 30, 40];
// 方式一
for (var i=0;i<a.length;i++) {
  console.log(a[i]);
}
// 方式二
for (var i in a){
  console.log(a[i])
}

.splice()

  • 语法
    splice(index,howmany,item1,…,itemX)
  • 参数
参数描述
index必需。规定从何处添加/删除元素。
该参数是开始插入和(或)删除的数组元素的下标,必须是数字。
howmany必需。规定应该删除多少元素。必须是数字,但可以是 “0”。
如果未规定此参数,则删除从 index 开始到原数组结尾的所有元素。
item1, …, itemX可选。要添加到数组的新元素
  1. 自定义对象
    JavaScript的对象(Object)本质上是键值对的集合(Hash结构),但是只能用字符串作为键,键也不能是变量。
var a = {"name": "yang", "age": 18};
console.log(a.name);
console.log(a["age"]);

var s = "name";
var a = {s: "yang"};
// a = {s:yang}

遍历自定义对象的内容:

var a = {"name": "yang", "age": 18};
for (var i in a){
  console.log(i, a[i]);
}

5.类型查询

typeof是一个一元运算符,不是一个函数,也不是一个语句。

  • undefined - 如果变量是 Undefined 类型的
  • boolean - 如果变量是 Boolean 类型的
  • number - 如果变量是 Number 类型的
  • string - 如果变量是 String 类型的
  • object - 如果变量是一种引用类型或 Null 类型的,需要注意的是typeof null返回为object,因为特殊值null被认为是一个空的对象引用。

6.运算符

1.算术运算符

+、-、*、/、++、–、%

2.比较运算符

> >= < <= != == === !==
== 弱等于只比较值,不比较类型
=== 强比较比较数值和类型

3.逻辑运算符

&&(与) ||(或) !(非)

4.赋值运算

=、+=、*=、 /= 、%=

7.流程控制

1.if-else

if-else if-else #多条件

var a = 10;
if (a > 5){
  console.log("a > 5");
}else if (a < 5) {
  console.log("a < 5");
}else {
  console.log("a = 5");
}

2.switch

var day = new Date().getDay(); //示例化一个今天的日期对象,getDay()是获取天数的编号,0表示星期日
switch (day) {
  case 0: //如果day是0
  console.log("Sunday"); //执行它
  break; //然后break跳出
  case 1:
  console.log("Monday");
  break;
default:  //如果没有任何满足条件的,就执行它
  console.log("...")
}

3.for

for (var i=0;i<10;i++) {
  console.log(i);
}
// for(;;){console.log(i)};这种写法就是个死循环,会一直循环
// 循环数组:
var l2 = ['aa','bb','dd','cc']
// 方式1
for (var i in l2){
   console.log(i,l2[i]);
}
// 方式2
for (var i=0;i<l2.length;i++){
  console.log(i,l2[i])
}

// 循环自定义对象:
var d = {aa:'xxx',bb:'ss',name:'小明'};
for (var i in d){
    console.log(i,d[i],d.i)  
    // 注意循环自定义对象的时候,打印键对应的值,只能是对象[键]来取值,不能使用对象.键来取值。
}

4.while

var i = 0;
while (i < 10) {
  console.log(i);
  i++;
}

8.三元运算符

var a = 1;
var b = 2;
var c = a > b ? a : b 
//如果a>b这个条件成立,就把冒号前面的值给c,否则把冒号后面的值给c   //python中的:a = x if x>y else y

二、函数

1.函数定义

function 函数名([参数1,参数2]) {
	其他语句;
	[return a;]
}

匿名函数定义

var sum = function(a, b){  
//在es6中,使用var,可能会飘黄,是因为在es6中,建议你使用let来定义变量,不过不影响你使用
  return a + b;  
}
sum(1, 2);

自执行函数

// 立即执行函数,页面加载到这里,这个函数就直接执行了,不需要被调用执行
(function(a, b){
  return a + b;
})(1, 2); 

ES6 箭头(=>)定义函数

var f = v => v;
// 等同于
var f = function(v){
  return v;
}

如果箭头函数不需要参数或需要多个参数,就是用圆括号代表参数部分;

2.函数的全局变量和局部变量

局部变量:
在JavaScript函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它(该变量的作用域是函数内部)。只要函数运行完毕,本地变量就会被删除。
全局变量:
在函数外声明的变量是全局变量,网页上的所有脚本和函数都能访问它。
变量生存周期:
JavaScript变量的生命期从它们被声明的时间开始。
局部变量会在函数运行以后被删除。
全局变量会在页面关闭后被删除。

3.作用域

首先在函数内部查找变量,找不到则到外层函数查找,逐步找到最外层。

4.词法分析

过程:
当函数调用的前一瞬间,会先形成一个激活对象:Avtive Object(AO),并会分析以下3个方面:

  1. 函数参数,如果有,则将此参数赋值给AO,且值为undefined。如果没有,则不做任何操作,但是一般有参数的时候,我们在执行函数的时候就把参数赋值给了这个参数,所以不会打印出undefined的效果。
  2. 函数局部变量,如果AO上有同名的值,则不做任何操作。如果没有,则将此变量赋值给AO,并且值为undefined。
  3. 函数声明,如果AO上有,则会将AO上的对象覆盖。如果没有,则不做任何操作。
    函数内部无论是使用参数还是使用局部变量都到AO上找。
var age = 18;
function foo(){
  console.log(age);  //分析到这一步的时候,发现你下面有age变量声明,那么age变量就在AO对象上定义了,并且值为undefined,所以函数在执行的时候,还没有到age=22这步的时候,age=undefined
  var age = 22;      //如果没有这个变量声明,那么打印的结果应该是18
  console.log(age);
}
foo();  // 问:执行foo()之后的结果是?

undefined
22
var age = 18;
function foo(){
  console.log(age);
  var age = 22;
  console.log(age);
  function age(){   
  // 发现age这个函数名也是变量,将OA上的变量给替换了,那么函数在执行的时候,去OA上找,发现OA是个函数,然后执行到age=22的时候,age才被重新赋值
    console.log("呵呵");
  }
  console.log(age);
}
foo();  // 执行后的结果是?

结果:
  function age(){
    console.log("呵呵");
  }
  22
  22

答案解析

词法分析过程:
1、分析参数,有一个参数,形成一个 AO.age=undefine;
2、分析变量声明,有一个 var age, 发现 AO 上面已经有一个 AO.age,因此不做任何处理
3、分析函数声明,有一个 function age(){...} 声明, 则把原有的 age 覆盖成 AO.age=function(){...};

最终,AO上的属性只有一个age,并且值为一个函数声明

执行过程:
注意:执行过程中所有的值都是从AO对象上去寻找

1、执行第一个 console.log(age) 时,此时的 AO.age 是一个函数,所以第一个输出的一个函数
2、这句 var age=22; 是对 AO.age 的属性赋值, 此时AO.age=22 ,所以在第二个输出的是 22
3、同理第三个输出的还是22, 因为中间再没有改变age值的语句了

这些内容就是好多人搞不明白的,经常写js代码的时候,发现自己的结果不对啊,什么情况,就是因为这个没搞清楚~~~

三、对象

面向对象,在ES5中没有类的概念,只有个构造函数,命名的首字母要大写,实例化的时候使用new关键字进行实例化

function Person(name){
    this.name=name
}

console.log(p1.name)  
Person.prototype.func1 = function(){  //添加一些方法,使用prototype,叫做原型链 方法
    console.log(this.name,'爱编程!')
}
var p1 = new Person('chao');
p1.func1() #方法和属性只能通过对象来调用,不能使用类名来调用
#chao
#chao 爱编程!
类似于python中的面向对象,了解一下就可以了

四、Date对象

1.创建Date对象

//方法1:不指定参数
var d1 = new Date(); //获取当前时间
console.log(d1.toLocaleString());  //当前时间日期的字符串表示
//方法2:参数为日期字符串
var d2 = new Date("2004/3/20 11:12");
console.log(d2.toLocaleString());
var d3 = new Date("04/03/20 11:12");  #月//(可以写成04/03/2020)
console.log(d3.toLocaleString());
//方法3:参数为时间戳(毫秒),了解一下就行
var d3 = new Date(5000);  
console.log(d3.toLocaleString());
console.log(d3.toUTCString());  
 
//方法4:参数为年月日小时分钟秒毫秒
var d4 = new Date(2004,2,20,11,12,0,300);
console.log(d4.toLocaleString());  //毫秒并不直接显示

2.方法

var d = new Date();
//getDate()                 获取日
//getDay ()                 获取星期 ,数字表示(0-6),周日数字是0
//getMonth ()               获取月(0-11,0表示1月,依次类推)
//getFullYear ()            获取完整年份
//getHours ()               获取小时
//getMinutes ()             获取分钟
//getSeconds ()             获取秒
//getMilliseconds ()        获取毫秒
//getTime ()                返回累计毫秒数(从1970/1/1午夜),时间戳

五、JSON对象

var str1 = '{"name": "chao", "age": 18}';
var obj1 = {"name": "chao", "age": 18};
// JSON字符串转换成对象
var obj = JSON.parse(str1); 
// 对象转换成JSON字符串
var str = JSON.stringify(obj1);

六、Math对象

Math.abs(x)      返回数的绝对值。
exp(x)      返回 e 的指数。
floor(x)    小数部分进行直接舍去。
log(x)      返回数的自然对数(底为e)。
max(x,y)    返回 x 和 y 中的最高值。
min(x,y)    返回 x 和 y 中的最低值。
pow(x,y)    返回 x 的 y 次幂。
random()    返回 0 ~ 1 之间的随机数。
round(x)    把数四舍五入为最接近的整数。
sin(x)      返回数的正弦。
sqrt(x)     返回数的平方根。
tan(x)      返回角的正切。

七、正则

  1. 创建正则表达式
// 第一种方式
var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$","gim"); 
// 第二种方式
var reg1 = /^[a-zA-Z][a-zA-Z0-9_]{5,11}$/gim;

参数1 正则表达式(不能有空格)
参数2 匹配模式:常用g(全局匹配;找到所有匹配,而不是在第一个匹配后停止)、i(忽略大小写)、m(多行匹配)

  1. 方法
// 匹配响应的字符串
var s1 = "bc123";

//RegExp对象的test方法,测试一个字符串是否符合对应的正则规则,返回值是true或false。
reg1.test(s1);  // true


var s2 = "hello world";

s2.match(/o/g);         // ["o", "o"]             查找字符串中 符合正则 的内容 ,/o/g后面这个g的意思是匹配所有的o,
s2.search(/h/g);        // 0                      查找字符串中符合正则表达式的内容位置,返回第一个配到的元素的索引位置,加不加g效果相同
s2.split(/o/g);         // ["hell", " w", "rld"]  按照正则表达式对字符串进行切割,得到一个新值,原数据不变
s2.replace(/o/g, "s");  // "hells wsrld"          对字符串按照正则进行替换
// 注意事项1:
// 如果regExpObject带有全局标志g,test()函数不是从字符串的开头开始查找,而是从属性regExpObject.lastIndex所指定的索引处开始查找。
// 该属性值默认为0,所以第一次仍然是从字符串的开头查找。
// 当找到一个匹配时,test()函数会将regExpObject.lastIndex的值改为字符串中本次匹配内容的最后一个字符的下一个索引位置。
// 当再次执行test()函数时,将会从该索引位置处开始查找,从而找到下一个匹配。
// 因此,当我们使用test()函数执行了一次匹配之后,如果想要重新使用test()函数从头开始查找,则需要手动将regExpObject.lastIndex的值重置为 0。
// 如果test()函数再也找不到可以匹配的文本时,该函数会自动把regExpObject.lastIndex属性重置为 0。
var reg3 = /foo/g;
// 此时 regex.lastIndex=0
reg3.test('foo'); // 返回true
// 此时 regex.lastIndex=3
reg3.test('xxxfoo'); // 还是返回true
// 所以我们在使用test()方法校验一个字符串是否完全匹配时,一定要加上^和$符号,把匹配规则写的确定一些,尽量不用上面这种的写法/xxx/。

// 注意事项2(说出来你可能不信系列):
// 当我们不加参数调用RegExpObj.test()方法时, 相当于执行RegExpObj.test(undefined),然后将这个undefined又转为字符串"undefined",去进行匹配了, 并且/undefined/.test()默认返回true。
var reg4 = /^undefined$/;
reg4.test(); // 返回true
reg4.test(undefined); // 返回true
reg4.test("undefined"); // 返回true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值