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


    数组

    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]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    直接输出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 获取。这是一个内置对象,后面会展开学
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    作用域

    全局变量只有浏览器关闭时才销毁,局部变量声明在函数内,函数出栈即销毁。
    全局变量和局部变量减少了命名冲突。
    函数的形参、函数中声明的变量是局部变量,但是**函数中没有声明直接赋值的变量属于全局变量!**这是上一篇文章的一个坑,所以不建议这样使用变量。
    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    构造函数更像 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降序
    
    • 1

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

    包装

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

    创建方法:

    var str='Jingqing';
    var len=str.length;
    
    • 1
    • 2

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

    var temp=new String('Jingqing');
    var str=temp;
    temp=null;
    
    • 1
    • 2
    • 3

    字符串

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

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

    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)]++;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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++中结构体指针作为形参传入函数,为什么主函数中实参不会被修改的问题

  • 相关阅读:
    【libGDX】加载G3DJ模型
    构建创新增值能力优势,康铂酒店突围中端酒店市场!
    【AI视野·今日Sound 声学论文速览 第十七期】Tue, 3 Oct 2023
    JVM GC 垃圾收集器
    internet download manager2024中文绿色版(IDM下载器)
    识别热点事件/热点新闻(图搜索算法/度中心性算法)
    vue基于element树形控件实现上下拖拽
    MFC网络通信-Udp服务端
    Oracle 监控 SQL 精选 (一)
    十七、Webpack搭建本地服务器
  • 原文地址:https://blog.csdn.net/jtwqwq/article/details/125775245