JavaScript基础: 类型与值

163 阅读5分钟

内置类型

基本类型与引用类型

image.png

两种数据类型的区别

image.png

关于Symbol

Symbol是ES6新增的一种数据类型,代表创建后独一无二且不可变的数据类型,Symbol最大的用途是用来定义对象的唯一属性名和解决全局变量冲突的问题。

blog.csdn.net/imagine_tio…

关于BigInt

BigInt是一种数字类型的数据,它可以表示任意精度格式的整数,使用 BigInt 可以安全地存储和操作大整数,即使这个数已经超出了 Number 能够表示的安全整数范围( 最大整数是 2^53 - 1,最小整数是 -(2^53 - 1))。

segmentfault.com/a/119000001…

使用typeof进行数据类型转换

关于typeof

image.png

image.png

typeof的输出值

image.png

数据类型转换

image.png

对JavaScript 值 的理解

image.png

严格意义上来说,变量对象也是存放于堆内存中,但是由于变量对象的特殊职能,我们在理解时仍然需要将其于堆内存区分开来。

强制类型转换

image.png

理解显式和隐式强制类型转换之前,需要先掌握字符串、数字和布尔值之间类型转换的基本规则

字符串、数字和布尔值之间类型转换的基本规则

image.png

显式强制类型转换

显示强制类型转换是指代码有明确意图的转换,是显而易见的。

image.png

一个原始类型能调用toString()方法,是因为在这个过程中,原始类型会自动装箱(boxing) ,被封装成一个对象,从而有调用其包装对象函数的能力,但是原来那个变量的值不会有任何变化。

非字符串参数会被隐式转换为字符串,会有各种bug,强烈不建议这么做。传参前请进行类型检查。另外,parseInt一般会指定转换的基数,即使几进制。

隐式强制类型转换

image.png

拓展问题

为什么typeof null 为"object"

null是唯一一个用typeof检测会返回object基本类型值

原因是因为不同的对象在底层都表示为二进制,在Javascript中二进制前三位都为0的话会被判断为Object类型,null的二进制表示全为0,所以执行typeof时会返回"object"。这可能是设计上的一种失误

000 对象
010 浮点数
100 字符串
110 布尔值
1   整数

null:所有码都是0
undefined:用 -2^30 表示

null 和undefined的区别

首先null和undefined都是基本数据类型且都只有一个值,就是undefined和null。

  1. 从语义上区分,null更多的表示引用语义 而 undefined更多的表示值语义。

    如果定义的变量在将来用于保存对象,那么最好将该变量初始化为null。如果声明了变量或者属性但是没有赋值,该变量或属性的值就等于undefined,函数没有返回值是也默认返回undefined。

  2. null表示的是一个值被定义了,但undefined根本不存在定义。

    设置一个值为null是合理的,但设置一个值为undefined就是不合理的。因此判断一个值存在应该用是否严格等于undefined。 不能使用null判断因为 null==undefined而null表示的是一个空值。

instanceof 判断数据类型的原理

原理:
原型链的查询,检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

关于instanceof:
instanceof 用来比较一个对象是否为某一个构造函数的实例。注意,instanceof运算符只能用于对象,不适用原始类型的值。

手写代码:

const newInstanceof = (left, right) => {
  // 左边实例对象 右边构造函数

  let leftProto = left.__proto__;
  const rightPrototype = right.prototype;

  while(true) {
    if (leftProto === rightPrototype) {
      return true;
    }

    if (leftProto === null) {
      return false;
    }

    leftProto = leftProto.__proto__;
  }
}
Object instanceof Object // true
Function instanceof Function // true
Function instanceof Object // true
Object instanceof Function // true

function Foo() {};

Foo instanceof Foo // false
new Foo() instanceof Foo // true
Foo instanceof Object // true
Foo instanceof Function // true

再次附上此图 image.png

undefined 与 undeclared 的区别

已经在作用域内声明但是还没有赋值的变量,是undefined。 还没有在作用域中声明过的变量是undeclared。

在浏览器中引用undeclared,会报错: ReferenceError: b is not defined

并且typeof 对undefined 和 undeclared 变量返回的都是undefined

typeof的安全防范机制

typeof的容错机制可以用来检查undeclared(未声明)变量,而不是直接报错

我们经常会先判断一个变量存不存在,然后再来使用这个变量:

if(debug) {
    console.log('Debugging is starting!');
}

冒昧的去声明一个变量并不是一个很好的解决方法。这个时候就可以利用typeof的防范机制:如果一个变量a未声明,那么typeof a不会报语法错误,而是会返回undefined。

关于 == 和 ===

== 允许在相等比较中进行强制类型转换,而 === 不允许

[]+{} 和 {} + []

image.png

表面上看 + 运算符根据第一个操作数([] 或 {})的不同会产生不同的结果,实则不然。

第一行代码中,{} 出现在 + 运算符表达式中,因此它被当作一个值(空对象)来处理。

[] 会被强制类型转换为 "",而 {} 会被强制类型转换为 "[object Object]"。

但在第二行代码中,{} 被当作一个独立的空代码块(不执行任何操作)。

代码块结尾不需要分号,所以这里不存在语法上的问题。

最后 + [] 将 [] 显式强制类型转换(参见第 4 章) 为 0。

一元运算符的力量

+和 - 0 能显式地将非数字转换为数字。

image.png

进阶

www.jianshu.com/p/3957c1363…

github.com/amandakelak…