3.qml-ECMAScript_03(Object基类对象、String对象)

摘要:
2.qml-ECMAScript_02(原始值类型,通用转换方法)在本章中,我们将首先学习ECMAScript的内置对象、Object对象和String对象。对象创建和回收对象由新操作符和要实例化的对象的名称创建,保持良好的习惯。对象对象-所有对象的基类对象类是所有ECMAScript类的基类。

在上章学习了:2.qml-ECMAScript_02(原始值类型、通用转换方法)

本章我们来初步学习ECMAScript的内置对象.Object对象和String对象.

 

对象创建与回收
对象是由 new 运算符加上要实例化的对象的名字创建的,实际对象就是引用值,指向存储对象的内存处

例如,下面的代码创建 Array对象的实例:

var arr1 = new Array;     // 如果类的构造函数不传入参数,括号可以省略。
var arr2 = new Array(5);
console.log(arr1.length) // 打印0
console.log(arr2.length) // 打印5
arr1 = null;
arr2 = null;

由于ECMAScript有垃圾收集器,所以当没有任何引用指向一个对象时,该对象会自动被垃圾收集器回收、释放。
如果我们是在一个函数里new出来的对象,那么都不需要置null,函数执行完毕后也会自动释放.但是每次用完一个对象,还是应该置null取消引用,保持一个良好习惯.


Object对象-所有对象的基类

Object类是所有ECMAScript类的基类,Object类的所有属性和方法都会出现在其他类中.示例如下所示:

     var str = new String("hello");
        console.log(str instanceof Object); //  true

        var arr = new Array(5);
        console.log(arr instanceof Object); //  true

Object 对象具有下列属性:

  • constructor指向创建对象函数的引用(指针)。对于 Object 对象,该指针指向Object() 函数。
  • prototype : 指向该对象类的引用。对于所有的对象,它默认返回 Object 对象的一个实例。

Object 对象还具有几个方法:

  • hasOwnProperty(property) :判断对象是否有某个特定的属性。property是个字符串。(例如,o.hasOwnProperty("name"))
  • isPrototypeOf(object) : 判断该对象是否为另一个对象的原型。
  • propertyIsEnumerable(property) : 判断给定的属性是否可以用 for...in 语句进行枚举得出(只有自定义的对象属性和方法是可以枚举的)
  • toString() : 返回对象的类型名字
  • valueOf() : 返回最适合该对象的原始值。对于许多对象,该方法返回的值都与 ToString() 的返回值相同。

Object可以直接动态创建属性;也可以动态创建方法;也可以通过delete运算符删除开发者定义的属性和方法,也可以使用数组下标[]的方法获取属性的值。下面是一个简单的示例:

Window{
    visible: true
    id: wind
    Component.onCompleted: {
        var object = new Object
        object.name = "ZhangSan" // 动态创建属性
        object.year = "26"
        object.printInfo = function printInfo() { // 动态创建方法
            console.log("name-" , this.name , "year-" , this.year);
        }
        object.printInfo();          // 调用方法,打印 name- ZhangSan year- 26
        console.log(object.name)     // 打印 ZhangSan
        console.log(object["year"])  // 通过[]数组方式访问属性.打印 26
        console.log(object.hasOwnProperty("name")) // 检查是否有"name"属性,返回true

        delete object.name          // delete只能删除我们动态创建的name属性,不能删除object自带的属性和方法

        console.log(object.name)   // 打印 undefined,表示没有这个属性
        for (var prop in object) { // 循环打印自定义的属性和方法(name属性已经被delete,无法找到): "26","function printInfo() { [native code] }"
            console.log("for:",object[prop])
        }
    }
}            

除处之外,我们还可以这样通过初始化列表的形式来构造Object类:

  var object2 = {
      "name" : "LiSi",
      "year" : 26,
     eat: function(){ // 创建方法
console.log("吃鱼")
}   } console.log(object2.name)
// LiSi console.log(object2.year) // 26 for (var prop in object2) { // 循环打印自定义的属性和方法: "LiSi","26"   console.log(object2[prop])   }

String对象

String 对象是 String 原始类型的引用类型,它是以下方式创建的:

var oStringObject = new String("hello world");

String可以通过数组下标[]的方法获取单个字符,还可以通过赋值方式来添加成员.

比如:

var str = new String("2021");
str += " 11/11 "             // str = "2021 11/11"

String对象具有下列属性:

  • length :返回字符个数,对于中文,还是当成一个字符来看.

String对象具有下列方法:

  • toString() :返回字符串原始值
  • valueOf() : 和toString()一样, 返回字符串原始值
  • charAt(num) :返回第num个位置处的单个字符,位置从0开始的
  • charCodeAt(num) :返回第num个位置处的单个字符编码值

示例如下所示:

var str1 = new String("hello world");
var str2 = new String("hello world");
console.log(str1 == str2);                        // 比较的是对象本身地址,由于str1和str2的地址不同,返回false
console.log(str1.toString() == str2.toString()); // 比较的是字符串原始值,由于str1和str2指向的原始值都在同一地址,返回true
console.log(str1[1]);                // 打印e
console.log(str1["1"]);             // 通过字符串数字访问,打印e
console.log(str1.charAt(1));       // 打印e
console.log(str1.charAt("1"));    // 通过字符串数字访问,打印e
console.log(str1.charCodeAt(1));  // 打印e的编码值,101

注意:

相同内容的String对象用"=="判断是返回false的.因为比较的是对象本身地址,而不是对象引用的值.

在ECMAScript中,数字和字符串数字的值其实是一样的意思,比如:

"5" == 5 // "5"会转换为5,来和5比较,所以为true

如果想除了判断值相等,还要判断类型的话,请使用全等号"==="或者非全等号"!==",比如:

"5" === 5 // 为false,因为类型不同
"5" !== 5 // 为true
  • str1.concat(str2) : 连接字符串,返回str1 + str2的内容
  • str1.indexOf(str2) :查找子串,从str1头部开始查找str2子串,找到则返回子串开头位置,否则返回-1
  • str1.lastIndexOf(str2) :反向查找子串,找到则则返回子串开头位置,否则返回-1

示例如下:

var str1 = new String("hello ");
var str2 = new String("world");

console.log(str1.concat(str2));    // 打印 "hello world"
console.log(str1.indexOf("ll"));   // 打印 2
console.log(str1.indexOf("hh"));    // 未找到,打印 -1
console.log(str1.concat(str2).lastIndexOf("l")); // 打印 9
  • str1.localeCompare(str2) :比较字符串.

如果str1的内容大于str2,返回正数

如果str1的内容等于str2,返回0

如果str1的内容小于str2,返回负数

  • str.substring(num,num) :获取子串,var1表示str中的起始位置,var2表示str2中的终止前位置(不包含在内),如果省略var2参数,则默认终止位置在str末尾.
  • str.slice(num,num) :和substring()方法一样,唯一的区别在于slice支持负数.而substring不支持负数,统统当做0来处理.

示例如下:

var str = new String("hello world");

console.log(str.slice(3));        // 从起始位3处获取子串,打印 "lo world"
console.log(str.substring("3")); // 从起始位3处获取子串,打印 "lo world"

console.log(str.slice(3,7));     // 从[3,7]位处获取子串,所以子串长度为7-3-1=3, 打印 "lo w"
console.log(str.substring(3,7)); // 从[3,7]位处获取子串, 打印 "lo w"

console.log(str.slice(3,-2));     // 从起始位3到末尾-2之前位置获取子串,打印:"lo wor"
console.log(str.substring(3,-2)); // 由于substring() 总把较小值作为起始位,较大值作为结束位[-2,3],并且不支持负数,所以获取的位置是[0,3],打印:"hel"
  • str.toUpperCase() : 返回字符串大写
  • str.toLowerCase() :返回字符串小写
  • str.arg(var) :通过arg方式替换

示例如下:

var str = new String("%1,%2,%3");
console.log(str.arg("123").arg(133).arg(5.2)); // 打印"123,133,5.2"
  • str.replace(str1,str2) : 替换,将str中出现str1的地方,替换为str2,支持正则表达式替换
  • str.match(regx) :    通过正则表达式查找String内容

正则表达式,示例如下所示:

var str = new String("时间:2020 11/12 20:35 ");
var result = str.match(/d+/g);               // 匹配字符串中所有数字项
console.log(result.length);                   // 共找到5组匹配项
for (var i in result) {
    console.log("index",i,": ",result[i]);   // 循环打印 2020、11、12、20、35
}
console.log(str.replace(/d+/g,"?"));        // 将数字项改为"?",打印: "时间:? ?/? ?:?"

"/d+/g": 最前面的“/”与最后面的“/”是分隔符,表示正则表达式的开始与结束。所以正则表达式匹配的内容是"d+",匹配多个数字.

而最后的"g"表示的是全局匹配,可以匹配到多次的情况,如果不加"g",那么result的匹配项最多只能有1个,匹配成功就截止.

相关的标志还有i(ignoreCase,表示忽略大小写)、m(multiline,表示允许跨行)

忽略大小写,匹配含有str标签项,示例如下所示:

var str = new String("str:456; ASDZ Str:123; RES STr:XYZ; STR:qaz;");
var result = str.match(/str(.+?);/gi); // 查找含有str和;的匹配项,g:global(匹配多次) i:ignoreCase(不区分大小写)
console.log(result.length); // 打印4
for (var i in result) {
  console.log("index",i,": ",result[i]);
  // 循环打印 index 0 : str:456;
  // index 1 : Str:123;
  // index 2 : STr:XYZ;
  // index 3 : STR:qaz;
}

正则表达式元字符参考: https://deerchao.cn/tutorials/regex/regex.htm

  • str.split(str2) :    通过str2将str字符串对象分割成字符串数组

示例如下所示:

        var str = new String("123,456,789,159");
        var arr = str.split(",");

        for (let index in arr) {
            console.log(arr[index]);
        }

 

免责声明:文章转载自《3.qml-ECMAScript_03(Object基类对象、String对象)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇UI设计规范整理一iOS字体和切图及规范DCOM Server Process Launcher启动不了的解决办法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WebSocket以及socketIO的使用

简介 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出H...

C#基础知识——类的继承

  继承是C#的三大特性之一,它实现了多态性和代码复用   我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员,单独的封装到一个类中,作为这些类的父类。   Student、Teacher、Driver    子类 派生类  Person                  父类 基类 1.  子类继承了父类,那么子类从父类那里继承过来了什么?...

HTTP服务&AJAX编程

即 Asynchronous Javascript And XML,AJAX 不是一门的新的语言,而是对现有持术的综合利用。 本质是在HTTP协议的基础上以异步的方式与服务器进行通信。 传统方式我们是以表单形式与服务器通信的。 1.1   异步 指某段程序执行时不会阻塞其它程序执行,其表现形式为程序的执行顺序不依赖程序本身的书写顺序,相反则为同步。 其优势...

iOS自动化环境搭建——macaca

macaca-java for ios 自动化环境搭建 基础原理解析:https://testerhome.com/topics/6608 一、环境搭建 1、安装eclipse; -----Java开发调试工具 下载地址:https://www.eclipse.org/downloads/ PS:java调试工具,可根据自身情况选择不下载。 2、安装n...

win下配置nginx

1.下载:http://nginx.org/en/download.html 2.在安装目录cmd: start nginx.exe 启动nginx 3.修改默认运行端口80(nginx.conf):  HTTP 数据分发 修改配置文件nginx.conf相应节点: 修改完后重启服务: nginx -s reload TCP 数据分发:  ng...

使用jest进行单元测试

以前,写完一段代码我也是直接调用或者实例化一下,发现过了就把测试相关部分删了。今年的不幸与坎坷使我有很长一段时间去思考人生,不想将就了,鲁棒健壮的程序,开发和测试应该是分得很开的,于是我选择jest去做单元测试这件事。 为什么要做单元测试 在开始之前,我们先思考这样一个问题,我们为什么要做单元测试? 不扯犊子直接说吧,第一点,用数据、用茫茫多的测试用例去告...