引言¶
JavaScript 最初由 Netscape 公司 的 Brendan Eich(布兰登·艾希)在 1995 年开发,仅用了10天,所以有很多设计上的缺陷。
最初起名为 Mocha,后改为 LiveScript,为了蹭 Java 的流量最后改为 JavaScipt。
JS 本身是运行在前端浏览器中的语言,但 Node.js 为 JS 提供了运行时环境,使它可以运行在后端。
也可以在任意搭载了 JS 引擎(也可称作JS虚拟机)的设备中执行,比如 V8、SpiderMonkey
ES6¶
ECMAScript,简称 ES,是 JS 的语言规范
ECMA(European Computer Manufacturers Association) 欧洲计算机制造商协会
ES6(ECMAScript 2015)是 JavaScript 语言的一个重要的更新,引入了许多新的特性和语法,使得 JavaScript 更加强大和灵活。
比如
- 变量声明关键字:let、const
- 解构赋值
- 扩展运算符
- 箭头函数
- Promises 和 异步函数
- 类(class)
- 模块(module)
- 生成器(generator)
- 迭代器(iterator)
- Symbol 类型
- 新的数据结构:Map、Set
- 新的数组和对象的方法
数据类型¶
在 JS 中,除了原始类型外,几乎所有东西都是对象。
可以用操作符 typeof x
查看数据类型,也可以写成 typeof(x)
,不过这里的 ()
只是分组的作用,并不是函数。
原始类型¶
也叫基础类型,或值类型。值类型存储在栈内存中。
把一个值类型的变量赋值给另一个变量时,是一个完整的自动复制过程。
typeof undefined // "undefined"
typeof null // "object" null其实是一个单独的类型,并不属于object,这是JS语言的一个错误
typeof 0 // "number"
typeof 10n // "bigint"
typeof "foo" // "string"
typeof true // "boolean"
typeof Symbol("id") // "symbol"
// 判断是否为整数
Number.isInteger(42); // true
Number.isInteger(42.3); // false
// 判断true或false
Boolean(0) // false
isFinite( ) // 判断某个值是否为正常数值
isNaN( ) // 判断某个值是否为NaN
// 判断一个对象是否是其任意父类派生的实例
console.log([] instanceof Object); // true
对象类型¶
实际上包括了所有非原始类型,比如 Array、Function、Promise 等,以及浏览器 DOM 和 API 等。
对象类型存储在堆内存中,准确的说存储的是指向堆内存中该值的指针,可以动态地添加、修改或删除。
在赋值时不会自动复制,而是引用,如果想复制后的新对象不被原对象影响,需要使用深拷贝。
typeof [1, 2, 3] // 'object'
typeof Math // "object" Math是内置的object
// 其实并没有函数类型,函数隶属于object类型
// 查看函数的类型返回function属于JS语言的错误,不过这个错误恰好方便一些情况的使用
typeof alert // "function"
类型转换¶
parseInt("string") // 将字符串转换为整数
parseFloat("string") // 将字符串转换为浮点数
深拷贝¶
let x = {
name: "wtf",
age: 18,
arr: [],
obj: {
a: 1,
},
};
let y = JSON.parse(JSON.stringify(x)); // 深拷贝
y.obj.a = 2; // 不会影响 x.obj.a