JavaScript_3 基本语法:数组,函数,字符串

本文详细介绍了JavaScript的基础知识,包括数组、函数、作用域、预解析、对象以及内置对象的使用。讲解了数组的方法如push、pop、sort等,还提到了字符串操作和简单数据类型与复杂数据类型的区分。同时,深入探讨了作用域规则,特别是全局变量和局部变量的区别。文章还提及了Date对象和Math对象的常见方法,以及如何进行对象属性的遍历。

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

数组

var arr=new Array();
var arr=new Array(2);//长度为2
var arr=[];
var arr=[1, 2, 3, 4,'String'];
var arr=new Array(1,2,3,4);//多参相当于[1, 2, 3, 4]

直接输出arr会得到数组中所有元素。
arr.length 可以获取数组长度。越界的元素全部=undefined。
数组长度arr.length 也可以修改,多出来的部分全是 undefined。我们可以直接arr[arr.length]=值;给数组结尾追加元素。

函数

function 函数名(参数1, 参数2)//实参少于形参,会补 undefined
{
	函数体
	return x;//return只返回一个值,就是最后那个,如果想返回多个值可以存在数组里。
}

var a=function(){}//或者这样也可以声明,使用的时候直接a()即可
//btw,上面的是一个匿名函数

function 函数名(){
	console.log(arguments);//不确定多少个参数时可以用 arguments 获取。这是一个内置对象,后面会展开学
}

作用域

全局变量只有浏览器关闭时才销毁,局部变量声明在函数内,函数出栈即销毁。
全局变量和局部变量减少了命名冲突。
函数的形参、函数中声明的变量是局部变量,但是**函数中没有声明直接赋值的变量属于全局变量!**这是上一篇文章的一个坑,所以不建议这样使用变量。
var a=b=c=1;这里b c相当于没有声明直接赋值的变量,是全局变量。
此外,相比C java 有块级作用域,比如声明在if{}里的变量不能在if外使用。js没有块级作用域,声明在括号里的变量也可以在外面使用。
如果出现多个重名变量,会优先使用离调用变量处层级近的变量。

预解析

C里函数必须先定义或声明,才能调用。
js 中除了匿名函数,其他函数可以先调用再定义。
因为js 引擎执行js代码分两步:

  1. 预解析,把所有的 var function 提到最前面,但是不会把赋值语句也提前。
  2. 执行,从上往下执行。

对象

类似 java 的对象,是一组无序属性和方法的集合,意义上是一个具体的事物。typeof 显示 object。

var obj={
	name: 'Jingqing',//属性用键值对的方式赋值,彼此之间用逗号隔开
	age: 19,
	Pa:function(){//一个匿名函数
		console.log('我爬了');
	}
}

//另一种声明方法:创建一个空对象后用等号逐个赋值
var obj=new Object();
obj.name='Jingqing';
obj.age=19;
obj.Pa=function(){};

//调用属性和方法
console.log(obj.name);
console.log(obj['name']);
obj.Pa();

//也可以写构造方法
function Star(name, age){
	this.name=name;
	this.age=age;
	this.Pa=function(){}
}

var s=new Star('Jingqing',19);

构造函数更像 java 的类。new 实例化一个对象,并且 this 指向它,进行赋值;最后返回这个对象。
遍历对象可以console.log(obj)输出其所有属性,也可以console.log(obj['name'])输出具体某个属性值。

内置对象

js中有三种对象:内置对象,自定义对象,浏览器对象。
内置对象就类似 java 自己封装好的一些类,属性方法可以供我们使用。
比如 Math对象,可以进行一些求最值操作,也可以访问其中的 Pi 等常量。
可以通过 MDN文档 查看。

Math

Math.random() 生成0~1的随机数;
Math.floor() 向下取整;……
需要什么还是去MDN里查的好。

Date 对象

必须用 Date() 构造函数生成。
不加参数,会自动生成当前日期。
参数形式:2022, 7, 19或 ‘2022-7-19 13:08:00’
getFullYear() getMonth()(0到11,结果要+1) getDate() getDay()(周几,日=0) getHours() getMinutes() getSeconds()
valueOf() 或者 getTime() 或 +new Date() 获取1970年到现在的毫秒数。H5 还新增一种方法: Date.now()
对于一些倒计时模块,可以通过倒计时截止的毫秒数( +new Date(time))-当前时间毫秒数 (+new Date())然后结果/1000化成秒;/60/60/24化成天;/60/60%24化成小时;/60%60化成分;%60化成秒。
如果想输出01 02这样的格式,判断范围拼接‘0’.

数组

push(参数, ……) 末尾添加元素,返回最终数组长度
pop() 删除末尾元素,返回被删除的元素
unshift(参数, ……) 开头添加元素,返回最终数组长度
shift() 删除开头元素,返回被删除的元素
reverse() 数组反转
sort() 数组排序,但是这个sort有局限。他是先判断最高位,再逐渐降低位判断的,也就是说1<13<2类似这样。
如果改为:

arr.sort(function(a,b){return a-b;})//a-b升序,b-a降序

这样自定义规则排序后就会是想要的升序降序结果了。
indexOf(Element) 获取该元素在数组中第一次出现的索引,不存在返回-1.
lastIndexOf(Element)倒着获取。
toString() 转换为字符串
join(‘分隔符’):把所有数组元素之间用分隔符拼接起来,形成一个长字符串作为返回值。
concat() 数组拼接。
slice() 从起点到终点截取一段数组。
splice() 同样是截取,但是结果会从原数组中被删除。

包装

类似 java 中的基本包装类型,String Boolean Number 有方便操作基本类型的包装类型。

创建方法:

var str='Jingqing';
var len=str.length;

上面的操作实际上是js自动将其包装为了复杂数据类型:

var temp=new String('Jingqing');
var str=temp;
temp=null;

字符串

字符串不可变,直接改变赋值实际上是开辟了一片新空间。

字符串自己的所有方法也不会改变字符串。如:

indexOf('要查找的字符',[起始查找位置])lastIndexOf()查找给定字符在字符串中的位置;charAt(index)charCodeAt(idnex)(查找该处字符的ASCII码),str[index](H5支持)。

统计字符串中出现的字符及其次数:可以通过对象的特性实现。当对象没有对应属性时值为 undefined

var o={};//对象
for(int i=0;i<str.length;i++){
    if(o[str.charAt(i)]===undefined)o[str.charAt(i)]=0;
    else o[str.charAt(i)]++;
}

concat(str1, str2...)原字符串末尾拼接上 str1, str2…

substr(start, length)从起始索引开始截取长度为length的子字符串

slice(start, end)从start到end-1截取的子字符串

substring(start, end)和slice差不多,但不接受负值

replace(被替换的字符,要替换的字符)替换字符串中第一次出现的该字符(可以结合while(indexOf(x)!=-1)遍历全部替换)

split(分隔符)把该字符串用分隔符分割为几个数组元素。

toUpperCase()toLowerCase()不用多说。

简单数据类型和复杂数据类型辨析

简单数据类型/值类型:存储的是值本身,如boolean, number, String, undefined, null(新建变量没有想好存什么的时候赋 null)

复杂数据类型/引用类型:存储的是地址。一般通过 new 创建,如 Date Array Object.

简单数据类型存放在栈中,系统自动分配释放内存;复杂数据类型在栈中存放地址,具体的值则存放在堆中,如果程序员不自己释放则由垃圾回收机制处理。

js其实没有堆栈的概念,这只是类比其他语言而做的假设。这里的内容在java和c的学习中已经比较清楚,关于堆栈的概念和两种数据类型作为函数参数修改值引发的结果,可以查看我之前的两篇博客:

Java 学习博客_4 入门——类和对象

关于C/C++中结构体指针作为形参传入函数,为什么主函数中实参不会被修改的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰海宽松

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值