JavaScript数据类型
值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol(ES6新增)。
引用数据类型:对象(Object)、数组(Array)、函数(Function)。
String和new String()的区别
String("abc"); // 或者 "abc";
new String("abc")
“abc”
new String("abc");
String {“abc”}
0: “a”
1: “b”
2: “c”
length: 3
_proto_: String
[[PrimitiveValue]]: “abc”
这两种写法的区别在于第一个是一个基本数据类型string,是值类型。
第二种写法实际生成了一个String对象,然后返回它的引用,是引用数据类型。
我们可以使用typeof来查看:
typeof "abc";
typeof new String("abc");
“string”
“object”
但是在JavaScript中有类似Java的自动装包/拆包机制:
"abc".concat("def");
new String("abc").concat("def");
“abcdef”
“abcdef”
基本数据类型也可以直接当做对象直接调用方法。
类似地,Boolean和Number也有类似的性质。
Symbol
Symbol 本质上是一种唯一标识符,可用作对象的唯一属性名,这样其他人就不会改写或覆盖你设置的属性值。
let id1 = Symbol("id");
let id2 = Symbol("id");
let obj = {
[id1]:'val1',
[id2]:'val2'
};
obj;
{Symbol(id): “val1”, Symbol(id): “val2”}
如果使用原始的键值对的方式,显然后面声明的属性会覆盖前面声明的属性。
Symbol 数据类型的另一特点是隐藏性,for···in,object.keys() 不能访问
let id = Symbol("id");
let obj = {
[id]:'symbol'
};
for(let option in obj){
console.log(obj[option]); //空
}
方法 | 作用 |
---|---|
Symbol.for(string s) | 若字符串s的symbol值存在则返回,否则创建新的symbol值,这样可以多次使用同一个symbol值 |
Symbol.keyFor(any) | 返回变量的symbol值 |
typeof 和 instanceof的区别
运算符 | 作用 |
---|---|
typeof | 它返回值是一个字符串,该字符串说明运算数的类型。 |
instanceof | instanceof 运算符用来检测constructor.prototype 是否存在于参数 object 的原型链上 |
console.log(typeof undefined);
console.log(typeof null);
console.log(null instanceof Object);
console.log(undefined instanceof Object);
undefined
object
false
false
instanceof在object的原型链上不断向上寻找,直到找到constructor.prototype或者找到根原型Object为止。
我们显然可以看到最重要的一个区别在于,typeof将null看做object类型,而instanceof不会。
因为undefined和null不是object类型,所以它没有prototype属性。
下面两行均会报错,所以我们在使用instanceof的时候还是要非常注意。
null instanceof undefined;
null instanceof null;
BigInt
BigInt 是一种内置对象,它提供了一种方法来表示大于 2^53 - 1 的整数。这原本是 Javascript中可以用 Number 表示的最大数字。BigInt 可以表示任意大的整数。
可以用在一个整数字面量后面加 n 的方式定义一个 BigInt ,如:10n,或者调用函数BigInt()。
- 当使用 BigInt 时,带小数的运算会被取整。
- BigInt 和 Number 不是严格相等的,但是宽松相等的。
- Number 和 BigInt 可以进行比较。
- 对任何 BigInt 值使用 JSON.stringify() 都会引发 TypeError,因为默认情况下 BigInt 值不会在 JSON 中序列化。但是,如果需要,可以实现 toJSON 方法。
- BigInt目前在IE、Edge、Safari中都不支持。
更多参考:
BigInt-MDN
变量声明
关键字 | 作用域 | 变量提升 | 重复声明 |
---|---|---|---|
var变量 | 封闭函数 | 有 | 允许 |
let变量 | 块级 | 无 | 不允许 |
const变量 | 块级 | 无 | 不允许 |
for(var i = 0; i < 10; ++i);
console.log(i);
for(let j = 0; j < 10; ++j);
console.log(j);
第二行输出10,第四行抛出错误。
const和let非常类似,区别在于const关键字声明的常量必须初始化且不允许被重新赋值。当然对于引用类型(对象),只是不能改变引用,但是可以改变引用类型的属性。
参考:
本文参考了以下的博客/书籍,大部分建立在对资料的理解和重新整理上,少部分内容直接转自原文。