7.qml-ECMAScript学习(语法、关键字、原始值和引用值)

QML语法有三个核心:

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

所以ECMAScript非常重要,本章主要总结ECMAScript用法

ECMAScript语法参考链接:https://www.w3school.com.cn/js/pro_js_syntax.asp

ECMAScript内置对象参考链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects

1.语法

区分大小写

比如:变量 test 与变量 TEST 是不同的。

变量是弱类型的

定义变量时只能用 var 运算符,而不是String、int、bool之类的.初始化的时候可以赋为任意值,也可以随意改变变量所存储的数据类型(尽量避免这样做).比如:

var color = "red";
var num = 25;
var visible = true;
console.log(num)
num = "123" // 将int类型转为bool类型,不建议这样更改, 好的编码习惯是始终存放相同类型的值
console.log(num)

每行结尾的分号可有可无

最好还是加上分号,与C++代码保持一致,保持良好编码习惯

注释与 Java、C 和 PHP 语言的注释相同

比如:

// this is a single-line comment

/*
* this is a multi-line comment
*/

括号表示代码块

在左括号({)和右括号(})之间被称为代码块.

声明变量

可以用var 语句来定义多个变量:

var test1 = "hi", test2 = "hello", age = 25; 

命名变量

变量名需要遵守两条简单的规则:

第一个字符必须是字母、下划线(_)或美元符号($)
余下的字符可以是下划线、美元符号或任何字母或数字字符
下面的变量都是合法的:

var test;
var $test;
var $1;
var _$te$t2;

最好的命名方式是:

  • 方法和变量都以小驼峰方式命名
  • 类都以大驼峰方式命名
  • 枚举值之类的以全大写,下划线分割

 

2.ECMAScript 关键字

在ECMAScript中的关键字和C++关键字都类似.不一样的有:

  • new : 创建一个引用对象变量,和C++不一样,由于ECMAScript有垃圾收集器,所以我们释放时只需要置为null,由于没有对象去引用它,就可以让它释放.
  • delete : 只能用来删除对象中开发者定义的属性和方法,而不能删除一个对象.
  • return : 只能写在函数内部

++和--运算符
和C/C++一样,前置++和前置--,都是发生在计算表达式之前.

而后置++和后置--,都是发生在计算表达式之后.

var iNum1 = 2;
var iNum2 = 20;
var iNum3 = --iNum1 + --iNum2; // 1 + 19 等于 20
var iNum4 = iNum1-- + iNum2--; // 1 + 19 等于 20
var iNum5 = iNum1 + iNum2;     // 0 + 18 等于 18

 

取反~、与&、或|、异或^运算、取模运算符
在ECMAScript中, 取反~、与&、或|、异或^、%的运算规则和C++一样.示例如下:

var iNum1 = ~10;    // 10取反然后自减1,等于-11
var iNum2 = 10 & 7; // 1010 & 0111 = 0010 = 2
var iNum3 = 10 | 7; // 1010 | 0111 = 1111 = 15
var iNum4 = 10 ^ 7; // 1010 ^ 0111 = 相同为0,相异则或 = 1101 =13
var iResult = 26%5; //等于 1

for-in 语句

for-in 语句,不仅可以打印出对象里的属性和方法,还可以打印数组的内容

示例如下:

for(var i in data) {
... ...
}

switch语句

在 ECMAScript 中,switch 语句可以用于字符串,而且case语句能用变量值.非常灵巧,示例如下所示:

var BLUE = "blue", RED = "red", GREEN = "green";

switch (sColor) {
    case BLUE: console.log("Blue");
        break;

    case RED: console.log("Red");
        break;

    case GREEN: console.log("Green");
        break;

    default: console.log("Other");
}

 

3.原始值和引用值
在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值(类似于指针)

原始值 - (可以通过typeof运算符来判断)

存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。

引用值 - (可以通过instanceof运算符来判断)

存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处(只要是new出来的对象都是引用值)

而原始值有5 种类型(可以通过typeof来判断变量的类型):

  • undefined - 如果变量是 Undefined 类型的(未赋初值的变量)
  • boolean - 如果变量是 Boolean 类型的
  • number - 如果变量是 Number 类型的(不管是整数还是浮点数)
  • string - 如果变量是 String 类型的
  • object - 如果变量是一种引用类型或 Null 类型的(用于表示尚未存在的对象)

typeof 运算符
用来判断变量的是什么类型的变量.示例:

var color = "red";
var visible = true;
var num = 25;
var num1 = 025;  // 0开头的数字表示是8进制
var num2 = 0x25; // 0x开头的表示是十六进制
var oTemp;
console.log(typeof color)    // 打印string
console.log(typeof visible) //打印boolean
console.log(typeof num)     //打印number
console.log(typeof oTemp)   // 打印undefined,因为没初始值
console.log(oTemp == null)  // 打印为true

var arr = new Array;
console.log(typeof arr)            // 打印object,如果是引用类型,查看对象类型的话,需要使用instanceof运算符
console.log(arr instanceof Array) // arr引用的类型是Array,所以打印true

尽管null和undefined相等,但是意义不同,比如我们要清理一个对象,那么需要给对象赋值null,而不是undefined

 

instanceof 运算符

instanceof用来判断该对象是否为class的实例,比如下面,判断arr对象是否Array的实例:

var arr = new Array;
console.log(typeof arr)            // 打印object,如果是引用类型,查看对象类型的话,需要使用instanceof运算符
console.log(arr instanceof Array)  // arr引用的类型是Array,所以打印true

 

typeof 运算符和instanceof 运算符
instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型。与 typeof 方法不同的是:

  • instanceof 方法要求开发者明确地确认对象为某特定类型。
  • 而typeof则可以直接得出变量类型.

 

未完待续,下章我们来学习 var变量的4种基础类型Undefined 、Boolean 、Number 、String 

上一篇:模块化兼容


下一篇:javaScript中的类型和类型转换