ECMAScriptQt Quick编程(1)——QML的中坚部分ECMAScript

协议QML,不得不先说一样下ECMAScript:

ECMAScript语言的正儿八经是出于Netscape、Sun、微软、Borland等营业所基于JavaScript和JScript锤炼、定义出来的。

ECMAScript可以吗不同种类的宿主环境提供基本之台本编程能力。ECMAScript仅仅是一个描述,定义了脚本语言的具有属性、方法与目标。它讲述了转情:

  • 语法
  • 类型
  • 语句
  • 关键字
  • 保留字
  • 运算符
  • 对象

另外语言可以为她吗底蕴进行起新特性,比如QML引入了Qt对象系统被的信号及槽等风味效益。

QML有三独为主:

  • ECMAScript
  • Qt对象系统
  • Qt Quick标准库

故而说学号QML,了解ECMAScript必不可少。在初步了解ECMAScript的着力特征之前,要清楚qmlscene可以加载QML文档以达测试的目的,比如如下测试代码,就可以在Qt命令行界面中以“qmlscene
text.qml”的方展示界面效果:

/*
 * text.qml
 */
import QtQuick 2.2
Rectangle {
    Component.onCompleted: {
        // 这里放测试代码
    }
}

脚开始简单介绍ECMAScript:

1.语法

与C、C++或者Java类似。如果您产生立几乎种语言的基本功,那学习ECMAScript简直就是是“张飞吃豆芽,小菜一碟”。需要专注的几点是:

  • 分别轻重缓急写

懂得变量area和Area不一致就是行了,无需多言。

  • 弱类型

ECMAScript语言是弱类型语言,变量没有一定的品类,在概念变量的时节都因此var定义,可以为此任意值初始化变量,而且可天天变动变量所蕴藏的数据类型,当然矣,最好是无须这样做。

  • 支行可写不过免写

ECMAScript中,如果没坐分行结尾,它就会将行业的终极当做是该语句之竣工。之后要QML与C++混合编程,为了不思分裂,故而还是与c++风格保持一致的好哎,你身为也不是。

2.变量

暨c++中变量声明和定义是看似之,这里不必多言。在ECMAScript中,变量可以存放两栽类型的值,即原始值和引用值。原始值一般存放于栈上,引用值是一个指南针,指向存储于积中的对象,如果您熟悉c++的话,那么坏爱就可知懂这个概念。

3.原始类型

当ECMAScript中,原始类型有5种植:

  • Undefined
  • Null
  • Boolean
  • Number
  • String

typeof运算符可以判定一个价值的类别,是原始类型会回去路的讳,是援类型则统一返回“object”作为项目名字。以下也简便的言传身教:

/*
 * typeof value
 */
import QtQuick 2.2
Rectangle {
    Component.onCompleted: {
        var name = "matao";
        console.log(typeof name);
        console.log(typeof 60);
    }
}

Undefined类型和Null类型都单出一个价,即undefined、null。

数字型的不过大值是Number.MAX_VALUE,最小值是Number.MIN_VALUE,它们定义了Number值的外边界,所有的ECMAScript数还须于及时有限只价值期间。不过,由表达式的价值好无获于这半只数里。大于最充分价值,它用为赋值为Number.POSITIVE_INFINITY,即正无穷大;当生成的数值低于Number.MIN_VALUE时,将受赋值为Number.NEGATIVE_INFINITY,即负无穷大。其实,ECMAScript也来专门表示无穷大的价值,即Infinity,而-Infinity表示负无穷大。

isFinit()方法可以判断一个再三是否是还要到底的。

再有一个特别值NaN,表示非数。isNaN判断一个反复是否是非数。

4.类型转换

  • toString()
    • Boolean、Number、String三种原始类型,都有toString()方法,可以拿它们的值变为字符串;
  • parseInt()和parseFloat()

    • 即时片种植艺术就适用于String类型,而且只有换无效字符之前的局部,见如下示例:

      parseInt("2014年");                   //2014
      parseInt("3.14");                       //3
      parseFloat("3.13.1");                 //3.13
      parseInt("INGI");                       //NaN        
      
  • 强制类型转换

    • Boolean(value)
      • value是非空字符串、非0数字或者对象时,Boolean()返回true;
      • value是空字符串、0、undefined或null,Boolean()返回false;
    • Number(value)
      • Number()转换的凡百分之百价值!  
        这是暨parseInt()和parseFloat()不同的地方。
    • String(value)

      • 其与调用tostring()方法的绝无仅有不同在于:对null或undefined值强制类型转换可以生成字符串而非有错误:

        var null2String = String(null);         // “null”
        var oNull = null
        var s2 = oNull.toString();               // error   
        

5.对象

率先声明,其实在ECMAScript中连没有“类”这个词,与该相应之是“对象定义”,这里的“类”代指的饶是其一意思,区别为C++、Java中之近乎。前面提到的援值,指向的虽是目标。

靶是出于new运算符加上要实例化的型的名创办的。比如:

var a = new Array();

  如果类似的构造函数没有参数,括号可以略。

几个为主的对象:

  • Object

  Object类是所有ECMAScript类的基类,Object类的富有属性与方法都见面并发在外类似中:

  • Object类中的性质:
    • constructor,指向创建对象的函数,对于Object类,它独自想object()函数;
    • prototype,对拖欠目标的靶子原型的援;
  • Object类中之法子:
    • hasOwnProperty(property),判断目标是否来有属性,property为字符串;
    • isPrototypeOf(object),判断该对象是否也另外一个目标的原型;
    • propertyIsEnumerable(property),判断给定的性是否可就此for…in语句进行枚举(一般从定义之目标属性都是可枚举的);
    • toString(),返回对象的字符串表示。
    • valueOf(),返回最可该目标的原始值。对于多近似,该办法返回的价都与toString()一样。

以上的各个种属性与艺术都足以被object的派生类覆盖。

 

关于目标来以下几点需要说明:

1.动态增加性能

在ECMAScript中,对象的习性可以动态地增删,比如下面的以身作则:

            var person = new Object();
            person.name = "LingXiaoMo";
            person.year = 20;

2.动态增加方法

对象的章程就是是一个函数,也得以动态地添,然后按函数的道调用,比如下面的示范:

            person.printInfo = function printInfo() {
                console.log("name-" , this.name , "year-" , this.year);
            }
            person.printInfo();

3.动数组下标访问属性和措施

靶的特性和方式竟然可以使数组下标的形式来做客。比如这样:

            console.log(person["name"]);             // ->person.name
            person["printInfo"]();                         // ->person.printInfo()

  []惨遭之物给“索引”,这里的目是字符串,而非是咱大的平头。是免是想开了Key-Value(键值对)?

4.使for…in枚举对象属性

面前我们提过propertyIsEnumerable()方法可以判断一个对象的习性是否足以枚举。多数由定义属性与方法都是可枚举的,而放开对象要宿主对象的大部分核心属性是免克枚举的。枚举对象属性时我们用数组下标法访问对象属性。看如下的言传身教:

            for(var prop in person) {
                console.log(prop,",",person[prop]);
            }

5.靶的字面量表示法

眼前早已为此了数字字面量、字符串字面量:

    • 有QML代码中直接输入的数字让作是数字字面量;
    • 字符串字面量可以用对引号(”)或单引号(’)来声称;

事实上对象也克因此配面量表示:

            var person = {
                "name": "LingXiaoMo",
                "year": 20
            }

  上面的代码和眼前先构造Object再上加属性的不二法门,得到的凡同等的靶子。

  对象的字面量表示法,语法是这么的:使用同样对花括号表示一个靶,其性质为Key:Value对的形式在其括号内,多独特性之间以
逗号
分隔;如果一个性质本身是目标,还足以动用字面量表示法来嵌套描述。

  • String

String、Boolean、Numble都来自己之对象表示法,一般还采取原始值。

公可以这样构造一个String对象:

        var str = new String("I\'m a string");

  对字符串有以下基本操作:

1.字符串长度

length属性返回字符串中的字符个数:

            console.log(str.length);

  对于String的原始值,同样好通过length属性获知字串长。比如:

            console.log("I\'m a string".length);

2.拜访单个字符

charAt()方法可看指定索引位置的字符;

得经过数组下标法访问指定位置的字符;

假定charCodeAt()方法返回指定位置字符对应之Unicode编码;

下是粗略的演示:

            console.log(str.charAt(2));               // 输出m
            console.log(str[0]);                        // 输出I
            console.log(str.charCodeAt(1));        // 输出39

3.查摸索字串

indexOf()方法从字符串的启检索子串,lastInderOf()方法从字符串的末梢开始检索子串,它们返回子串在字符串中之位置,如果搜索不交则赶回-1.这简单独艺术发生一个可选参数,指定开始查找的职务;

search()方法用于检索字符串中指定的字符串,或找和正则表达式相配合的子字符串。区分轻重缓急写,且只能打字符串的初步进行查找;

match()方法可当字符串内找指定的值,或者搜索匹配指定正则表达式的一个要么多独子串。返回一个存有符合规则的子串的数组;

注:

面4栽方式都分别轻重缓急写。以一个疏忽大小写的正则表达式为参数调用search()或match()方法,可实现忽略大小写的检索。

简单的以身作则:

            console.log(str.indexOf("ing",4));         // 输出9
            console.log(str.search(/String/));          // 输出-1
            console.log(str.search(/String/i));         // 忽略大小写,输出6
            console.log(str.match("tri"));               // 输出[tri]
            var numberSource = new String("2014-08-18, I got 96");
            var results = numberSource.match(/\d+/g);
            console.log(results.length);                  // 输出4
            console.log(results);                             // 输出[2014,08,18,96]

4.字符串比较

利用超过(>)、小于(<)、等于(==)三独运算符比较字符串,使用的凡字符的Unicode编码进行较,忽略了同地面语言环境相关的语义和排序规则。

localeCompare()方法在较字符串时,默认使用底层操作系统提供的排序规则。等于时返回0,大于时回来1,小于时返回-1。

示范代码有:

            var str1 = "Qt";
            var str2 = "qt";
            var str3 = "ok";
            console.log(str1<str2);                // true
            console.log(str1.localeCompare(str2));           // 1
            console.log(str3.localeCompare(str2));           // -1

  可以看出第3实践及第4实践的结果不平等,真让人意想不到。

5.连接字符串

concat()方法用于连接两独或多个字符串,返回一个新的字符串。

实质上被,使用”+“号可能会见重复便宜一些,效果一样。

6.提取子串

提子串的点子发生三个:

      • slice():
        两只参数,第一独参数表示起初位置,第二个参数表示了位置(截取的子串不包这职务上字符);
      • substring():
        两只参数,与slice()类似,此方法总是将于小之参数作为开局位置,比如substring(1,3)和substring(3,1)效果一样;
      • substr():
        两单参数,第一只参数表示其实位置,第二独代表用提取子串的长度;

注:

上述三独办法还可以无指定第二个参数,如不点名则归从开头位置到为止的具有字符;

slice()和substring()两独方法的不同之处在于针对负数参数的拍卖:前者遇到负数时,会动用”从串尾倒数“这种政策,而后者则是拿负数当作0来拍卖。

7.尺寸写转换

  实现大小写转换的有四单方法:

  • 大写->小写
    • toLowerCase()
    • toLocaleLowerCase()
  • 小写->大写
    • toUpperCase()
    • toLocaleUpperCase()

8.字符串替换

replace方法可兑现之意义。它的率先单参数是一个字符串原始值或者正则表达式,第二独参数是新字符串。

9.运arg()进行价值替换

arg()是Qt C++中的东西,在此是QML对实现ECMAScript时开的扩展。

arg()的语法是:string
arg(value)。其中value可以是数字、字符串、布尔值、对象等,它用来替换发出调用的字符串对象内的%1、%2、%N等占位符;布尔值会吃轮换为1或0;对于目标,则用toString()方法变后底结果来替换对应的挤占位符。arg()会回到一个新的字符串对象。

以身作则代码有:

            var expression = "%1 < %2 = %3";
            var result = expression.arg(7).arg(8).arg("true");

  

亟待小心的凡,String类型的靶子是特读的,凡是牵涉到修改的动作,母串本身不见面转。另外,字符串原始值是黑对象,它好行使String类的所有属性和方。

String类说到此处,不再多言。

  • RegExp

在Qt
C++中有QRegExp,在QML中来RegExp,它们是指向字符串执行模式匹配的强大工具。

每当ECMAScript中支持的片种植结构正则表达式的章程:

    • 字面量语法:/pattern/attributes
    • 创建RegExp对象:new RegExp(pattern,attributes)

或RegExp(pattern,attributes)。

至于正则表达式的修饰符、元字符等其它情节,这里小还有些过。

  • Array

当ECMAScript中数组都是动态的,其大小可以随时变动,而且数组中之元素类型可以不同。

下我们来探对数组的基本操作:

1、数组的缔造

          var arrayObj = new Array(); //创建一个数组

          var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限,是长度

          var arrayObj = new Array([element0[, element1[, ...[, elementN]]]]); //创建一个数组并赋值 

   要说明的是,虽然第二种艺术创建数组指定了长短,但实际上有情况下屡次组都是移长的,也就是说即使指定了长为5,仍然可以以元素存储于确定长度以外的,注意:这时长度会随之改变。

2、数组的要素的访

            var testGetArrValue=arrayObj[1]; //获取数组的元素值

            arrayObj[1]= "这是新值";              //给数组元素赋予新的值

3、数组元素的长

            arrayObj. push([item1 [item2 [. . . [itemN ]]]]);// 将一个或多个新元素添加到数组结尾,并返回数组新长度

            arrayObj.unshift([item1 [item2 [. . . [itemN ]]]]);// 将一个或多个新元素添加到数组开始,数组中的元素自动后移,返回数组新长度

            arrayObj.splice(insertPos,0,[item1[, item2[, . . . [,itemN]]]]);//将一个或多个新元素插入到数组的指定位置,插入位置的元素自动后移,返回""。

4、数组元素的删减

            arrayObj.pop(); //移除最后一个元素并返回该元素值

            arrayObj.shift(); //移除最前一个元素并返回该元素值,数组中元素自动前移

            arrayObj.splice(deletePos,deleteCount); //删除从指定位置deletePos开始的指定数量deleteCount的元素,数组形式返回所移除的元素

5、数组的截取和联

            arrayObj.slice(start, [end]); //以数组的形式返回数组的一部分,注意不包括 end 对应的元素,如果省略 end 将复制 start 之后的所有元素

            arrayObj.concat([item1[, item2[, . . . [,itemN]]]]); //将多个数组(也可以是字符串,或者是数组和字符串的混合)连接为一个数组,返回连接好的新的数组

6、数组的正片

            arrayObj.slice(0); //返回数组的拷贝数组,注意是一个新的数组,不是指向

            arrayObj.concat(); //返回数组的拷贝数组,注意是一个新的数组,不是指向

7、数组元素的排序

            arrayObj.reverse(); //反转元素(最前的排到最后、最后的排到最前),返回数组地址

            arrayObj.sort(); //对数组元素排序,返回数组地址   

8、数组元素的字符串化

            arrayObj.join(separator); //返回字符串,这个字符串将数组的每一个元素值连接在一起,中间用 separator 隔开。

            //toLocaleString 、toString 、valueOf:可以看作是join的特殊用法,不常用

数组对象的3独特性:

1、length 属性

  Length属性表示数组的长度,即内部元素的个数。因为屡屡组的目总是由0开始,所以一个数组的上下限分别是:0和length-1。和其他多数语言不同的是,ECMAScript数组的length属性是可变的,这或多或少索要特别注意。当length属性被设置得重新怪时,整个数组的状态其实不见面发生变化,仅仅是length属性变死;当length属性被设置得比原来小时,则原先数组中索引大于或等于length的要素的价值周为遗失。下面是现身说法改变length属性的例证:

            var arr=[12,23,5,3,25,98,76,54,56,76];

            //定义了一个包含10个数字的数组

             //显示数组的长度10

            arr.length=12; //增大数组的长度


             //显示第9个元素的值,为56

            arr.length=5; //将数组的长度减少到5,索引等于或超过5的元素被丢弃

             //显示第9个元素已经变为"undefined"

            arr.length=10; //将数组长度恢复为10

             //虽然长度被恢复为10,但第9个元素却显示"undefined"

  由地方的代码我们得以解的看来length属性的特性。但length对象不仅可显式的装,它也发出或吃隐式修改。ECMAScript中得以动用一个无声明了之变量,同样,也足以以一个休定义之数组元素(指索引超过或等于length的素),这时,length属性的价值将吃安装也所用要素
索引的值加1。例如下面的代码:

            var arr=[12,23,5,3,25,98,76,54,56,76];

            arr[15]=34;

2、prototype 属性

返回对象类型原型的援。prototype 属性是 object 共有的。

objectName.prototype

objectName 参数是object对象的名号。

证实:用 prototype 属性提供靶的好像的等同组基本功能。
对象的新实例“继承”赋予该对象原型的操作。

对此数组对象,以以下例子说明prototype 属性的用。

吃数组对象上加返回数组中极度要命首素值的点子。要到位就一点,声明一个函数,将它们参加
Array.prototype, 并使用它。

      function array_max()
       {
          var i,
          max = this[0];
          for (i = 1; i < this.length; i++)
          {
              if (max < this[i])
              max = this[i];
          }
          return max;
      }
      Array.prototype.max = array_max;
      var x = new Array(1, 2, 3, 4, 5, 6);
      var y = x.max();

3、constructor 属性

代表创建对象的函数。

object.constructor //object是目标要函数的称呼。

证实:constructor 属性是负有有 prototype 的目标的分子。constructor
属性保存了针对性结构特定目标实例的函数的援。

例如:

      x = new String("Hi");

      if (x.constructor == String) // 进行处理(条件为真)。

  或

      function MyFunc {
         // 函数体。
      }
      y = new MyFunc;
      if (y.constructor == MyFunc){} // 进行处理(条件为真)。

  对于数组来说:

            y = new Array();

 

关于Math、Data等品类请移驾到Qt帮助模式下,以重要字检索即可!

6.函数

首先,ECMAScript不支持函数重载,然后我们加以函数语法。

函数语法如下:

    function functionName(arg1,arg2,...,argN) {
        // 要执行的代码
    }
  • function是概念函数时要下的最主要字;
  • 小括号内arg参数可以不加以;
  • functionName可以任意取,符合变量命名规则即可;
  • 花括号内是要是实施的代码块;
  • 函数要返回回值时,可以就此return语句;

 其他的部分运算符、优先级及循环语词和法决定语句,这里一概不论,下面说说这个console。

7.使用console

console是和实现ECMAScript的宿主环境有关的一个目标,提供了出口日志信息、断言、计时器、计数器、性能分析等功用。

前面一直下的console.log()是为此来输出调试信息的,console对象提供了多只打印调试信息的措施:

  • console.log();
  • console.debug();
  • console.info();
  • console.warn();
  • console.error();

这些办法是调剂QML的利器,我们盖console.log()为例来说明,它可以打印下列信息:

  • 字符串
  • 数字
  • 数组
  • 随机实现toString()方法的对象

示范代码有:

    console.log("I\'m minor,^_^");
    console.log("I\'m ", 16);
    var array = new Array(10,12,8,"Anna");
    console.debug("print array:",array);

  还有一个常用之功用就是是计时器:

  • console.time(tag)启动定时器,字符串类型的tag是必的;
  • console.timeEnd(tag)停止计时器;

简言之示例如下:

    console.time("控制台计时器一");
    for(var i=0;i<1000;i++){
      for(var j=0;j<1000;j++){}
    }
    console.timeEnd("控制台计时器一");

 

哼,路还以继承,只不过本节到此结束吧!

 

转载请注明博客来源:http://www.cnblogs.com/lxmwb/p/6291220.html