js类型转换和运算规则

前言

本文主要对于js中的数据类型转换进行总结,内容如下:

  1. 类型转换规则
  2. 运算规则
  3. 表达式
  4. 常用代码优化

1. 类型转换规则

1.1 原始数据类型

  • Null
  • Undefined
  • Boolean
  • String
  • Number
  • Symbol
  • BigInt

1.2 引用数据类型

  • Array
  • Boolean
  • Date
  • Function
  • NaN
  • Number
  • Object
  • String
  • null

详情请参考MDN

引用数据类型都是通过内部方法调用进行转换。

1.3 自动装箱(Autoboxing)

在 JavaScript 中,存在着一种称为自动装箱(Autoboxing)的机制。自动装箱是指 JavaScript 在需要时将基本数据类型(如数字、字符串、布尔值)自动转换为对应的包装对象(Number、String、Boolean)的过程。

当你使用基本数据类型的方法时,JavaScript会自动将基本数据类型转换为包装对象,以便调用对应的方法。

例如:

javascript 复制代码
let num = 10; // 基本数据类型
let numObj = new Number(num); // 手动创建包装对象

console.log(num.toFixed(2)); // 这里会发生自动装箱,将基本数据类型转换为包装对象

num.toFixed(2) 中的 toFixed() 方法需要一个对象,而 num 是一个基本数据类型的数字,但 JavaScript 会在需要时自动将 num 装箱为一个 Number 对象,以便调用 toFixed() 方法。

1.4 具体转换

对于类型转换的规则,主要有以下几种:

  1. 原始->数字
  2. 原始->字符串
  3. 所有->布尔
  4. 对象->原始

如果对象需要转成数字,则需要先转换成原始,再从原始转成数字。

总结如图所示:

案例1:重写对象valueOf和toString方法,观察调用方式

js 复制代码
const obj = {
  valueOf() {
    console.log("调用valueOf");
    return {};
  },
  toString() {
    console.log("调用toString");
    return 2;
  },
};
console.log(obj + "");

输出为:

验证了对象先调用valueOf的后调用toString。

案例二:使用Date对象,观察PreferredType是否是string,优先调用toString

js 复制代码
const date = new Date();
Date.prototype.toString = function () {
  console.log("Date调用toString");
  return "string";
};

Date.prototype.valueOf = function () {
  console.log("Date调用valueOf");
  return 1;
};

console.log(1 + date);

输出:

2. 运算规则

在 JavaScript 中,当进行运算时,会遵循一定的规则和优先级。

本次讨论三种运算方式:

  1. 算术运算:加法、减法、乘法和除法是最常见的算术运算。
  2. 逻辑运算 :逻辑运算符(如 &&||!)用于布尔值之间的运算。
  3. 比较运算 :比较运算符(如 =====!=!==<><=>=)用于比较两个值。

先看一张总结图:

3. 表达式

JavaScript表达式是由操作数(operands)和操作符(operators)组成的代码片段,可以计算出一个值。

例如:

ini 复制代码
1+1
const i = 1
arr[i]
6||11...

4. 常用代码优化

通过上面js的类型转换和运算规则,可以对一些常用代码进行一些优化。

4.1 可省略的比较

js 复制代码
var isFind = false; // isFind是一个boolean
//分别根据isFind做不同的处理
if (isFind === true) {
console.log('处理1');
} else {
console.log('处理2');
}
========优化后========
if (isFind) {
console.log('处理1');
} else {
console.log('处理2');
}
js 复制代码
var user = null; // user是一个对象或者是一个null
// 如果user为null,做一些处理
if (user === null) {
console.log('没有登录,请先登录');
}
========优化后========
if (!user) {
console.log('没有登录,请先登录');
}

4.2 转换为数字

js 复制代码
var page = '10';
page = Number(page)

========优化后========
page = +page

4.3 转换为boolean

js 复制代码
var x = 'aaaa'; // x可能是任何值将x转换为boolean保存到y中

y = Boolean(x);
========优化后========
y = !!x

4.4 使用默认值

js 复制代码
// limit可能是null、undefined、大于0的数字
var limit;
// duration如果是null或undefined, 给与默认值10
if (limit === null II limit === undefined) limit = 10;

========优化后========
limit = limit || 10

4.5 安全的读取对象属性

js 复制代码
Var user = {
name: 'deng',
addr: {
    province:'黑龙江',
    city:'哈尔滨',
  },
};

// 获取用户居住城市名
// 每个属性都有可能为null或者是undefined
// user 本身也有可能为null或者是undefined

if (user) {
    if (user.addr) {
        console.log(user.addr.city)
    }
}
========优化后========

 console.log(user && user.addr && user.addr.city)

总结

最后总结一下:

  1. 介绍了JavaScript中的原始数据类型和引用数据类型,以及自动装箱(Autoboxing)机制。
  2. 讨论了不同类型之间的转换规则。
  3. 说明算术运算、逻辑运算和比较运算的运算规则。
  4. 表达式基本概念。
  5. 常用代码优化:提供了一些常见代码优化技巧,包括可省略的比较、转换为数字、转换为布尔、使用默认值和安全的读取对象属性。

如有错误,请指正!O^O

相关推荐
云边有个稻草人7 分钟前
【Web前端技术】第二节—HTML标签(上)
前端·html·html基本结构标签·html超链接标签·html中的注释和特殊字符·vscode的使用·vscode生成骨架标签
介si啥呀~9 分钟前
解决splice改变原数组的BUG(拷贝数据)
java·前端·bug
太阳花ˉ13 分钟前
BFC详解
前端
小满zs2 小时前
React-router v7 第五章(路由懒加载)
前端·react.js
Aotman_2 小时前
Vue el-from的el-form-item v-for循环表单如何校验rules(二)
前端·javascript·vue.js
在无清风4 小时前
Java实现Redis
前端·windows·bootstrap
_一条咸鱼_6 小时前
Vue 配置模块深度剖析(十一)
前端·javascript·面试
yechaoa6 小时前
Widget开发实践指南
android·前端
前端切图仔0017 小时前
WebSocket 技术详解
前端·网络·websocket·网络协议
JarvanMo7 小时前
关于Flutter架构的小小探讨
前端·flutter