JavaScript探究总结(1):数据类型和变量声明

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它返回值是一个字符串,该字符串说明运算数的类型。
instanceofinstanceof 运算符用来检测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关键字声明的常量必须初始化且不允许被重新赋值。当然对于引用类型(对象),只是不能改变引用,但是可以改变引用类型的属性。

参考:

本文参考了以下的博客/书籍,大部分建立在对资料的理解和重新整理上,少部分内容直接转自原文。

  1. js中的Symbol数据类型
  2. JS中typeof与instanceof的区别
  3. JavaScript 中的var和let
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值