JS 中的内置对象思维导图

104 阅读2分钟

内置对象是定义在 任何由 ECMAScript 实现提供、与宿主环境无关,程序开始执行时就存在的对象,因此不需要显式地实例化内置兑现过,因为他们在成勋开始执行的时候就实例化好了,比如 Object、Array、String、Global 和 Math

Global 对象

编码和解码

const uri = "https://www.yuque.com/yifenkejie/illegal test#hash";

// 不会编码属于 URL 组件的特殊字符,比如此处只是对空格被替换为了 %20
log(encodeURI(uri)); // log: https://www.yuque.com/yifenkejie/illegal%20test#hash

// encodeURI编码,decodeURI解码
log(decodeURI(encodeURI(uri))); // log: https://www.yuque.com/yifenkejie/illegal test#hash

// encodeURIComponent() 编码了整个 非字母字符,将非字母字符都替换成了相应的编码形式
// ⚠️: 一般来说,encodeURIComponent应该比使用encodeURI的频率高很多,因为编码查询字符串参数比编码基准 URI 的次数更多
log(encodeURIComponent(uri)); // log: https%3A%2F%2Fwww.yuque.com%2Fyifenkejie%2Fillegal%20test%23hash

// encodeURIComponent 编码所有非字母字符,decodeURIComponent(uri) 替换所有特殊字符,
log(decodeURIComponent(encodeURIComponent(uri))); // https://www.yuque.com/yifenkejie/illegal test#hash

eval 解释器

// eval 接受 str 类型的 code 
eval("console.log('hi')"); // 将会在控制台打印 hi

// eval 可以使用当前作用域的变量
const msg = "hello world";
eval("console.log(msg)"); // log: hello world

const msg = "hello world";
eval("console.log(msg)"); // log: hello world

eval("function sayHi() { console.log('hi'); }");
sayHi(); // 调用 eval 内部的函数

eval("var w = 'world'");
console.log(w); // 获取 eval 中的变量

浏览器的 window 对象

ECMA 没有规定直接访问 Global 对象的方式(即 Global 不可以通过代码直接访问),但是浏览器将 window 对象实现为 Global 对象的代理,因此浏览器中全局作用域中声明的变量和函数都变成了 window 的属性

获取 global 的方式

打开浏览器 console 控制台

// 在浏览器宿主环境中 通过立即执行函数 获取 Global 对象的方式 
const global = (() => this)();

Math 对象

log(Math.ceil(25.1)); // log: 26
log(Math.ceil(25.9)); // log: 26

// 向下取整(小数点前的整数)
log(Math.floor(25.1)); // log: 26
log(Math.floor(25.9)); // log: 26

// 四舍五入
log(Math.round(25.4)); // log: 25
log(Math.round(25.5)); // log: 26

// 最接近单精度 32 位 浮点值
log(Math.fround(0.5)); // log: 0.5
log(Math.fround(0.4)); // log: 0.4000000059604645

log("------------ split line -----------");
// [0,1) 范围内的随机数
log(Math.random());

// 获取 [1,10) 的随机数
log(Math.random() * 10 + 1);

// 使用 Math.random() 来获取 [minNum,maxNum) 的随机数
const getRangeRandom = (minNum, maxNum) => {
  const rangeLength = Math.abs(maxNum - minNum + 1);

  return Math.random() * rangeLength + minNum;
};

getRangeRandom(2, 10); // 获取 2 ~ 10 的随机数

const nums = [2, Math.sqrt(12)];
log(Math.hypot(...nums)); // log: 4, 因为 2的平方 + (根号 12)的平方和为 16,16 的平方根 为 4