在上章学习了: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]); }