基础类型
7 种基本类型
多数情况下,基本类型直接代表了最底层的语言实现。 所有基本类型的值都是不可改变的。但需要注意的是,基本类型本身和一个赋值为基本类型的变量的区别。变量会被赋予一个新值,而原值不能像数组、对象以及函数那样被改变。
有String、Boolean、Number三个包装类,这三个包装类的作用是为了能够创建这三个基本数据类型对象
- 2个基本类型
- string
- boolean
- 2个数字
- number
- bigint
- 2个空
- null
- undefined
- 特殊的symbol
- symbol (Symbol() 函数会返回 symbol 类型的值, 注意大小写)
String
var str = 'hello world'
定义了一个 str 变量,同时给变量 str 赋值 'hello world' 字符串,此时 str 的值为字符串 'hello world',类型为基本类型。var str1 = String('hello world')
这是字符串声明的形式创建了字符串,此时 str1 的值也为字符串 'hello world',类型为基本类型。var str2 = new String('hello world')
此时的String为一个构造函数,而 new 操作符创建了一个字符串对象
Symbol
下面的话注意区分大小写
symbol
是一种基本数据类型(primitive data type)。Symbol()
函数会返回 symbol 类型的值Symbol.for()
方法创建的的 symbol 会被放入一个全局 symbol 注册表中。Symbol.for() 并不是每次都会创建一个新的 symbol
,它会首先检查给定的 key 是否已经在注册表中了。假如是,则会直接返回上次存储的那个。否则,它会再新建一个- `Symbol.keyFor(sym)`` 用来获取全局 symbol 注册表中与某个 symbol 关联的键。
var globalSym = Symbol.for("foo");
Symbol.keyFor(globalSym); // "foo"
var localSym = Symbol();
Symbol.keyFor(localSym); // undefined,
Symbol.hasInstance
用于判断某对象是否为某构造器的实例。因此你可以用它自定义instanceof
操作符在某个类上的行为。
class Array1 {
static [Symbol.hasInstance](instance) {
return Array.isArray(instance);
}
}
console.log([] instanceof Array1);
// expected output: true
Symbol.isConcatSpreadable
符号用于配置某对象作为Array.prototype.concat()
方法的参数时是否展开其数组元素。
const alpha = ['a', 'b', 'c'];
const numeric = [1, 2, 3];
let alphaNumeric = alpha.concat(numeric);
console.log(alphaNumeric);
// expected output: Array ["a", "b", "c", 1, 2, 3]
numeric[Symbol.isConcatSpreadable] = false;
alphaNumeric = alpha.concat(numeric);
console.log(alphaNumeric);
// expected output: Array ["a", "b", "c", Array [1, 2, 3]]
- Symbol.iterator 为每一个对象定义了默认的迭代器。该迭代器可以被
[for...of](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for...of)
循环使用。
var myIterable = {}
myIterable[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
};
[...myIterable] // [1, 2, 3]