热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:JavaScript对象内置对象(MathDate数组String)及值类型和引用类型

篇首语:本文由编程笔记#小编为大家整理,主要介绍了JavaScript对象内置对象(MathDate数组String)及值类型和引用类型相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Javascript 对象内置对象(MathDate数组String)及值类型和引用类型相关的知识,希望对你有一定的参考价值。








文章目录


  • 对象
    • 什么是对象
    • 对象定义和成员的访问
      • 利用字面量创建非空对象
      • 用new Object创建空对象
      • 用构造函数创建对象
      • 对象成员的访问

    • 遍历对象成员

  • 内置对象
    • Math对象
    • Date对象
    • 数组对象
    • String对象

  • 值类型和引用类型



对象

什么是对象

Javascript中,对象是一种数据类型,它是由属性方法组成的一个集合。属性是指事物的特征(静态),方法是指事物的行为(动态)


对象定义和成员的访问


利用字面量创建非空对象

{ } 里面采取键值对的形式表示


  • 键:相当于属性名
  • 值:相当于属性值,可以是任意类型的值(数字类型、字符串类型、布尔类型,函数类型等)

var 对象名={
属性名:值
方法名:function([参数]){
方法体语句
}

}

var p1={
color:'黑色',
weight:'188g',
screenSize:6.5,
call:function (name) {
console.log("打电话给:"+name)
},
sendMessage:function(msg) {
console.log("发送的信息是:"+msg)
},
playVideo:function(){
console.log("播放视频")
},
playMusic:function(){
console.log("播放音乐")
}
}
console.log("手机颜色:"+p1.color)
console.log("手机颜色:"+p1['color'])
p1.call("张三")
p1['call']('张三')
p1.playMusic()

用new Object创建空对象


  • Object() :第一个字母大写
  • new Object() :需要 new 关键字
  • 使用的格式:对象.属性 = 值

var 对象名=new Object()

var p2=new Object()
p2.name='张三'
p2.sex='男'
p2.sayHello=function(){
console.log("hello")
}
p2.sayHello()

用构造函数创建对象

用来初始化对象,即为对象成员变量赋初始值,它总与 new 运算符一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面


  • 构造函数用于创建某一类对象,其首字母要大写
  • 函数内的属性和方法前面需要添加 this ,表示当前对象的属性和方法
  • 构造函数中不需要 return 返回结果。
  • 当我们创建对象的时候,必须用 new 来调用构造函数

new 构造函数名([参数])// 可以有参数,也可无参数,没有参数括号可省略

function Student(name,sex){
this.name=name
this.sex=sex
this.show=function(){
console.log("姓名:"+this.name)
console.log("性别:"+this.sex)
}
}
var p3=new Student('张三','男')
p3.show()

new关键字:

new 在执行时会做四件事情:


  1. 在内存中创建一个新的空对象。
  2. 让 this 指向这个新的对象。
  3. 执行构造函数里面的代码,给这个新对象添加属性和方法。
  4. 返回这个新对象(所以构造函数里面不需要return)。

对象成员的访问


  • 对象名.属性名
  • 对象名[‘属性名’] (方括号里必须加引号)
  • 对象名.函数名([参数]) (函数名后必须加括号)
  • 对象名[‘函数名([参数])’]

遍历对象成员

for…in 语句用于对数组或者对象的属性进行循环操作

for(var 变量名 in 对象名){
循环语句
}

// obj为待遍历的对象
var obj = { name: '小明', age: 18, sex: '男' }
// 遍历obj对象
for (var k in obj) { // 通过k可以获取遍历过程中的属性名或方法名
console.log(k); // k是属性名 依次输出:name、age、sex
console.log(obj[k]) // obj[k]是属性值依次输出:小明、18、男
}

in运算符

判断成员(属性)在对象是否存在,存在返回true,否则为false

var obj = {name: 'Tom', age: 16}
console.log('age' in obj)
// 输出:true,表示对象成员存在console.log('gender' in obj)
// 输出:false ,表示对象成员不存在

内置对象

Javascript提供了很多常用的内置对象,这些对象供开发者使用,并提供了一些常用的或是最基本而必要的功能(属性方法),包括数学对象Math、日期对象Date、数组对象Array以及字符串对象String


Math对象

用来对数字进行与数学相关的运算,不需要实例化对象,可以直接使用其静态属性和静态方法
在这里插入图片描述

console.log(Math.PI)
console.log(Math.abs(-12))
console.log(Math.max(12,45,23))
console.log(Math.pow(2,3))
console.log(Math.sqrt(2))
console.log(Math.random())
console.log(Math.round(Math.random()))
console.log(Math.floor(Math.random()*8))
console.log(Math.ceil(Math.random()*8))
....

Date对象

使用 new Date() ,Date()是日期对象的构造函数, 必须要实例化对象后才能使用,可以给该构造函数传参数,生成日期对象
在这里插入图片描述
在这里插入图片描述

//1、无参数创建当前时间
var date=new Date()
console.log(date)
//2、创建指定日期时间的对象,传入年、月(0~11)、日、时、分、秒
var date1=new Date(2021,4,22,10,18,20)
console.log(date1)
//3、传入日期和时间字符串
var date2=new Date("2021-05-22 10:20:25")
console.log(date2)
console.log(date2.toLocaleDateString())
console.log(date2.toLocaleString())

数组对象

数组对象的创建(前面文章详细讲过):


  • 字面量方式
  • new Array()

提供了添加删除元素的方法,可以实现在数组的末尾或开头添加新的数组元素,或在数组的末尾或开头移出数组元素

判断数组对象的方法:


  • Array.isArray(对象名)
  • 对象名 instanceof Array

var arr = [1, 23];
var obj = {};
console.log(arr instanceof Array); // true
console.log(obj instanceof Array); // false
console.log(Array.isArray(arr)); // true
console.log(Array.isArray(obj)); // false

添加或删除数组元素:


方法名作用
push(参数1…)在数组末尾添加元素
unshift(参数1…)在数组开头添加元素

方法返回值是新数组的长度


方法名作用
pop( )删除最后一个元素 ,若是空数组返回undefined
shift( )删除第一个元素,同上

方法返回值是移除数组的元素

应用举例:剔除数组中大于2000的元素

//剔除大于2000数据
var arr=[1800,1500,3000,800,1200,2100]
var newArray=[]
console.log(arr)
for(var i&#61;0;i<arr.length;i&#43;&#43;){
if (arr[i]<2000) {
newArray.push(arr[i])
}
}
console.log(newArray)

数组排序:


方法名作用
sort([可选参数])数组排序&#xff0c;改变原数组&#xff0c;返回新数组
reverse( )颠倒数组中元素位置,改变原数组&#xff0c;返回新数组

var arr&#61;[1800,1500,3000,800,1200,2100]
console.log(arr.sort())
//会按照字符编码顺序打印 结果&#xff1a;[1200, 1500, 1800, 2100, 3000, 800]
//顺序排列
function numberOrder(a,b){
return a-b
}
console.log(arr.sort(numberOrder))
//打印结果&#xff1a;[800, 1200, 1500, 1800, 2100, 3000]
//逆序排列
console.log(arr.reverse())
//打印结果&#xff1a;[3000, 2100, 1800, 1500, 1200, 800]

注意&#xff1a;sort&#xff08;&#xff09; 默认是按字符编码顺序排序&#xff0c;若要按照其他顺序排序&#xff0c;需自定义&#xff0c;并在sort中传参调用

数组索引&#xff1a;


方法名作用
indexOf(元素)返回给定值得第一个索引&#xff0c;若不存在返回-1
lastIndexOf(元素)返回给定值的最后一个索引 。若不存在返回-1

注意&#xff1a; 默认都是从指定数组索引位置开始检索&#xff0c;采用 “&#61;&#61;&#61;”方式判断

数组转换为字符串&#xff1a;


方法名作用
toString( )数组元素转换成字符串&#xff0c;元素间用逗号分隔
join(‘分隔符’)数组元素连接到字符串&#xff0c;元素之间用给定的分隔符隔开

//数组转字符串
var arr&#61;[100,12,33,55]
console.log(arr.toString())
//用&#39;——&#39;连接
var str&#61;arr.join(&#39;——&#39;)
console.log(str)

填充数组、连接数组、截取数组、删除数组&#xff1a;


方法名作用返回值
fill( )用一个固定值填充数组指定下标范围内全部元素&#xff0c;改变原数组填充后的数组
contact( )连接两个或多个数组&#xff0c;不影响原来数组连接后的数组
slice(start,end)截取从start到end(不包含)的对应元素&#xff0c; 不影响原数组被截取的元素的数组
splice(start)删除从start开始的数组元素&#xff0c;改变原数组被删除的元素的数组
splice(start,delCount)删除从start开始的delCount个元素&#xff0c;同上同上
splice(start,delCount,value…)删除从start开始delCount个元素&#xff0c;并用value替换&#xff0c;同上同上

//填充数组
var arr&#61;[100,12,33,55,33,22]
console.log(arr.fill(1,0,3))//[1, 1, 1, 55, 33, 22]
//连接数组
var arr&#61;[100,12,33,55,33,22]
var newArr&#61;arr.concat([450,500])
console.log(newArr) //[100, 12, 33, 55, 33, 22, 450, 500]
//截取数组
var arr&#61;[100,12,33,55,33,22]
console.log(arr.slice(1,5))//[12, 33, 55, 33]
console.log(arr)//[100, 12, 33, 55, 33, 22]
//删除数组元素
var arr&#61;[100,12,33,55,33,22]
console.log(arr.splice(3))//[55, 33, 22]
console.log(arr)//[100, 12, 33]
var arr&#61;[100,12,33,55,33,22]
console.log(arr.splice(2,4))//[100, 12, 33]
console.log(arr)//[100, 12, 33]

String对象

字符串对象必须使用new String() 来创建&#xff0c;要实例化对象后才能使用&#xff0c;在String构造函数中传入字符串

字符串的不可变&#xff1a;

var str &#61; &#39;abc&#39;;
str &#61; &#39;hello&#39;;
// 当重新给 str 赋值的时候&#xff0c;常量&#39;abc&#39;不会被修改&#xff0c;依然在内存中
// 重新给字符串赋值&#xff0c;会重新在内存中开辟空间&#xff0c;这个特点就是字符串的不可变
// 由于字符串的不可变&#xff0c;在大量拼接字符串的时候会有效率问题
var str &#61; &#39;&#39;;
for (var i &#61; 0; i < 100000; i&#43;&#43;) {
str &#43;&#61; i;
}
console.log(str); // 这个结果需要花费大量时间来显示&#xff0c;因为需要不断的开辟新的空间

var str &#61; new String(&#39;apple&#39;); // 创建字符串对象
console.log(str); // 输出结果&#xff1a;String {"apple"}
console.log(str.length); // 获取字符串长度&#xff0c;输出结果&#xff1a;5

根据字符返回位置&#xff1a;


方法名作用
indexOf(‘查找的字符’&#xff0c;开始的位置)返回指定内容在字符串位置&#xff0c;找不到返回-1
lastIndeOf()从后往前找

根据位置返回字符&#xff1a;


方法名作用
charAt(index)返回索引对应字符
charCodeAt(index)返回索引对应ASCII码值
str[index]返回索引对应字符

var str&#61;new String(&#39;ABCDE&#39;)
console.log(str.charCodeAt(0))
console.log(str.charAt(0))
console.log(str[0])

截取、连接、替换字符串&#xff1a;
在这里插入图片描述

var str &#61; &#39;HelloWorld&#39;;
str.concat(&#39;!&#39;); // 在字符串末尾拼接字符&#xff0c;结果&#xff1a;HelloWorld!
str.slice(1, 3); // 截取从位置1开始包括到位置3的范围内的内容&#xff0c;结果&#xff1a;el
str.substring(5); // 截取从位置5开始到最后的内容&#xff0c;结果&#xff1a;World
str.substring(5, 7); // 截取从位置5开始到位置7范围内的内容&#xff0c;结果&#xff1a;Wo
str.substr(5); // 截取从位置5开始到字符串结尾的内容&#xff0c;结果&#xff1a;World
str.substring(5, 7); // 截取从位置5开始到位置7范围内的内容&#xff0c;结果&#xff1a;Wo
str.toLowerCase(); // 将字符串转换为小写&#xff0c;结果&#xff1a;helloworld
str.toUpperCase(); // 将字符串转换为大写&#xff0c;结果&#xff1a;HELLOWORLD
str.split(&#39;l&#39;); // 使用“l”切割字符串&#xff0c;结果&#xff1a;["He", "", "oWor", "d"]
str.split(&#39;l&#39;, 3); // 限制最多切割3次&#xff0c;结果&#xff1a;["He", "", "oWor"]
str.replace(&#39;World&#39;, &#39;!&#39;); // 替换字符串&#xff0c;结果&#xff1a;"Hello!"

值类型和引用类型

值类型&#xff1a;简单的数据类型&#xff08;字符串、数值、布尔型、undefined、null&#xff09;&#xff0c;在存储时变量中存储的是值本身

引用类型&#xff1a;复杂数据类型&#xff08;对象&#xff09;变量中保存的引用的地址&#xff0c; 通过 new 关键字创建的对象&#xff08;系统对象、自定义对象&#xff09;&#xff0c;如 Object、Array、Date等

堆和栈

堆栈空间分配区别&#xff1a;
在这里插入图片描述


  • &#xff08;操作系统&#xff09;&#xff1a;由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈
  • &#xff08;操作系统&#xff09;&#xff1a;存储复杂类型(对象)&#xff0c;一般由程序员分配释放&#xff0c;若程序员不释放&#xff0c;由垃圾回收机制回收
  • 简单数据类型存放到栈里面
  • 复杂数据类型存放到堆里面

注意&#xff1a; Javascript中没有堆栈的概念&#xff0c;通过堆栈的方式&#xff0c;可以让大家更容易理解代码的一些执行方式

在这里的的插入图片描述



在这里插入图片描述

引用类型的特点&#xff1a;
变量中保存的仅仅是一个引用的地址&#xff0c;当对变量进行赋值时&#xff0c;并不是将对象复制了一份&#xff0c;而是将两个变量指向了同一个对象引用

// 创建一个对象&#xff0c;并通过变量obj1保存对象的引用
var obj1 &#61; { name: &#39;小明&#39;, age: 18 };
// 此时并没有复制对象&#xff0c;而是obj2和obj1两个变量引用了同一个对象
var obj2 &#61; obj1;
// 比较两个变量是否引用同一个对象
console.log(obj2 &#61;&#61;&#61; obj1); // 输出结果&#xff1a;true
// 通过obj2修改对象的属性
obj2.name &#61; &#39;小红&#39;;
// 通过obj1访问对象的name属性
console.log(obj1.name); // 输出结果&#xff1a;小红

注意&#xff1a;
当一个对象只被一个变量引用的时候&#xff0c;如果这个变量又被重新赋值&#xff0c;则该对象就会变成没有任何变量引用的情况&#xff0c;这时候就会由Javascript的垃圾回收机制自动释放






推荐阅读
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 热血合击脚本辅助工具及随机数生成器源码分享
    本文分享了一个热血合击脚本辅助工具及随机数生成器源码。游戏脚本能够实现类似真实玩家的操作,但信息量有限且操作不可控。热血合击脚本辅助工具可以帮助玩家自动刷图、换图拉怪等操作,并提供了雷电云手机的扩展服务。此外,还介绍了使用mt_rand函数作为随机数生成器的代码示例。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • MATLAB函数重名问题解决方法及数据导入导出操作详解
    本文介绍了解决MATLAB函数重名的方法,并详细讲解了数据导入和导出的操作。包括使用菜单导入数据、在工作区直接新建变量、粘贴数据到.m文件或.txt文件并用load命令调用、使用save命令导出数据等方法。同时还介绍了使用dlmread函数调用数据的方法。通过本文的内容,读者可以更好地处理MATLAB中的函数重名问题,并掌握数据导入导出的各种操作。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
author-avatar
bcz8936810
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有