- JavaScript引擎与运行时入门小记:在哪些环境下可以运行JavaScript
- JavaScript学习笔记(一):理解概念,一等函数、编程范式、原型、单线程
- JavaScript学习笔记(二):全局对象globalThis,this用法,全局对象们
继续梳理JavaScript基本概念。
原始值(Primitive values)
这个名字取得... 。是不是叫 原始数据类型或基础数据类型 更合适一些。
JavaScript 的原始值(primitive values)是一种既不是不是对象,也没有方法或属性的数据。所有原始值都是不可变的,它们的值不能被修改。
JavaScript 有7中原始数据类型:
- string
- number
- boolean
- undefined
- symbol
- null
这些类型,我们可以用typeof查看:
1 2 3 4 5 6 7 | |
注意:
- null 返回的类型是 object,这是历史原因造成的。以后估计也不会改了。要测试null,不能使用typeof,需要用
===null来测试。 - Symbol没有字面量写法,也不能用new创建。
- bigint后缀是n
在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于
null代表的是空指针(大多数平台下值为 0x00),因此,null 的类型标签是 0,typeof null也因此返回"object"。
包装器
这些原始数据类型没有成员方法,但是表现得却和有方法一样。比如:
1 2 3 | |
这是因为:Javascript自动将值装入包装对象中,并访问该对象的属性。
除了null和undefined外,所有的原始类型都有对象的对象包装类型:
| 类型 | 包装器 | 备注 |
|---|---|---|
| null | 不适用 | 只有一个值 null |
| undefined | 不适用 | 只有一个值 undefined |
| boolean | Boolean | 两个值 true 与 false |
| number | Numer | 包括 Infinity、-Infinity、NaN、0、-0 等 |
| string | String | |
| bigint | BitInt | |
| symbol | Symbol |
包装器属于对象类型:
1 2 3 4 5 6 7 | |
QJSEngine
QJSEngine的QJSPrimitiveValue中不包括 Symbol和BigInt,另一方面把Number分成了Integer和Double:
- QJSPrimitiveValue::Undefined
- QJSPrimitiveValue::Null
- QJSPrimitiveValue::Boolean
- QJSPrimitiveValue::Integer
- QJSPrimitiveValue::Double
- QJSPrimitiveValue::String
typeof
对原生类型
| 类型 | typeof 结果 | 备注 |
|---|---|---|
| null | "object" | 历史原因 |
| undefined | "undefined" | |
| boolean | "boolean" | |
| number | "number" | |
| string | "string" | |
| bigint | "bigint" | |
| symbol | "symbol" |
对其他类型(所有使用new调用的构造函数,都会返回下面的非基本类型):
| 类型 | typeof 结果 | 备注 |
|---|---|---|
| function/class | "function" | class也是函数 |
| 其他对象 | "object" |
代码
1 2 3 4 5 6 7 8 9 | |
注:
- 原生类型不可变。
- object和function可变。只是function也是object,只不过它多了可调用的技能!33
对象 (Objects),引用类型
在Javascript中,对象是唯一的可变的值类型,函数是其特例。函数是可执行的对象,它有自己的属性和方法,可以作为参数传递给其他函数,也可以作为其他函数的返回值,还可以创建闭包。
对象在JavaScript中是引用类型。
1 2 3 4 5 | |
JavaScript中的数组(array)、日期(date)、正则表达式(regexp)等都是对象。
对象 vs 对象
感觉有点混乱:
- new创建的所有东西都是对象。
- 使用
{}这种键值对创建的东西是对象。
为了区分,可以:
{}键值对这种叫做 普通对象[]这种array叫做 数组对象- ...
QJSEngine
对于引用类型,QJSEngine提供了 QJSManagedValue类,如下是其支持的对象类型:
- QJSManagedValue::Undefined
- QJSManagedValue::Boolean
- QJSManagedValue::Number
- QJSManagedValue::String
- QJSManagedValue::Object
- QJSManagedValue::Symbol
- QJSManagedValue::Function
引用类型不能跨多个QJSEngine使用。
字面量
字面量和 基础类型(原始值)还是引用类型(对象)没必然关系:
- 数字字面量,如
1.23,42,0x7f等 - 字符串字面量,如
"hello",'world',"你好"等 - 布尔字面量,
true和false - 空字面量,
null - 未定义字面量,
undefined - 对象字面量,用花括号
{}包围一组键值对,如{name: "Alice", age: 18} - 数组字面量,用方括号
[]包围一组元素,如[1, 2, 3] - 函数字面量,用
function关键字定义一个函数,如function(x) {return x * x;} - 正则表达式字面量,用斜杠
/包围一个模式,如/[a-z]+/ - 模板字面量,用反引号
`包围一段文本,可以嵌入表达式,如Hello, $ {name}!
小结
- 区分 基础类型(7种原始值)和 引用类型(对象 和 函数)
- 除null和undefined外,其他原始值都有对应的对象类型(使用new创建)
- 由于历史原因,null的typeof值是 'object'
- 对象和基于键值对
{}创建的普通对象 - 字面量可用于基础类型和引用类型
参考
- JavaScript 标准内置对象 - JavaScript | MDN (mozilla.org)
- 原始值 - MDN Web 文档术语表:Web 相关术语的定义 | MDN (mozilla.org)
- JavaScript 数据类型和数据结构 - JavaScript | MDN (mozilla.org)
- https://doc.qt.io/qt-6/qtqml-javascript-functionlist.html