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.解决浮点计算精准度丢失问题
/*
* 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);
*/