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代码分两步:
类似 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.random() 生成0~1的随机数;
Math.floor() 向下取整;……
需要什么还是去MDN里查的好。
必须用 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的学习中已经比较清楚,关于堆栈的概念和两种数据类型作为函数参数修改值引发的结果,可以查看我之前的两篇博客: