6.把其他类型转换为字符串;7.解决浮点计算精准度丢失问题;8.函数的底层运行机制

6.把其他类型转换为字符串

/* 
 *  把其它类型转换为string 
 *    + [val].toString() & String([val])
 *      + 原始值类型:基于引号包起来、bigint会去掉n
 *      + 对象类型值:
 *        + 调用 Symbol.toPrimitive
 *        + 如果不存在则继续调用 valueOf 获取原始值,有原始值则把其转换为字符串
 *        + 如果不是原始值,则调用toString转换为字符串
 *        特殊:普通对象转换为字符串是 “[object Object]”   -> Object.prototype.toString
 * 
 *    + “+”代表的字符串拼接
 *       + 有两边,一边是字符串,则会变为字符串拼接
 *       + 有两边,一边是对象,按照 Symbol.toPrimitive -> valueOf -> toString 处理,变为字符串后,就直接按照字符串拼接处理了「有特殊情况」
 *         + {}+10  -> 10   他认为{}是代码块,处理的只是+10这个操作
 *       + 只出现在左边,例如:+[val]  这是把[val]转换为数字    ++i(先累加再运算) & i++(先运算再累加)
 *       + ...
 */
// let result = 100 + true + 21.2 + null + undefined + "Tencent" + [] + null + 9 + false;
// // 100 + true + 21.2 + null + undefined  都是数学运算 => NaN
// // NaN + "Tencent" => "NaNTencent"
// // "NaNTencent" + [] + null + 9 + false  都是字符串拼接 => "NaNTencentnull9false"
// console.log(result);

在这里插入图片描述

7.解决浮点计算精准度丢失问题

进制转换url
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/*
 * JS“骚”操作之 0.1+0.2!==0.3 
 *   @1 十进制转换为二进制的计算 n.toString(2)
 *      + 整数部分 
 *      + 小数部分
 * 
 *   @2 JS使用Number类型表示数字(整数和浮点数),遵循 IEEE-754 标准 通过64位二进制值来表示一个数字
 *      https://babbage.cs.qc.cuny.edu/IEEE-754.old/Decimal.html
 *      第0位:符号位,0表示正数,1表示负数 S
 *      第1位到第11位「11位指数」:储存指数部分 E
 *      第12位到第63位「52位尾数」:储存小数部分(即有效数字)F
 *      注:尾数部分在规约形式下第一位默认为1(省略不写)
 * 
 *   @3 最大安全数字「16位」 Number.MAX_SAFE_INTEGER === Math.pow(2,53)-1
 * 
 *   @4 怎么解决精度问题?
 *      + 将数字转成整数「扩大系数」
 *      + 三方库:Math.js 、decimal.js、big.js ...
 */

// 面试题:自己编写程序,把十进制的“整数”转换为二进制
const decimal2binary = function decimal2binary(decimal) {
    let binary = [],
        negative = decimal < 0,
        integer;
    decimal = Math.abs(decimal);
    integer = Math.floor(decimal / 2);
    binary.unshift(decimal % 2);
    while (integer) {
        binary.unshift(integer % 2);
        integer = Math.floor(integer / 2);
    }
    return `${negative?'-':''}${binary.join('')}`;
};

// 浮点数在计算机底层存储的时候,存储的二进制值可能被舍掉一部分「因为最多只有64位」,所以本身和原来的十进制就不一样了 “精准度问题”
// '0011111110111001100110011001100110011001100110011001100110011010'  0.1
// '0011111111001001100110011001100110011001100110011001100110011010'  0.2
//  0.1 + 0.2 计算机底层会根据其二进制进行处理,最后转换为十进制给浏览器,这样也是一个很长的值 例如:可能是这样的 0.3000000000000400000000... 但是浏览器也会存在长度的限制,会截掉一部分;最后面全是零的省略掉...

// 解决方案:乘以一定的系数,变为整数进行运算,运算的结果再除以系数
// console.log(((0.1 * 10) + (0.2 * 10)) / 10 === 0.3); //=>true

// 获取系数
const coefficient = function coefficient(num) {
    num = num + '';
    let [, char = ''] = num.split('.'),
        len = char.length;
    return Math.pow(10, len);
};

// 求和操作
const plus = function plus(num1, num2) {
    num1 = +num1;
    num2 = +num2;
    if (isNaN(num1) || isNaN(num2)) return NaN;
    let coeffic = Math.max(coefficient(num1), coefficient(num2));
    return (num1 * coeffic + num2 * coeffic) / coeffic;
};

// 三方库:Math.js 、decimal.js、big.js ...

8.函数的底层运行机制

在这里插入图片描述
在这里插入图片描述

/*
 * 函数的运行机制
 */

var x = [12, 23];
function fn(y) {
    y[0] = 100;
    y = [100];
    y[1] = 200;
    console.log(y);
}
fn(x);
console.log(x); 


/* 
let x = 5;
function fn(x) {
    return function (y) {
        console.log(y + (++x));
    }
}
let f = fn(6);
f(7);
fn(8)(9);
f(10);
console.log(x); 
*/


/* 
let a = 0,
    b = 0;
function A(a) {
    A = function (b) {
        alert(a + b++);
    };
    alert(a++);
}
A(1);
A(2); 
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值