变量
合法的变量命名规则:
- 大小写字母、数字、
$
和_
的组合 - 不能用数字开头。
- 不能是关键字/保留字
javascript基础知识(在javascript中 = 是赋值符号)
var a; // 声明变量
var s = 2; // 声明变量并赋值
JavaScript 中有
11
种数据类型
null
: 空值undefined
:未定义string
:字符串number
: 数字boolean
:布尔symbol
:符号bigNInt
:大数map
:mapweakMap
:weakMapset
:集合weakSet
:weakSet其中
symbol
、bigNumber
、map
、weakMap
、set
、weakSet
是es6及其以后新增的数据类型
Number
JavaScript 只有一种数字类型。数字可以带小数点,也可以不带
123; // 整数123
0.456; // 浮点数0.456
1.2345e3; // 科学计数法表示1.2345x1000,等同于1234.5
-99; // 负数
NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示
Infinity; // Infinity表示无限大,当数值超过了Number所能表示的最大值时,就表示为Infinity
Boolean
布尔(逻辑)只能有两个值:true 或 false
var x=true
var y=false
String
字符串是存储字符(比如 "Bill Gates")的变量。
字符串可以是引号中的任意文本。您可以使用单引号或双引号:
var answer="Nice to meet you!";
var answer="He is called 'Bill'";
var answer='He is called "Bill"';
null 和 undefined
null 表示一个“空”的值,它和 0
以及空字符串 ''
不同, 0
是一个数值, ''
表示长度为 0
的字符串,而 null
表示“空”。
在其他语言中,也有类似 JavaScript 的 null
的表示,例如 Java 也用 null
,Swift 用 nil
,Python 用 None
表示。但是,在JavaScript中,还有一个和 null
类似的 undefined
,它表示“未定义”。
JavaScript 的设计者希望用 null
表示一个空的值,而 undefined
表示值未定义。事实证明,区分两者的意义不大。大多数情况下,我们都应该用 null
。 undefined
仅仅在判断函数参数是否传递的情况下有用。
Array
数组是一组按顺序排列的集合,集合的每个值称为元素。JavaScript的数组可以包括任意数据类型
例如:
[1, 2, 3.14, 'Hello', null, true];
上述数组包含 6 个元素。数组用 []
表示,元素之间用 , 分隔。
另一种创建数组的方法是通过 Array()
函数实现:
new Array(1, 2, 3); // 创建了数组[1, 2, 3]
然而,出于代码的可读性考虑,强烈建议直接使用 []
。
数组的元素可以通过索引来访问。请注意,索引的起始值为 0
:
var arr = [1, 2, 3.14, 'Hello', null, true];
arr[0]; // 返回索引为0的元素,即1
arr[5]; // 返回索引为5的元素,即true
arr[6]; // 索引超出了范围,返回undefined
Object
JavaScript的对象是一组由键-值组成的无序集合,例如:
var person = {
name: 'Bob',
age: 20,
tags: ['js', 'web', 'mobile'],
city: 'Beijing',
hasCar: true,
zipcode: null
};
JavaScript 对象的 键(key) 都是字符串类型,值可以是任意数据类型。上述 person
对象一共定义了 6 个键值对,其中每个键又称为对象的属性,例如: person
的 name
属性为 'Bob'
,zipcode
属性为 null
。
要获取一个对象的属性,我们用 对象变量.属性名
或者 对象变量[属性名]
的方式:
person.name; // 'Bob'
person["name"]; // 'Bob'
map
JavaScript 的对象(Object
),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。
为了解决这个问题,ES6 提供了 Map
数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object
结构提供了“字符串—值”的对应,Map
结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map
比 Object
更合适。
const map = new Map();
const obj = {
p: 'Hello World'};
map.set(obj, 'content')
map.get(obj) // "content"
map.has(obj) // true
map.delete(obj) // true
map.has(obj) // false
weakMap
weakMap
结构与Map
结构类似,也是用于生成键值对的集合。
weakMap
与 Map
的区别有三点。
weakMap
只接受对象(null
除外)和 Symbol 值作为键名,不接受其他类型的值作为键名。const map = new WeakMap(); map.set(1, 2) // 报错 map.set(null, 2) // 报错 map.set(Symbol(), 2) // 不报错
weakMap
的键名所指向的对象,不计入垃圾回收机制。weakMap
没有遍历方法,也没有size
属性。
set
它类似于数组,但是成员的值都是唯一的,没有重复的值。Set
本身是一个构造函数,用来生成 Set 数据结构。
const s = new Set();
[1, 3, 5, 4, 5, 2, 2, NaN, NaN].forEach(x => s.add(x));
for (let i of s) {
console.log(i); // 1 3 5 4 2 NaN
}
// 最终的 set的值: 1 3 5 4 2 NaN
// NaN 只有一个则表明在 Set 内部,两个`NaN`是相等的。
weakSet
WeakSet 结构与 Set 类似,也是不重复的值的集合。
但是,它与 Set
有两个区别。
- WeakSet 的成员只能是对象和 Symbol 值,而不能是其他类型的值。
const wset = new WeakSet(); wset.add("a") // 报错 wset.add(Symbol()) // 不报错
- weakSet 中的对象都是弱引用,即垃圾回收机制不考虑 weakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。