内置对象是定义在 任何由 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